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