Вчера вечером я потерял весь свой проект, или, точнее, дерево каталогов с именем f/ которое было в моем домашнем каталоге.

Я восстановил из резервной копии.

Несколько минут назад он снова исчез (к счастью для меня, с тех пор я начинал резервное копирование с каждой перестройкой и часто перестраиваюсь, так что на этот раз без потерь). Я не знаю ни одного исполняемого файла, который мог бы запустить или написать сам, который мог бы сделать это.

Поскольку проблема, похоже, изолирована от ~/f/ , я думаю, что это какой-то глючный скрипт, который хотел сделать rm -rf и вместо этого сделал rm -r f .

Как я могу найти виновника?

1 ответ1

1

Предполагая, что rm действительно задействован и это /bin/rm:

  1. sudo ln /bin/rm /bin/rm-real
  2. Создайте каталог журналов, доступный для записи любому:

    mkdir /tmp/rm-logdir
    chmod a+w /tmp/rm-logdir
    
  3. Напишите скрипт-обертку (именованный script) следующим образом:

    #!/bin/sh
    pstree -spa "$$" >> "/tmp/rm-logdir/$$"
    exec /bin/rm-real "$@"
    
  4. Отрегулируйте владение и права доступа к сценарию, чтобы он мог имитировать rm (быстрый способ, отличный от POSIX: chmod --reference=/bin/rm script; sudo chown --reference=/bin/rm script).

  5. Замените /bin/rm скриптом:

    sudo mv script /bin/rm
    

    Отныне все, что вызывает /bin/rm будет записываться в файл в /tmp/rm-logdir .

  6. Подождите, пока проблема не возникнет снова.

  7. Проверьте файлы в /tmp/rm-logdir . Надеемся, что один из них будет содержать что-то вроде этого:

    systemd,1
      `-tmux: server,2652
          `-bash,8605
              `-rm,15100 /bin/rm -r f
                  `-pstree,15101 -spa 15100
    

    с аргументами командной строки и PID; обратите внимание на последнюю, но одну строку. Выше приведен пример из моих тестов в Kubuntu, где я запускаю rm -r f в интерактивном bash . Другой пример (не вызванный мной непосредственно) был:

    systemd,1
      `-kdeinit5,1679
          `-ksmserver,1700
              `-rm,16400 /bin/rm /home/kamil/.config/session/kate_10d8d5de64000154299531000000017000020_1542995310_707537
                  `-pstree,16401 -spa 16400
    

    Это доказывает, что другие инструменты (в данном случае ksmserver) используют скрипт-обертку.

Заметки:

  • pstree не требуется POSIX, он может быть недоступен. Вы можете использовать ps , вы можете читать информацию непосредственно из /proc .
  • В многопользовательской среде решение не безопасно. Любой может написать в каталог журналов. Это специально сделано для того, чтобы лениво, быстро и грязно захватывать чьи-либо вызовы rm . Но тогда любой может подделать результаты.

Вернуться:

sudo mv /bin/rm-real /bin/rm

(обратите внимание, что сценарий будет перезаписан, поэтому, если другой копии нет, сам сценарий будет потерян).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .