Я работаю над проектом, связанным с миграцией VM. Иногда образ виртуальной машины будет исчезать, и я просто хочу знать, кто преступник. Я попробовал strace на подозрительных процессах, но напрасно.
Наконец я нашел ответ здесь.
Демон Аудита Linux добьется цели.
sudo auditctl -w /path/to/somefile -p wra
и затем
ausearch -f /path/to/somefile -i
Можно узнать PID процесса, который имеет некоторый файл открытое использование lsof
.
После того как файл закрыт и удален, Вы не можете получить ту информацию.
BTW. Следует иметь в виду, то удаление файла является операцией на каталоге, это находится в, не на самом файле.
Позвольте мне предложить альтернативу с sysdig, поскольку ответы выше стареют. Позвольте дисплею pid
и name
из процессов, которые удаляют файл /tmp/test
. Сначала мы создаем файл с touch /tmp/test
. Затем мы запускаем sysdig
со следующим фильтром:
$ 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)
требует or
отфильтруйте если путь (например. evt.arg.name
) может быть относительным. Обработать обоих unlink
(который звонит unlink(2)
) и rm
(который звонит unlinkat(2)
в его версии GNU), фильтр должен соответствовать обоим syscalls.
sysdig
должен работать, когда процесс удаляет файл. Затем, когда мы выполняем такие команды:
$ unlink /tmp/test
$ touch /tmp/test
$ rm /tmp/test
$ cd /tmp; touch test; rm test
Это будет отображать такой вывод:
11380,unlink
11407,rm
11662,rm
См. sysdig руководство пользователя для объяснения о фильтрации и выводе.
Поскольку фильтр довольно длинен, я нашел удобным записать долото. Это - lua сценарий, который связан с a sysdig
команда:
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
Не стесняйтесь комментировать и улучшать его. Можно поместить lua сценарий в a spy_deletes.lua
файл в каталоге и выполняется sysdig
в этом каталоге для предоставления доступа к долоту доступным. При вводе sudo sysdig -cl
Вы будете видеть его как:
Category: files
---------------
spy_deletes spy file deletion
Теперь можно назвать его:
$ sudo sysdig -c spy_deletes /tmp/test
И в другом терминальном типе:
$ touch test; unlink test
$ touch test; unlink /tmp/test
$ touch test; rm test
$ touch test; rm /tmp/test
Это произведет:
16025 unlink
16033 unlink
16041 rm
16049 rm
unlinkat
фильтр имел бы право быть более точным и только соответствовать полному пути. Это потребовало бы для получения fd каталога, переданного unlinkat(2)
.