Process
如何實時監控程序打開的文件?
我知道我可以在我的 Linux 機器上查看
lsof
當時使用的程序的打開文件。watch
但是,程序可以如此快速地打開、更改和關閉文件,以至於在使用標準 shell 腳本(例如)監視它時我將無法看到它,如“在 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
和一些標誌看不到每個系統呼叫?
執行它
strace -e trace=open,openat,close,read,write,connect,accept your-command-here
可能就足夠了。
如果程序可以列印到 stderr,您需要使用該
-o
選項將 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