Сколько есть способов восстановить 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
Кто ещё знает способы?
4 марта 2011 13:30

astur (astur.net.ru)
4 марта 2011, 14:16

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

astur (astur.net.ru)
4 марта 2011, 14:18

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

bolk (bolknote.ru)
4 марта 2011, 14:20, ответ предназначен astur (astur.net.ru):

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

bolk (bolknote.ru)
4 марта 2011, 14:21, ответ предназначен astur (astur.net.ru):

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

jankkhvej (jankkhvej.blogspot.com)
4 марта 2011, 14:44

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

bolk (bolknote.ru)
4 марта 2011, 14:57, ответ предназначен jankkhvej (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)
4 марта 2011, 15:03, ответ предназначен bolk (bolknote.ru):

А в каких не сохраняется?
ОМГ, это действительно везде.

maxim-zotov (maxim-zotov.livejournal.com)
4 марта 2011, 15:07

perl -e 'chmod 0755, "/bin/chmod"'

bolk (bolknote.ru)
4 марта 2011, 15:16, ответ предназначен maxim-zotov (maxim-zotov.livejournal.com):

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

python -c 'import os; os.chmod("chmod", 0755)'

maxim-zotov (maxim-zotov.livejournal.com)
4 марта 2011, 15:29

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

bolk (bolknote.ru)
4 марта 2011, 15:35, ответ предназначен maxim-zotov (maxim-zotov.livejournal.com):

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

zero_sharp (инкогнито)
4 марта 2011, 15:35

busybox chmod 755 /bin/chmod

Михаил (инкогнито)
4 марта 2011, 15:53

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

astur (astur.net.ru)
4 марта 2011, 16:19, ответ предназначен Михаилу

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

astur (astur.net.ru)
4 марта 2011, 16:20, ответ предназначен bolk (bolknote.ru):

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

Lynn «Кофеман» (alexeyten.ya.ru)
4 марта 2011, 18:56

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

bolk (bolknote.ru)
4 марта 2011, 19:07, ответ предназначен Lynn «Кофеман» (alexeyten.ya.ru):

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

bolk (bolknote.ru)
4 марта 2011, 19:08, ответ предназначен Lynn «Кофеман» (alexeyten.ya.ru):

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

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

bolk (bolknote.ru)
4 марта 2011, 19:09

И вот хорошо:

install -m 0777 chmod chmod.new

анонимус (инкогнито)
5 марта 2011, 00:15

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

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

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

bolk (bolknote.ru)
5 марта 2011, 00:38, ответ предназначен анонимусу

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

bolk (bolknote.ru)
5 марта 2011, 00:39, ответ предназначен анонимусу

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

анонимус (инкогнито)
10 марта 2011, 02:46

Ну и да, про расширенные атрибуты я знаю :)
вот мне самому странно что они не применяются на файлах которые можно считать частью ОС при установке/апгрейде и тд. по определеюию ОС - они и есть ее часть...

librarian (libc6.org)
11 марта 2011, 10:35

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

bolk (bolknote.ru)
11 марта 2011, 14:04, ответ предназначен librarian (libc6.org):

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

librarian (libc6.org)
11 марта 2011, 14:54

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

zero_sharp (инкогнито)
30 марта 2011, 00:00

По мотивам: http://groups.google.com/group/alt.sysadmin.recovery/msg/777b3992c628410a?pli=1

bolk (bolknote.ru)
12 сентября 2012, 10:45

Ещё придумал:
echo begin 777 chmod2 | uudecode 2>&-
cat /bin/chmod > chmod2
chmod2 +x /bin/chmod
rm chmod2

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)