명령이 액세스하는 파일을 정확히 알 수 있는 방법이 있습니까?

명령이 액세스하는 파일을 정확히 알 수 있는 방법이 있습니까?

저는 실행된 특정 프로세스에서 어떤 파일과 리소스에 액세스하고 있는지 알아야 하는 소프트웨어를 개발 중입니다.

모든 스크립트, 애플리케이션, 데몬이 액세스하는 내용을 추적하려는 것이 아니라 사용자가 제공하는 특정 프로세스만 추적하려고 합니다.

Python(또는 다른 언어)에서 이를 수행할 수 있는 방법이 있습니까? 나는 내 자신의 몇 가지 조사를 할 예정이며, 이런 종류의 일에 대해 알고 더 많은 설명을 제공할 수 있는 지식이 풍부한 사용자가 있을 경우 여기에 물어보고 싶다고 생각했습니다.

답변1

추적할 수 있습니다시스템 호출프로그램으로 제작되었습니다. 이는 액세스하는 파일을 찾는 일반적인 방법입니다. 이를 수행하는 도구를 이라고 합니다.truss많은 유닉스 시스템에서는dtrussOSX에서는strace리눅스에서. 여기서는 Linux 사용법을 설명하겠습니다. 다른 시스템의 설명서를 확인하세요.

가장 간단한 형태는

strace myprogram arg1 arg2

그러면 에 의해 수행된 모든 시스템 호출의 로그가 인쇄됩니다 myprogram. (.) 로그를 파일에 저장하려면 옵션을 사용하십시오 -o. 하위 프로세스의 호출도 기록하려면 옵션을 사용하십시오 -f. 기록되는 시스템 호출을 선택하려면 options 를 사용하십시오 -e. 사용할 수 있는 매개변수에 대한 자세한 내용은 설명서를 참조하세요 -e. 예를 들어 다음 호출은 read및 를 제외한 파일 관련 시스템 호출(열기 및 닫기, 디렉터리 목록 등)을 기록합니다 write.

strace -e'file,!read,!write' -o /tmp/myprogram.log -f myprogram arg1 arg2

답변2

~에 따르면이 게시물, 파이썬에서 사용할 수 있습니다프수틸기준 치수. Python에만 국한되지 않는다면라소프그리고스트레스이 목적으로 가장 일반적으로 사용되는 두 가지 명령줄 유틸리티는 다음과 같습니다.

답변3

완전히 신뢰할 수 있는 유일한 방법은 시스템 호출을 추적하는 것입니다. strace@gowenfawr이 언급한 이 프로그램은 이를 올바르게 수행하며 ptrace(2)시스템 호출 측면에서도 그렇게 합니다. 그러나 이 ptrace호출은 올바르게 사용하기 어렵다는 점에 유의하십시오 . strace -e open직접 사용할 수 없는 경우 두 번째 방법을 고려해 볼 수 있습니다.

open대부분의 프로세스에서는 C 라이브러리 함수에 대한 호출을 가로채서 이를 수행할 수 있습니다 LD_PRELOAD. 이것은하찮은그러나 적대적인 C 프로그램에서는 이를 피할 수 있지만 프로그램 자체가 시스템 호출을 수행하지 않는다고 신뢰한다면 프로그래밍하는 것보다 구현하는 것이 더 간단합니다 ptrace.

고급 언어(예: Python)로 작성된 프로세스의 경우 고급 open호출을 가로챌 수 있지만 언어가 이러한 가로채기를 지원하도록 설계되지 않은 한 이는 C 수준 호출을 가로채는 것보다 더 어려울 수 있습니다( 파이썬은 그렇지 않습니다).

마지막으로 위의 모든 단락에서는 파일이 사용된다고 가정합니다 . 이는 부모로부터 상속된 보조 데이터 및 파일 설명자 open와 마찬가지로 항상 올바른 것은 아닙니다 .openatopen64recvmsg

관련 정보