Bagaimana cara saya memonitor file yang dibuka dari suatu proses secara realtime?

41

Saya tahu saya dapat melihat file terbuka dari suatu proses menggunakan lsof pada saat itu di mesin Linux saya. Namun, suatu proses dapat membuka, mengubah, dan menutup file dengan sangat cepat sehingga saya tidak akan dapat melihatnya ketika memantau menggunakan skrip shell standar (misalnya watch) seperti yang dijelaskan dalam "monitor file proses terbuka di linux (real-time)" .

Jadi, saya pikir saya sedang mencari cara sederhana untuk mengaudit suatu proses dan melihat apa yang telah dilakukannya dari waktu ke waktu. Akan lebih bagus jika juga memungkinkan untuk melihat koneksi jaringan apa yang dibuatnya (mencoba) dan agar audit dimulai sebelum proses mendapat waktu untuk berjalan tanpa audit dimulai.

Idealnya, saya ingin melakukan ini:

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

Apakah ini mungkin menggunakan stracedan beberapa bendera untuk tidak melihat setiap panggilan sistem?

gertvdijk
sumber

Jawaban:

50

Menjalankannya dengan

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

mungkin akan cukup.

Anda harus menggunakan -oopsi untuk menempatkan keluaran strace di tempat lain selain konsol, jika prosesnya dapat mencetak ke stderr. Jika proses Anda bercabang, Anda juga perlu -fatau -ff.

Oh, dan Anda mungkin juga ingin -t, sehingga Anda dapat melihat kapan panggilan terjadi.


Catatan, Anda mungkin perlu mengubah daftar panggilan fungsi tergantung pada apa proses Anda - saya perlu menambahkan getdentsmisalnya, untuk mendapatkan sampel yang lebih baik menggunakan 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
Tak berguna
sumber
1
Itu masuk ke arah yang benar, terima kasih! Ingin keluaran yang lebih ramah pengguna, tetapi berhasil. Saya mungkin meluangkan waktu untuk menulis alat dengan antarmuka yang lebih populer untuk ini. Saya berharap alat berbasis ncurses atau 'top' seperti akan ada untuk memeriksa tindakan biner real-time.
gertvdijk
Bagaimana Anda ingin terlihat? Mungkin memungkinkan untuk mengubah output strace menjadi sesuatu yang lebih ramah.
berguna
Anda pasti ingin menggunakan -ountuk mendorong output ke file. Kemudian Anda dapat berjalan tail -F strace.outputdi terminal lain untuk mendapatkan pembaruan "langsung".
peterph
4
Anda juga dapat melampirkan straceke proses yang berjalan dengan -p PIDopsi.
Frank Breitling
Tambahkan -yke "[p] rints path yang terkait dengan argumen deskriptor file"
ricab