Всем доброе утро, день, вечер, ночь. Наконец-то выходные и слак с моттермостом немного подзаткнулись. Сегодня рассмотрим ситуацию, когда ты случайно/специально удалил исполняющийся 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



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



File: /proc/261899/fd/255

#!/bin/bash

sleep 1000

exit



Копипастим, вставляем, сохраняем и гордимся своими охренительными скиллами.



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



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



☑️ читать:

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

man lsof



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



tags: #linux #bash



💩 @bashdays