Как найти pid процесса, который удалил файл?

Я работаю над проектом, связанным с миграцией VM. Иногда образ виртуальной машины будет исчезать, и я просто хочу знать, кто преступник. Я попробовал strace на подозрительных процессах, но напрасно.

13
задан 15 June 2011 в 01:55

3 ответа

Наконец я нашел ответ здесь.

Демон Аудита Linux добьется цели.

sudo auditctl -w /path/to/somefile -p wra

и затем

ausearch -f /path/to/somefile -i
14
ответ дан 23 November 2019 в 03:20

Можно узнать PID процесса, который имеет некоторый файл открытое использование lsof.

После того как файл закрыт и удален, Вы не можете получить ту информацию.

BTW. Следует иметь в виду, то удаление файла является операцией на каталоге, это находится в, не на самом файле.

1
ответ дан 23 November 2019 в 03:20

Позвольте мне предложить альтернативу с 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).

1
ответ дан 23 November 2019 в 03:20

Другие вопросы по тегам:

Похожие вопросы: