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

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

저는 실행된 특정 프로세스가 어떤 파일과 리소스에 액세스하는지 알아야 하는 소프트웨어를 작업하고 있습니다.

모든 단일 스크립트, 응용 프로그램 및 데몬이 액세스하는 항목을 추적하려는 것이 아니라 사용자가 제공하는 특정 프로세스만 추적할 계획입니다.

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

답변1

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

가장 간단한 형태는

strace myprogram arg1 arg2

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

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

답변2

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

답변3

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

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

Python과 같은 상위 수준 언어로 작성된 프로세스의 경우 대신 상위 수준 open호출을 가로챌 수 있지만 언어가 지원하도록 설계되지 않은 한 이는 C 수준 호출을 가로채는 것보다 더 어려울 수 있습니다. 그러한 차단(파이썬은 그렇지 않습니다).

마지막으로 위의 모든 단락은 파일이 open. 이것이 항상 사실인 것은 아니며, openat보조 데이터 및 상위로부터 상속된 파일 설명자도 있습니다 .open64recvmsg

관련 정보