Ich habe gerade ein chmod -x chmod gemacht

27

Also habe ich a chmod -x chmod. Wie kann ich dieses Problem beheben? Wie gebe ich chmod Ausführungsrechte zurück?

Turm
quelle
10
Sie versehentlich das Ganze chmod!
Thanatos
1
Siehe auch die Frage zu Unix & Linux SE .
oder

Antworten:

43

In Linux:

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

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

bindbn
quelle
bindbn, ich wollte gerade den gleichen link posten :-) aber ich habe gerade gelesen, dass ich neu bei unix / linux bin !!!
Rihatum
2
Auf einer 64-Bit-Distribution müssen Sie möglicherweise /lib64/ld-linux-x86-64.so.2stattdessen verwenden. ldd /bin/chmodsollte genau auflisten, welcher Linker ausgeführt werden soll.
goldPseudo
Ich würde ein minimales Programm schreiben, das chmod (2) verwendet, aber das ist cooler
adamo
1
@Stefan: From man ld-linux.so: "ld.so [und ld-linux.so] lädt die gemeinsam genutzten Bibliotheken, die von einem Programm benötigt werden, bereitet das Programm für die Ausführung vor und führt es dann aus." ( ld.sogilt für a.outausführbare Dateien im Format und ld-linux.sofür das ELF-Format.)
Bis auf weiteres angehalten.
1
@Stefan: Der Kernel kann dynamisch verknüpfte ausführbare Dateien nicht wirklich laden und ausführen, da sie sehr komplex sind und dem glibc und nicht dem Kernel folgen. ld-linux.soist eine Art ausführbares / Bibliotheks-Hybrid, eine Art statisch verknüpft, wird im Benutzerbereich ausgeführt und ist dafür verantwortlich, dynamisch verknüpfte ausführbare Dateien und all ihre Abhängigkeiten zu laden und sie dann auszuführen.
Juliano
18

Verwenden Sie Python:

# python
Python> import os
Python> os.chmod("/bin/chmod",0755)
Douglas Leeder
quelle
4
Und als Einzeiler:python -c "import os; os.chmod('/bin/chmod', 0755)"
Thanatos
18

Dies beruht auf der Tatsache, dass die Berechtigungen einer Zieldatei erhalten bleiben und nicht die der Quelldatei, wenn diese kopiert wird. Wir "leihen" die Berechtigungen von ls:

cp /bin/ls /tmp/chmod.tmp
cp /bin/chmod /tmp/chmod.tmp
mv /tmp/chmod.tmp /bin/chmod
Bis auf weiteres angehalten.
quelle
Ich denke, dein erstes cpmuss die -p Flagge haben
Riking
@Riking: Das ist für diesen Zweck nicht nötig.
Bis auf weiteres angehalten.
Dies war ähnlich wie die Lösung, die ich mir ausgedacht habe, aber nachdem cpich die ausführbare Datei erstellt hatte, habe ich nur catden Inhalt von chmodin die temporäre Datei eingefügt.
Rechtschreibung
9

Perl benutzen:

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

setfacl -m u::rx /bin/chmod

... gewährt dem Besitzer Ausführungsberechtigungen.

Aber der /lib/ld-linux.so.2Trick ist ordentlich. :)

Kyle Brantley
quelle
5

Das ist komisch ... Ich habe so etwas vor ein paar Tagen über einen Tweet von jemandem gesehen ...

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

ThatGraemeGuy
quelle
Links zu anderen Seiten sind nicht hilfreich, da der Link irgendwann unterbrochen wird. Das ist so, als würde man jemandem sagen, er solle die Antwort googeln.
Phil Hannent
@Phil Hannent: Ich habe diese Diashow auch erst vor drei Tagen gesehen, also war es mein erster Gedanke, ob das OP einer der Bewerber dort war.
Boldewyn
Genauso,
ich
4

Sollten Sie sich auf einem System /bin/chmodbefinden, auf dem der Dynamic Linker nicht laden kann:

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

Dies funktioniert auf meinem MacOS X-System.

Alnitak
quelle
2

/ rescue / chmod 555 / bin / chmod

Ich denke, Sie könnten auch mtree verwenden.

Darius
quelle
Das wäre meine Lieblingslösung. Unter Linux funktioniert das leider nicht.
1

erstelle ein neues chmod und verwende das für das original

umask 000
cat chmod > ~/my-chmod
~/my-chmod a+x chmod
Kevin M
quelle
Wenn Sie eine umask von 000 festlegen, erhält eine Datei beim Erstellen keine Ausführungsberechtigung. Es wird bestenfalls RW-RW-RW-Berechtigungen erhalten.
Barry Brown
2
@Barry: Es hängt tatsächlich von dem Modus ab, der an creat (2) / open (2) / mkdir (2) / etc übergeben wurde. Wenn umask == 0 und der Systemaufruf, der die Datei erstellt, 0777 für den Modus lautet, sind die Ausführungsbits für die Datei aktiviert. Beispielsweise übergeben Linker / Compiler 0777, wenn sie eine „ausführbare Datei“ ausgeben (z. B. (umask 000;gcc -o foo foo.c)wird ein foomit Modus 777 erstellt). Viele (die meisten?) Shells bestehen jedoch 0666, wenn sie Dateien zur Umleitung öffnen / erstellen. Dies bedeutet, dass diese Antwort unter vielen Shells nicht funktioniert.
Chris Johnsen