열린 프로세스 파일을 실시간으로 어떻게 모니터링합니까? 프로세스는 파일을 너무 빨리 열고 변경하고

Linux 시스템 lsof 에서 해당 시점에 프로세스의 열린 파일을 볼 수 있다는 것을 알고 있습니다 . 그러나 프로세스는 파일을 너무 빨리 열고 변경하고 닫을 수 있으므로 “리눅스에서 열린 프로세스 파일 모니터링 (실시간)”에watch 설명 된대로 표준 쉘 스크립팅을 사용하여 파일을 모니터링 할 때 파일을 볼 수 없습니다 (예 :). .

따라서 프로세스를 감사하는 간단한 방법을 찾고 있으며 시간이 지남에 따라 수행 한 작업을 확인합니다. 감사를 시작하지 않고 프로세스를 실행하기 전에 어떤 네트워크 연결을 시도하고 감사를 시작해야하는지 확인하는 것이 좋습니다.

이상적으로, 나는 이것을하고 싶습니다 :

sh $ audit-lsof /path/to/executable
4530.848254 OPEN  read  /etc/myconfig
4530.848260 OPEN  write /var/log/mylog.log
4540.345986 OPEN  read  /home/gert/.ssh/id_rsa          <-- suspicious
4540.650345 OPEN  socket TCP ::1:34895 -> 1.2.3.4:80    |
[...]
4541.023485 CLOSE       /home/gert/.ssh/id_rsa          <-- would have missed
4541.023485 CLOSE socket TCP ::1:34895 -> 1.2.3.4:80    |   this when polling

strace모든 시스템 호출을 보지 못하고 일부 플래그를 사용하여 이것이 가능 합니까?



답변

와 함께 실행

strace -e trace=open,close,read,write,connect,accept your-command-here

아마 충분할 것입니다.

-o프로세스가 stderr로 인쇄 할 수있는 경우 콘솔 이외의 다른 곳에 strace의 출력을 배치 하려면이 옵션 을 사용해야합니다 . 프로세스가 분기되면 -f또는 도 필요합니다 -ff.

아, 그리고 당신도 원할지도 모른다 -t. 그래서 당신은 언제 전화가 갔는지 볼 수있다 .


프로세스가 수행하는 작업에 따라 함수 호출 목록을 조정해야 할 수도 있습니다 getdents. 예를 들어 ls다음을 사용하여 더 나은 샘플을 얻으려면 추가해야했습니다 .

$ strace -t -e trace=open,close,read,getdents,write,connect,accept ls >/dev/null
...
09:34:48 open("/etc/ld.so.cache", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open("/lib64/libselinux.so.1", O_RDONLY) = 3
09:34:48 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@V\0\0\0\0\0\0"..., 832) = 832
09:34:48 close(3)                       = 0
...
09:34:48 open("/proc/filesystems", O_RDONLY) = 3
09:34:48 read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 366
09:34:48 read(3, "", 1024)              = 0
09:34:48 close(3)                       = 0
09:34:48 open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
09:34:48 getdents(3, /* 5 entries */, 32768) = 144
09:34:48 getdents(3, /* 0 entries */, 32768) = 0
09:34:48 close(3)                       = 0
09:34:48 write(1, "file-A\nfile-B\nfile-C\n", 21) = 21
09:34:48 close(1)                       = 0
09:34:48 close(2)                       = 0