Je viens de faire un chmod -x chmod

27

J'ai donc fait un chmod -x chmod. Comment puis-je résoudre ce problème? Comment puis-je redonner des droits d'exécution à chmod?

Tour
la source
10
Vous accidentellement l'ensemble chmod!
Thanatos
1
Voir aussi la question sur Unix et Linux SE .
unor

Réponses:

43

Sous Linux:

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

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

bindbn
la source
bindbn, j'étais sur le point de poster le même lien :-) mais je me lisais car je suis nouveau dans les trucs unix / linux !!!
rihatum
2
Sur une distribution 64 bits, vous devrez peut-être utiliser à la /lib64/ld-linux-x86-64.so.2place. ldd /bin/chmoddevrait répertorier exactement l'éditeur de liens à exécuter.
goldPseudo
J'écrirais un programme minimal qui utilise chmod (2), mais c'est plus cool
adamo
1
@Stefan: De man ld-linux.so: "ld.so [et ld-linux.so] charge les bibliothèques partagées nécessaires à un programme, prépare le programme à s'exécuter, puis l'exécute." ( ld.soconcerne les a.outexécutables au format et le ld-linux.soformat ELF.)
pause jusqu'à nouvel ordre.
1
@Stefan: Le noyau ne sait pas vraiment comment charger et exécuter des exécutables liés dynamiquement, car il est très complexe et suit la glibc, pas le noyau. ld-linux.soest une sorte d'exécutable / bibliothèque hybride, une sorte de lien statique, s'exécute dans l'espace utilisateur et est chargé de charger les exécutables liés dynamiquement et toutes leurs dépendances, puis de les exécuter.
Juliano
18

Utilisez python:

# python
Python> import os
Python> os.chmod("/bin/chmod",0755)
Douglas Leeder
la source
4
Et, en une seule ligne:python -c "import os; os.chmod('/bin/chmod', 0755)"
Thanatos
18

Cela repose sur le fait que les autorisations d'un fichier de destination sont préservées plutôt que sur le fichier source lors de sa copie. Nous «empruntons» les autorisations de ls:

cp /bin/ls /tmp/chmod.tmp
cp /bin/chmod /tmp/chmod.tmp
mv /tmp/chmod.tmp /bin/chmod
En pause jusqu'à nouvel ordre.
la source
Je pense que votre premier cpbesoin d'avoir le drapeau -p
Riking
@Riking: Ce n'est pas nécessaire à cette fin.
pause jusqu'à nouvel ordre.
Ceci était similaire à la solution que j'ai trouvée, mais après avoir cpexécuté l'exécutable, je venais juste catd'en retrouver le contenu chmoddans le fichier temporaire.
SpellingD
9

Utilisation de Perl:

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

setfacl -m u::rx /bin/chmod

... accordera au propriétaire des autorisations d'exécution.

Mais, l' /lib/ld-linux.so.2astuce est soignée. :)

Kyle Brantley
la source
5

C'est bizarre ... J'ai vu quelque chose comme ça il y a quelques jours via le tweet de quelqu'un ...

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

ThatGraemeGuy
la source
Les liens vers d'autres sites ne sont pas utiles car le lien sera rompu à un moment donné. C'est comme dire à quelqu'un de google la réponse.
Phil Hannent
@Phil Hannent: J'ai aussi vu ce diaporama, il y a seulement trois jours, donc c'était ma première pensée, si l'OP était l'un des candidats là-bas.
Boldewyn
Idem, je viens de voir ça sur Reddit il y a quelques jours ...
Dentrasi
4

Si vous êtes sur un système où /bin/chmodne peut pas être chargé par l'éditeur de liens dynamique:

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

Cela fonctionne sur mon système MacOS X.

Alnitak
la source
2

/ sauvetage / chmod 555 / poubelle / chmod

Je pense que vous pouvez également utiliser mtree.

Darius
la source
Ce serait ma solution préférée. Cela ne fonctionne malheureusement pas avec Linux.
1

créer un nouveau chmod et l'utiliser pour l'original

umask 000
cat chmod > ~/my-chmod
~/my-chmod a+x chmod
Kevin M
la source
La définition d'un umask de 000 ne donnera pas la permission d'exécuter un fichier lors de sa création. Il obtiendra au mieux les autorisations rw-rw-rw-.
Barry Brown
2
@Barry: Cela dépend en fait du mode passé à creat (2) / open (2) / mkdir (2) / etc. Si umask == 0 et l'appel système qui crée le fichier reçoit 0777 pour le mode, alors le fichier aura les bits d'exécution activés. Par exemple, les éditeurs de liens / compilateurs passent 0777 lors de l'écriture d'un «fichier exécutable» (par exemple (umask 000;gcc -o foo foo.c), produira un fooavec le mode 777). Cependant, de nombreux shells (la plupart?) Passent 0666 lorsqu'ils ouvrent / créent des fichiers pour la redirection, ce qui signifie que cette réponse ne fonctionnera pas sous de nombreux shells.
Chris Johnsen