프로세스에서 열린 파일을 실시간으로 모니터링하는 방법은 무엇입니까?

프로세스에서 열린 파일을 실시간으로 모니터링하는 방법은 무엇입니까?

나는 다음을 사용하여 프로세스의 열린 파일을 볼 수 있다는 것을 알고 있습니다.lsof 그 순간내 Linux 컴퓨터에서. 그러나 프로세스는 파일을 너무 빨리 열고 변경하고 닫을 수 있으므로 표준 쉘 스크립트(예:) watch를 사용하여 모니터링할 때 볼 수 없습니다."Linux에서 열린 프로세스 파일 모니터링(실시간)".

그래서 저는 프로세스를 감사하고 시간이 지남에 따라 어떤 일이 일어나는지 확인하는 간단한 방법을 찾고 있는 것 같습니다. 프로세스가 감사를 시작하지 않고 실행되기 전에 어떤 네트워크 연결이 감사를 설정하고 시작하는지 확인할 수 있다면 좋을 것입니다.

이상적으로는 다음을 수행하고 싶습니다.

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모든 시스템 호출을 보지 않는 데 사용할 수 있는 플래그가 있습니까 ?

답변1

실행해

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

그거면 충분할 것 같아요.

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

아, 당신 -t도 그러고 싶을지도 모르죠.언제전화가 왔습니다.


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

$ strace -t -e trace=open,openat,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

관련 정보