Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Сколько есть способов восстановить chmod?

Иногда на собеседованиях спрашивают такую задачу, на соображалку: предположим вы случайно сняли права исполнения с команды chmod. Как их восстановить?

Я решил подумать сколько способов исправить эту ситуацию я знаю.

Первый способ — скопировать chmod с соседней машины при помощи scp, sshfs и т. п. Если такая машина имеется, конечно.

Способ второй:

cp /bin/sh ~/chmod2
cat /bin/chmod > ~/chmod2
sudo ~/chmod2 +x /bin/chmod
rm ~/chmod2

Третий способ (при условии, что у вас какой-то дистрибутив, использующий пакеты, у меня способ для Debian):

sudo apt-get --reinstall install `dpkg -S /bin/chmod | cut -f1 -d:`

Способ четвёртый:

gcc -x c - <<CHMOD
#include <sys/stat.h>
main(){chmod("/bin/chmod", S_IXUSR | S_IXGRP | S_IXOTH);}
CHMOD

sudo ./a.out
rm a.out

Кто ещё знает способы?

28 комментариев
astur (astur.net.ru) 2011

Самый дилетантский: грузануться с live-CD и с него запустить `chmod +x /mnt/bin/chmod`

astur (astur.net.ru) 2011

Самый простой: проставить права в mc :)

Евгений Степанищев (bolknote.ru) 2011

Комментарий для astur.net.ru:

Тоже способы :)

Евгений Степанищев (bolknote.ru) 2011

Комментарий для astur.net.ru:

Самый дилетантский: грузануться с live-CD и с него запустить `chmod +x /mnt/bin/chmod`

Тут можно подмонтировать CD и скопировать оттуда chmod.

jankkhvej (jankkhvej.blogspot.com) 2011

Это в каких таких операционках при копировании по ssh сохраняется флаг исполнения?

Евгений Степанищев (bolknote.ru) 2011

Комментарий для jankkhvej.blogspot.com:

А в каких не сохраняется?

dev ~ $ scp bolk@localhost:/bin/chmod /tmp/chmod
bolk@localhost’s password:
chmod 100% 59KB 58.6KB/s 00:00
dev ~ $ ls -l /tmp/chmod
-rwxr-xr-x 1 bolk users 60000 2011-03-04 15:56 /tmp/chmod

jankkhvej (jankkhvej.blogspot.com) 2011

Комментарий для Евгения Степанищева:

А в каких не сохраняется?

ОМГ, это действительно везде.

maxim-zotov (maxim-zotov.livejournal.com) 2011

perl -e ’chmod 0755, «/bin/chmod»’

Евгений Степанищев (bolknote.ru) 2011

Комментарий для maxim-zotov.livejournal.com:

Как-то я забыл, что можно и ещё какими-то языками воспользоваться. :)

python -c ’import os; os.chmod(«chmod», 0755)’

maxim-zotov (maxim-zotov.livejournal.com) 2011

Самый интересный, конечно, второй способ, остроумен, потому что не просто предлагает воспользоваться функцией chmod просто в другом языке или среде (C, perl, php, mc...), а другим принципом присвоения прав, и более надежен, так как вероятность отсутствия сети, компиляторов и интерпретаторов гораздо выше, чем отсутствия cp и cat.

Евгений Степанищев (bolknote.ru) 2011

Комментарий для maxim-zotov.livejournal.com:

Да, я тоже им горжусь больше всего. Собственно, когда я его придумал я и решил написать эту заметку.

zero_sharp 2011

busybox chmod 755 /bin/chmod

Михаил 2011

А можно объяснить нелинуксоиду, зачем первая строчка во втором методе?
Почему нельзя сразу в новый файл chmod скопировать?

astur (astur.net.ru) 2011

Комментарий для Михаил:

Михаил, у нового файла не будет прав на исполнение, то есть chmod2 будет столь же бесполезен, как и исходный chmod. Фишка в том, что права остаются от sh, а содержимое копируется из chmod.

astur (astur.net.ru) 2011

Комментарий для Евгения Степанищева:

В общем, суть поста понятна: есть один гениальный способ и куча очевидных :)

Lynn «Кофеман» (alexeyten.ya.ru) 2011

Всё украдено до нас :-)
http://www.slideshare.net/cog/chmod-x-chmod

Евгений Степанищев (bolknote.ru) 2011

Комментарий для alexeyten.ya.ru:

Фигассе. И даже тоже шелл копируют.

Евгений Степанищев (bolknote.ru) 2011

Комментарий для alexeyten.ya.ru:

Вот это круто:

/lib/ld-linux-x86-64.so.2 /bin/chown +x /bin/chown

Евгений Степанищев (bolknote.ru) 2011

И вот хорошо:

install -m 0777 chmod chmod.new

анонимус 2011

вообще это... раньше было принято ставить на системные файлики специфические аттрибуты ФС, например в этой вашей FreeBSD над системными утилитами это проделывает инсталлятор или скрипты сборки мира — man 1 chflags

В этом вашем линуксе — chattr i /bin/chmod не позволит далее моменять права по неосторожности.
кстати....
lsattr /bin/chmod
-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​e- /bin/chmod

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

Евгений Степанищев (bolknote.ru) 2011

Комментарий для анонимус:

Пост совершенно не об этом. Есть конкретная задача — сброшены права на chmod, надо их восстановить. Как там получилось, совершенно неважно :)

Евгений Степанищев (bolknote.ru) 2011

Комментарий для анонимус:

Ну и да, про расширенные атрибуты я знаю :)

анонимус 2011

Ну и да, про расширенные атрибуты я знаю :)

вот мне самому странно что они не применяются на файлах которые можно считать частью ОС при установке/апгрейде и тд. по определеюию ОС — они и есть ее часть...

librarian (libc6.org) 2011

Нашлось, что можно через mc поставить права нужные.

Евгений Степанищев (bolknote.ru) 2011

Комментарий для libc6.org:

Второй комментарий.

librarian (libc6.org) 2011

Точно, не заметил :)

Евгений Степанищев (bolknote.ru) 2012

Комментарий для Евгения Степанищева:

Ещё придумал:

echo begin 777 chmod2 | uudecode 2>&-
cat /bin/chmod > chmod2
chmod2 +x /bin/chmod
rm chmod2