Всем доброе утро, день, вечер, ночь. Наконец-то выходные, и Slack с Mattermost немного подзаткнулись. Сегодня рассмотрим ситуацию, когда ты случайно или специально удалил исполняющийся Bash-скрипт.

Ситуация: у меня в фоне на сервере крутится Bash-скрипт, который отслеживает какие-то процессы. Работает годами, но приходит коллега и случайно или специально зачищает папку /usr/local/sbin. Опа, и скрипта моего больше нет. Мне чё, его заново, что ли, писать? Блядь! Жопа!

Чтобы не попадать в такие ситуации, всегда храни исходники в Git. Соглашусь, что это избыточно, но подложить соломку никогда не будет лишним.

Ладно. Скрипт мой сгинул, в Git я его не положил. Чё делать? Так. Скрипт удалён с диска, но продолжает крутиться в фоне, это уже хорошо. Значит, его можно как-нибудь восстановить. Сейчас покажу как.

Давай создадим подопытный скрипт: touch /tmp/script.sh и закинем в него такое:

#!/bin/bash
sleep 1000
exit

Делаем исполняемым chmod +x /tmp/script.sh и запускаем в фоне: /tmp/script.sh &.

Символ & может служить разделителем между командами command & command: две команды выполнятся параллельно.

Так, скрипт запустили, он крутится у нас в фоне, давай теперь удалим сам файл:

rm -f /tmp/script.sh — ключ -f, то есть force, удалит без лишних вопросов.

Окей. Файл удалили. Как восстановить? Выполняем:

lsof -c 'script.sh'

На экран выкатится портянка, нам нужна строка, где в конце указан путь до скрипта, который был удалён:

COMMAND   PID    USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
script.sh 261899 root  255r REG  8,1    51         130773 /tmp/script.sh

Берём PID = 261899, берём FD = 255 и делаем сальто-мортале:

cat /proc/261899/fd/255

Опачки, что мы видим? Исходник скрипта, который мы удалили:

#!/bin/bash
sleep 1000
exit
Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Копипастим, вставляем, сохраняем и гордимся своими охренительными скиллами.

Почему это возможно? А почему бы и нет! В следующих постах расскажу про общую концепцию удаления файлов в Linux, и всё станет прозрачным.

Про восстановление файлов на диске я как-то ранее уже писал тут, но там была немного другая история, когда мы знаем physical_offset.

Читать:

man 5 proc # /proc/[pid]/fd/
man lsof

Всем хороших выходных и берегите себя!