어떤 프로그램이나 스크립트가 특정 파일을 생성했는지 알아내는 것이 가능합니까?

어떤 프로그램이나 스크립트가 특정 파일을 생성했는지 알아내는 것이 가능합니까?

"client_state.xml", "lockfile" 및 "time_stats_log"라는 세 개의 파일이 내 홈 디렉토리에 갑자기 나타났습니다. 마지막 두 개는 비어 있습니다. 그들이 어떻게 거기까지 왔는지 궁금해요. 이런 일이 처음 발생한 것은 아니지만, 마지막으로 파일을 손상이나 불만 없이 삭제한 것은 몇 주 전이었습니다. 내가 무엇을 하고 있었는지 기억이 나지 않습니다 stat $filename. 그들이 어디서 왔는지 알아낼 수 있는 방법이 있나요?

또는 기본 디렉터리(하위 디렉터리 제외)에서 파일 생성을 모니터링하는 방법이 있습니까?

답변1

파일 시스템에 액세스하여 파일 시스템에서 일어나는 모든 일을 관찰할 수 있습니다.로깅 파일 시스템. 이것은스택 파일 시스템디렉토리 트리에 모든 액세스를 기록합니다.

loggedfs -l /var/tmp/$USER-home-fs.log ~

그러나 전체 홈 디렉터리를 기록하면 시스템 속도가 느려질 수 있습니다. 당신은 적어도 하나를 쓰고 싶을 것입니다구성 파일그리고 엄격한 필터링을 거칩니다.

루트 액세스 권한이 있으면 Linux에서 다음을 사용할 수 있습니다.감사 하위 시스템파일 시스템 액세스를 포함하여 많은 내용을 기록합니다. 데몬이 시작되었는지 확인한 auditd다음 기록할 내용을 구성하세요.auditctl. 기록된 모든 작업은 기록됩니다 /var/log/audit/audit.log(일반적인 배포판에서). 특정 파일 시청을 시작하려면:

auditctl -w /path/to/file

또는 긴 형식

auditctl -a exit,always -F path=/path/to/file

-w또는 를 사용하여 디렉터리를 감시하면 -F dir=해당 디렉터리와 해당 하위 디렉터리의 파일도 재귀적으로 감시됩니다.

답변2

판단할 방법이 없다고 생각해요어떤 프로그램이 만들어졌나하나의 문서.

대체 질문: 당신할 수 있는그러나 inotify. 을 사용하면 inotifywait하위 시스템의 명령줄 인터페이스가 홈 디렉터리에서 이벤트를 찾도록 inotify지시할 수 있습니다 .create

$ (sleep 5; touch ~/making-a-test-file) &
[1] 22526

$ inotifywait -e create ~/
Setting up watches.
Watches established.
/home/mmrozek/ CREATE making-a-test-file

-m첫 번째 이벤트를 본 후에 종료하지 않도록 지시하는 (모니터)를 사용하여 실행하고 싶을 수도 있습니다.

답변3

나는 이것이 오래된 질문이라는 것을 알고 있지만 누군가가 유용하다고 생각할 경우를 대비해 다른 접근 방식을 제안하겠습니다. 원래는 속은 질문에 대한 답변으로 이 글을 올렸습니다.

sysdig한 가지 옵션은 오픈 소스 시스템 모니터링 애플리케이션을 사용하는 것입니다 . 이를 사용하면 파일 활동을 이름별로 모니터링할 수 있습니다. 어떤 프로세스가 다음 이름의 파일을 생성하는지 확인하고 싶다고 가정해 보겠습니다 /tmp/example.txt.

# sysdig fd.name=/tmp/example.txt
567335 16:18:39.654437223 0 touch (5470) < openat fd=3(<f>/tmp/example.txt) dirfd=-100(AT_FDCWD) name=/tmp/example.txt flags=70(O_NONBLOCK|O_CREAT|O_WRONLY) mode=0666
567336 16:18:39.654438248 0 touch (5470) > dup fd=3(<f>/tmp/example.txt)
567337 16:18:39.654438592 0 touch (5470) < dup res=0(<f>/tmp/example.txt)
567338 16:18:39.654439629 0 touch (5470) > close fd=3(<f>/tmp/example.txt)
567339 16:18:39.654439764 0 touch (5470) < close res=0
567342 16:18:39.654441958 0 touch (5470) > close fd=0(<f>/tmp/example.txt)
567343 16:18:39.654442111 0 touch (5470) < close res=0

이 출력에서 ​​pid 5470이라는 프로세스에 touch파일이 열려 있음을 알 수 있습니다.

더 많은 정보를 원할 경우 시스템 호출 추적을 수집하는 "캡처 모드"에서 실행할 수 있습니다.

# sysdig -w /tmp/dumpfile.scap

그런 다음 파일이 생성될 때까지 기다린 다음 중지 sysdig하고 실행합니다.

# csysdig -r /tmp/dumpfile.scap

이렇게 하면 일어나는 모든 일을 탐색할 수 있습니다. 을 누르고 <F2>선택하고 파일 이름 검색을 Files누른 <F4>다음 <F6>"dig"를 누르십시오(위 명령과 유사한 출력이 표시됩니다). 이렇게 하면 동일한 방법을 사용하여 실제로 파일을 생성한 프로세스에 대한 정보를 찾을 수 있습니다.

원하는 경우 이라는 GUI 버전이 있습니다 csysdig.sysdig-inspect

답변4

아직 그런 것이 없으므로 inotify파일을 반복하는 스크립트를 작성할 수 있습니다.

#!/bin/sh

while [ true ]; do                     # Run for as long as nessesary
  if [ -f /path/to/file ]; then        # If fileexists
    echo "Found file"                  # Notify and stop monitoring
    exit 0
  fi
  sleep 5                             # Else wait 5 secs
done

관련 정보