Представьте, что вы управляете веб-сервером, root-доступ к которому имеют еще несколько человек. Кому-то из них в голову приходит "превосходная" идея выполнить команду "chmod -x /bin/chmod". Как теперь вернуть все на свои места без использования интернета?
Правильные ответы
Если пакет coreutils остался в кэше apt, его можно переустановить:
$ sudo apt-get install --reinstall coreutils
Также можно использовать различные реализации chmod в скриптовых языках программирования:
$ perl -e ‘chmod 0755, “chmod”’
$ python -c "import os;os.chmod('/bin/chmod', 0777)"
$ node.js: require("fs").chmodSync("/bin/chmod", 0755);
Либо написать новый chmod на Си и скомпилировать его:
$ cat - > chmod.c
int main () { }
^D
$ cc chmod.c
$ cat /bin/chmod > a.out
$ cat chmod > new_chmod
$ cat - > restore_chmod.c
#include <sys/types.h>
#include <sys/stat.h>
int main () {
chmod( "/bin/chmod", 0000777 );
}
^D
$ cc restore_chmod.c
$ ./a.out
Можно использовать BusyBox, который имеет свою версию chmod в составе
$ busybox chmod +x /bin/chmod
Или использовать GNU tar:
$ tar --mode 0777 -cf chmod.tar /bin/chmod
$ tar xvf chmod.tar
$ tar --mode 555 -cvf - chmod | tar xvf -
$ tar -cvf chmod.tar chmod
Так же вы можете воспользоваться соседней машиной и выполнить такую команду:
$ tar --preserve-permissions -cf chmod.tar chmod
Затем передать файл на локальную машину и распаковать chmod:
$ tar xvf chmod.tar
Также вы можете запаковать chmod в cpio-архив, а затем исправить заголовок архива изменив права доступа к файлу (они хранятся в байтах с 19 по 24 архива:
$ echo chmod | cpio -o |\
perl -pe 's/^(.{21}).../${1}755/' | cpio -i -u
Вы можете использовать линкер для запуска команды:
$ alias chmod='/lib/ld-2.11.1.so ./chmod'
$ /lib/ld-linux.so.2 /bin/chmod +x /bin/chmod
Используйте Emacs:
Ctrl+x b > *scratch*
(set-file-modes "/bin/chmod" (string-to-number "0755" 8))
Ctrl+j
Ваша работа или увлечение связаны freebsd? Тогда загляните на форум программистов и сисадминов cyberforum.ru. Здесь вы сможете задать любой вопрос по теме установки, настройки и администрирования этой ОС.
Самый простой вариант - запуск через линкер. Но там во-первых непонятно зачем приведён alias (это вроде как одноразовая операция) и во-вторых опечатка: chown вместо chmod.
Там два возможных варианта. Первый - использовать alias для эмуляции команды chmod, второй - один раз использовать линкер для установки бита исполнения. Понятно, что первый вариант чистый воды маразм, но тут большинство вариантов решения такие :) Опечатку исправил, спасибо.
Сдается мне, скопировать содержимое chmod-а в файл, уже имеющий +x будет попроще: mv chmod{,.bak} && cp cp chmod && cat chmod.bak > chmod