나는 다음을 사용하여 프로세스의 열린 파일을 볼 수 있다는 것을 알고 있습니다.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