Właśnie zrobiłem chmod -x chmod

27

Więc zrobiłem chmod -x chmod. Jak mogę rozwiązać ten problem? Jak mogę przekazać uprawnienia do wykonania chmod?

Wieża
źródło
10
Ty przypadkowo całość chmod!
Thanatos,
1
Zobacz także pytanie o Unix i Linux SE .
2013 r. O

Odpowiedzi:

43

W systemie Linux:

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

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

bindbn
źródło
bindbn, miałem zamiar opublikować ten sam link :-), ale czytałem siebie, ponieważ jestem nowy w sprawach unix / linux !!!
rihatum
2
W 64-bitowej dystrybucji może być konieczne użycie /lib64/ld-linux-x86-64.so.2zamiast tego. ldd /bin/chmodpowinien wypisać dokładnie, który linker ma zostać uruchomiony.
goldPseudo
Napisałbym
1
@Stefan: From man ld-linux.so: „ld.so [i ld-linux.so] ładuje biblioteki współdzielone potrzebne programowi, przygotowuje program do uruchomienia, a następnie uruchamia.” ( ld.sodotyczy a.outplików wykonywalnych formatu i ld-linux.soformatu ELF.)
Wstrzymano do odwołania.
1
@Stefan: Jądro tak naprawdę nie wie, jak ładować i wykonywać dynamicznie połączone pliki wykonywalne, ponieważ jest bardzo złożone i postępuje zgodnie z glibc, a nie jądrem. ld-linux.sojest swego rodzaju hybrydą plików wykonywalnych / bibliotek, sortowaną statycznie połączoną, działa w przestrzeni użytkownika i jest odpowiedzialny za ładowanie dynamicznie powiązanych plików wykonywalnych i wszystkich ich zależności, a następnie ich uruchamianie.
Juliano,
18

Użyj python:

# python
Python> import os
Python> os.chmod("/bin/chmod",0755)
Douglas Leeder
źródło
4
I, jako jeden liniowiec:python -c "import os; os.chmod('/bin/chmod', 0755)"
Thanatos,
18

Opiera się to na tym, że uprawnienia do pliku docelowego są zachowywane, a nie pliku źródłowego podczas kopiowania. „Pożyczamy” uprawnienia ls:

cp /bin/ls /tmp/chmod.tmp
cp /bin/chmod /tmp/chmod.tmp
mv /tmp/chmod.tmp /bin/chmod
Wstrzymano do odwołania.
źródło
Myślę, że twoja pierwsza cpmusi mieć
włączoną
@Riking: W tym celu nie jest to konieczne.
Wstrzymano do odwołania.
Było to podobne do rozwiązania, które wymyśliłem, ale po cpuruchomieniu pliku wykonywalnego po prostu catwłączyłem zawartość chmodpliku tymczasowego.
SpellingD
9

Za pomocą Perla:

% perl -e 'chmod 0755, qw[/bin/chmod]'
Alnitak
źródło
7

setfacl -m u::rx /bin/chmod

... przyzna właścicielowi uprawnienia do wykonywania.

Ale /lib/ld-linux.so.2sztuczka jest zgrabna. :)

Kyle Brantley
źródło
5

To dziwne ... Kilka dni temu widziałem coś takiego przez czyjś tweet ...

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

ThatGraemeGuy
źródło
Linki do innych stron nie są pomocne, ponieważ w pewnym momencie link się zepsuje. To tak, jakby powiedzieć komuś, aby znalazł odpowiedź w Google.
Phil Hannent,
@Phil Hannent: Widziałem też ten pokaz slajdów, zaledwie trzy dni temu, więc to była moja pierwsza myśl, czy OP był jednym z kandydatów.
Boldewyn
Tak samo, widziałem to na Reddit kilka dni temu ...
Dentrasi,
4

Jeśli korzystasz z systemu, w którym /bin/chmoddynamiczny linker nie może go załadować:

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

Działa to na moim systemie MacOS X.

Alnitak
źródło
2

/ rescue / chmod 555 / bin / chmod

Myślę, że możesz także użyć mtree.

Dariusz
źródło
To byłoby moje ulubione rozwiązanie. Niestety nie działa z linuksem.
1

utwórz nowy chmod i użyj go do oryginału

umask 000
cat chmod > ~/my-chmod
~/my-chmod a+x chmod
Kevin M.
źródło
Ustawienie umask na 000 nie spowoduje przyznania pliku uprawnień do wykonania po jego utworzeniu. W najlepszym wypadku uzyska uprawnienia rw-rw-rw-.
Barry Brown,
2
@ Barry: To zależy od trybu przekazanego do creat (2) / open (2) / mkdir (2) / etc. Jeśli umask == 0 i syscall, który tworzy plik, otrzyma 0777 dla trybu, to plik będzie miał włączone bity wykonania. Na przykład linkery / kompilatory przekazują 0777 podczas zapisywania „pliku wykonywalnego” (np. (umask 000;gcc -o foo foo.c)Utworzą footryb z 777). Jednak wiele (większość?) Powłok przechodzi 0666 podczas otwierania / tworzenia plików do przekierowania, co oznacza, że ​​ta odpowiedź nie zadziała w wielu powłokach.
Chris Johnsen