Я только что сделал chmod -x chmod

Ответы:

43

В Linux:

/lib/ld-linux.so.2 /bin/chmod +x /bin/chmod

http://www.slideshare.net/cog/chmod-x-chmod

bindbn
источник
bindbn, я собирался опубликовать ту же ссылку :-), но я читал сам, поскольку я новичок в материалах Unix / Linux!
Рихатум
2
На 64-битном дистрибутиве вы можете использовать /lib64/ld-linux-x86-64.so.2вместо этого. ldd /bin/chmodдолжен точно указать, какой компоновщик запустить.
goldPseudo 11.10.10
Я бы написал минимальную программу, которая использует chmod (2), но это круче
adamo
1
@Stefan: From man ld-linux.so: «ld.so [и ld-linux.so] загружает общие библиотеки, необходимые программе, подготавливает программу к запуску и затем запускает ее». ( ld.soдля a.outформатируемых исполняемых файлов и ld-linux.soдля формата ELF.)
Приостановлено до дальнейшего уведомления.
1
@Stefan: Ядро на самом деле не знает, как загружать и выполнять динамически связанные исполняемые файлы, потому что оно очень сложное и следует glibc, а не ядру. ld-linux.soявляется своего рода гибридом исполняемых файлов / библиотек, является статически связанным, работает в пользовательском пространстве и отвечает за загрузку динамически связанных исполняемых файлов и всех их зависимостей, а затем их запуск.
Джулиано
18

Используйте Python:

# python
Python> import os
Python> os.chmod("/bin/chmod",0755)
Дуглас Лидер
источник
4
И, как один вкладыш:python -c "import os; os.chmod('/bin/chmod', 0755)"
Танатос
18

Это основывается на том факте, что права доступа к файлу назначения сохраняются, а не к исходному файлу при его копировании. Мы «заимствуем» разрешения ls:

cp /bin/ls /tmp/chmod.tmp
cp /bin/chmod /tmp/chmod.tmp
mv /tmp/chmod.tmp /bin/chmod
Приостановлено до дальнейшего уведомления.
источник
Я думаю, что ваш первый cpдолжен иметь флаг -p
Riking
@Riking: для этого не нужно.
Приостановлено до дальнейшего уведомления.
Это было похоже на решение, которое я придумал, но после cpзапуска исполняемого файла я просто catпоместил содержимое chmodво временный файл.
SpellingD
9

Использование Perl:

% perl -e 'chmod 0755, qw[/bin/chmod]'
Альнитак
источник
7

setfacl -m u::rx /bin/chmod

... предоставит владельцу разрешения на выполнение.

Но /lib/ld-linux.so.2уловка аккуратна. :)

Кайл Брантли
источник
5

Это странно ... Я видел что-то подобное несколько дней назад через чей-то твит ...

http://www.slideshare.net/cog/chmod-x-chmod

ThatGraemeGuy
источник
Ссылки на другие сайты бесполезны, так как в какой-то момент ссылка станет неработающей. Это все равно что сказать кому-то, чтобы гуглить ответ.
Фил Ханнент
@Phil Hannent: Я тоже видел это слайд-шоу всего три дня назад, так что это была моя первая мысль, был ли ОП одним из претендентов.
Болдевин
То же самое, только что видел это на Reddit несколько дней назад ...
Dentrasi 11.10.10
4

Если вы находитесь в системе, которая /bin/chmodне может быть загружена динамическим компоновщиком:

# /bin/mv /bin/chmod /bin/chmod.tmp
# install -p -m 755 /bin/chmod.tmp /bin/chmod

Это работает в моей системе MacOS X.

Альнитак
источник
2

/ rescue / chmod 555 / bin / chmod

Я думаю, что вы также можете использовать mtree.

Darius
источник
Это было бы мое любимое решение. К сожалению, это не работает с Linux.
2

Я подозреваю, что это не настоящий вопрос: http://www.slideshare.net/cog/chmod-x-chmod

  • Переустановите chown: sudo apt-get install --reinstall coreutils
  • perl -e 'chmod 0755, "chmod"'
  • больше примеров в слайдах
Julien
источник
1

создайте новый chmod и используйте его для оригинала

umask 000
cat chmod > ~/my-chmod
~/my-chmod a+x chmod
Кевин М
источник
Установка umask 000 не даст разрешения на выполнение файла при его создании. В лучшем случае он получит разрешения rw-rw-rw-.
Барри Браун
2
@Barry: На самом деле это зависит от режима, переданного creat (2) / open (2) / mkdir (2) / etc. Если umask == 0 и системному вызову, который создает файл, дается 0777 для режима, то в файле будут включены биты выполнения. Например, компоновщики / компиляторы пропускают 0777 при записи «исполняемого файла» (например, (umask 000;gcc -o foo foo.c)создаст fooрежим 777). Однако многие (большинство?) Оболочек проходят 0666, когда открывают / создают файлы для перенаправления, что означает, что этот ответ не будет работать под многими оболочками.
Крис Джонсен