Acabei de fazer um chmod -x chmod

27

Então eu fiz um chmod -x chmod. Como posso resolver este problema? Como devolver direitos de execução ao chmod?

Torre
fonte
10
Você acidentalmente o todo chmod!
Thanatos
11
Veja também a pergunta sobre Unix e Linux SE .
unor 27/07

Respostas:

43

No Linux:

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

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

bindbn
fonte
bindbn, eu estava prestes a postar o mesmo link :-) mas eu estava lendo a mim mesmo porque sou novo nas coisas de unix / linux !!!
Rihatum 11/10/10
2
Em uma distribuição de 64 bits, talvez seja necessário usá-lo /lib64/ld-linux-x86-64.so.2. ldd /bin/chmoddeve listar exatamente qual vinculador executar.
goldPseudo
Eu ia escrever um programa mínimo que usos chmod (2), mas isso é mais frio
Adamo
11
@ Stefan: From man ld-linux.so: "ld.so [e ld-linux.so] carrega as bibliotecas compartilhadas necessárias para um programa, prepara o programa para ser executado e, em seguida, executa-o." ( ld.soé para a.outexecutáveis ​​de formato e ld-linux.soé para o formato ELF.)
Pausado até novo aviso.
11
@ Stefan: O kernel realmente não sabe como carregar e executar executáveis ​​vinculados dinamicamente, porque é altamente complexo e segue a glibc, não o kernel. ld-linux.soé uma espécie de híbrido executável / de biblioteca, vinculado estaticamente, executado no espaço do usuário e é responsável por carregar executáveis ​​dinamicamente vinculados e todas as suas dependências e executá-los.
Jul10
18

Use python:

# python
Python> import os
Python> os.chmod("/bin/chmod",0755)
Douglas Leeder
fonte
4
E, como one-liner:python -c "import os; os.chmod('/bin/chmod', 0755)"
Thanatos
18

Isso depende do fato de que as permissões de um arquivo de destino são preservadas, e não o arquivo de origem, quando ele está sendo copiado. Estamos "emprestando" as permissões de ls:

cp /bin/ls /tmp/chmod.tmp
cp /bin/chmod /tmp/chmod.tmp
mv /tmp/chmod.tmp /bin/chmod
Pausado até novo aviso.
fonte
Acho que suas primeiras cpnecessidades para ter o sinalizador -p on
Riking
@ Vikings: Não é necessário para esse fim.
Pausado até novo aviso.
Isso foi semelhante à solução que eu encontrei, mas depois cpdo executável, eu apenas coloquei cato conteúdo chmodno arquivo temporário.
SpellingD
9

Usando Perl:

% perl -e 'chmod 0755, qw[/bin/chmod]'
Alnitak
fonte
7

setfacl -m u::rx /bin/chmod

... concederá ao proprietário permissões de execução.

Mas, o /lib/ld-linux.so.2truque é puro. :)

Kyle Brantley
fonte
5

Isso é estranho ... Eu vi algo assim há alguns dias através do tweet de alguém ...

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

ThatGraemeGuy
fonte
Links para outros sites não são úteis, pois o link será quebrado em algum momento. É como dizer a alguém para pesquisar no Google a resposta.
Phil Hannent
@ Phil Hannent: Eu também vi essa apresentação de slides há apenas três dias, então foi o meu primeiro pensamento, se o OP fosse um dos candidatos lá.
Boldewyn
Mesmo assim, vi isso no Reddit há alguns dias ...
Dentrasi 11/11
4

Você deve estar em um sistema em /bin/chmodque não pode ser carregado pelo vinculador dinâmico:

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

Isso funciona no meu sistema MacOS X.

Alnitak
fonte
2

/ de resgate / chmod 555 / bin / chmod

Eu acho que você também pode usar mtree.

Darius
fonte
Esta seria a minha solução favorita. Infelizmente não funciona com linux.
1

crie um novo chmod e use-o para o original

umask 000
cat chmod > ~/my-chmod
~/my-chmod a+x chmod
Kevin M
fonte
Definir uma umask de 000 não concederá permissão de execução ao arquivo quando ele for criado. Na melhor das hipóteses, obterá permissões rw-rw-rw-.
Barry Brown
2
@ Barry: Na verdade, depende do modo passado para creat (2) / open (2) / mkdir (2) / etc. Se umask == 0 e o syscall que cria o arquivo receber 0777 para o modo, o arquivo terá os bits de execução ativados. Por exemplo, vinculadores / compiladores passam 0777 ao escrever um “arquivo executável” (por exemplo (umask 000;gcc -o foo foo.c), produzirá um foocom o modo 777). No entanto, muitos shells (a maioria?) Passam no 0666 quando abrem / criam arquivos para redirecionamento, o que significa que essa resposta não funcionará sob muitos shells.
Chris Johnsen