На днях в комментариях зашёл разговор о ситуации, когда с утилиты chmod сняли бит исполнения. Эта утилита как раз предназначена для того, чтобы этот бит ставить. Теоретически получается тупиковая ситуация. Это, кстати, отличная безобидная шутка для начинающего Linux админа:
# chmod -x chmod
К сожалению, сейчас решение очень легко находится через поиск. А вот когда-то давно это могло стать хорошим испытанием на сообразительность. Выходов из сложившейся ситуации много. Вот несколько примеров:
1️⃣ Используем утилиту setfacl. По умолчанию её может не быть в системе, но не проблема установить.
# setfacl -m u::rwx,g::rx,o::x /usr/bin/chmod
2️⃣ Можно запустить утилиту chmod, передав её явно динамическому компоновщику. В контексте данной заметки считайте компоновщик интерпретатором для программы chmod. В разных дистрибутивах он может иметь разное название и расположение. Пример для Debian 11:
# /usr/lib64/ld-linux-x86-64.so.2 /usr/bin/chmod +x /usr/bin/chmod
3️⃣ Можно скопировать права с любого исполняемого файла и записать содержимое утилиты chmod в этот файл. Получается рабочая копия chmod.
Создаём пустой файл с правами утилиты ls.
# cp --attributes-only /usr/bin/ls ./new_chmod
Копируем содержимое утилиты chmod в созданный файл:
# cat /usr/bin/chmod > ./new_chmod
Можно использовать:
# ./new_chmod +x /usr/bin/chmod
4️⃣ Почти то же самое что и предыдущий вариант только проще:
# install -m 755 /usr/bin/chmod ./new_chmod
или так:
# rsync --chmod=ugo+x /usr/bin/chmod ./new_chmod
5️⃣ Если умеете программировать на какой-то языке, то можно с его помощью вернуть бит исполнения. Пример с python:
python -c "import os;os.chmod('/usr/bin/chmod', 0755)"
Если знаете ещё какие-то интересные и необычные решения данной проблемы, делитесь в комментариях.
#terminal #linux #юмор