Saya sedang mengerjakan proyek yang berkaitan dengan migrasi VM. Terkadang gambar VM akan hilang dan saya hanya ingin tahu siapa pelakunya. Saya mencoba strace pada proses yang mencurigakan tetapi tidak berhasil.
Saya sedang mengerjakan proyek yang berkaitan dengan migrasi VM. Terkadang gambar VM akan hilang dan saya hanya ingin tahu siapa pelakunya. Saya mencoba strace pada proses yang mencurigakan tetapi tidak berhasil.
Jawaban:
Akhirnya saya menemukan jawabannya di sini .
Daemon Audit Linux akan melakukan triknya.
sudo auditctl -w /path/to/somefile -p wra
lalu
ausearch -f /path/to/somefile -i
Anda dapat mengetahui PID suatu proses, yang menggunakan beberapa file terbuka lsof.
Setelah file ditutup dan dihapus, Anda tidak dapat memperoleh informasi itu.
BTW. Perlu diingat, bahwa menghapus file adalah operasi pada direktori, bukan pada file itu sendiri.
Izinkan saya menyarankan alternatif dengan sysdig karena jawaban di atas sudah menua. Biarkan menampilkan piddan nameproses yang menghapus file /tmp/test. Pertama kita membuat file dengan touch /tmp/test. Kemudian kita mulai sysdigdengan filter berikut:
$ sudo sysdig -p'%proc.pid,%proc.name' '(evt.type=unlinkat and (evt.arg.name=test or evt.arg.name=/tmp/test)) or (evt.type=unlink and evt.arg.path=/tmp/test)'
unlinkat(2)membutuhkan orfilter jika jalur (mis. evt.arg.name) mungkin relatif . Untuk menangani keduanya unlink(panggilan mana unlink(2)) dan rm(panggilan mana unlinkat(2)dalam versi GNU-nya), filter harus cocok dengan kedua syscall.
sysdigharus berjalan ketika suatu proses menghapus file. Lalu ketika kita menjalankan perintah seperti itu:
$ unlink /tmp/test
$ touch /tmp/test
$ rm /tmp/test
$ cd /tmp; touch test; rm test
Ini akan menampilkan output seperti itu:
11380,unlink
11407,rm
11662,rm
Silakan merujuk ke panduan pengguna sysdig untuk penjelasan tentang pemfilteran dan keluaran.
Karena saringannya cukup panjang, saya merasa nyaman untuk menulis pahat. Ini adalah skrip lua yang dikaitkan dengan sysdigperintah:
description = "displays processes that delete a file"
short_description = "spy file deletion"
category = "files"
args =
{
{
name = "path",
description = "the path of the file to monitor",
argtype = "string"
},
}
function on_set_arg(name, val)
path = val
return true
end
function on_init()
local filename = path
for i in string.gmatch(path, "[^/]+") do
filename = i
end
chisel.set_event_formatter("%proc.pid\t%proc.name")
chisel.set_filter(
"(evt.type=unlinkat and (evt.arg.name=" .. path .. " or \
evt.arg.name=" .. filename .. ")) or \
(evt.type=unlink and evt.arg.path=" .. path .. ")")
return true
end
Jangan ragu untuk berkomentar dan memperbaikinya. Anda dapat meletakkan skrip lua dalam spy_deletes.luafile di dalam direktori dan mengeksekusi sysdigdi direktori ini untuk membuat pahat tersedia. Saat mengetik sudo sysdig -clAnda akan melihatnya sebagai:
Category: files
---------------
spy_deletes spy file deletion
Sekarang Anda bisa menyebutnya:
$ sudo sysdig -c spy_deletes /tmp/test
Dan dalam jenis terminal lain:
$ touch test; unlink test
$ touch test; unlink /tmp/test
$ touch test; rm test
$ touch test; rm /tmp/test
Ini akan menampilkan:
16025 unlink
16033 unlink
16041 rm
16049 rm
The unlinkatFilter akan layak untuk menjadi lebih akurat dan hanya cocok dengan path absolut. Ini akan membutuhkan untuk mengambil fd dari direktori yang dilewati unlinkat(2).
rm /tmp/testdi terminal lain. Saya mengedit jawaban saya untuk membuatnya lebih jelas.