Saya baru saja melakukan chmod -x chmod

27

Jadi saya melakukan chmod -x chmod. Bagaimana saya bisa memperbaiki masalah ini? Bagaimana cara saya memberikan hak eksekusi kembali ke chmod?

Benteng
sumber
10
Anda tidak sengaja keseluruhan chmod!
Thanatos

Jawaban:

43

Di Linux:

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

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

bindbn
sumber
bindbn, saya akan memposting tautan yang sama :-) tapi saya membaca sendiri karena saya baru di unix / linux !!!
rihatum
2
Pada distro 64-bit, Anda mungkin harus menggunakannya /lib64/ld-linux-x86-64.so.2. ldd /bin/chmodharus mencantumkan linker mana yang harus dijalankan.
goldPseudo
Saya akan menulis program minimal yang menggunakan chmod (2), tapi ini lebih keren
adamo
1
@Stefan: Dari man ld-linux.so: "ld.so [dan ld-linux.so] memuat pustaka bersama yang diperlukan oleh suatu program, menyiapkan program untuk dijalankan, dan kemudian menjalankannya." ( ld.sountuk a.outformat yang dapat dieksekusi dan ld-linux.sountuk format ELF.)
Dijeda sampai pemberitahuan lebih lanjut.
1
@Stefan: Kernel tidak benar-benar tahu cara memuat dan mengeksekusi executable yang terkait secara dinamis, karena sangat kompleks dan mengikuti glibc, bukan kernel. ld-linux.soadalah semacam-executable / library hybrid, semacam-terkait secara statis, berjalan di userspace, dan bertanggung jawab untuk memuat executable yang terkait secara dinamis dan semua dependensinya, kemudian menjalankannya.
Juliano
18

Gunakan python:

# python
Python> import os
Python> os.chmod("/bin/chmod",0755)
Douglas Leeder
sumber
4
Dan, sebagai satu-liner:python -c "import os; os.chmod('/bin/chmod', 0755)"
Thanatos
18

Ini bergantung pada kenyataan bahwa izin file tujuan dipertahankan daripada file sumber saat itu sedang disalin. Kami "meminjam" izin dari ls:

cp /bin/ls /tmp/chmod.tmp
cp /bin/chmod /tmp/chmod.tmp
mv /tmp/chmod.tmp /bin/chmod
Dijeda sampai pemberitahuan lebih lanjut.
sumber
Saya pikir cpkebutuhan pertama Anda untuk memiliki -p flag on
Riking
@Riking: Tidak perlu untuk tujuan ini.
Dijeda sampai pemberitahuan lebih lanjut.
Ini mirip dengan solusi yang saya buat, tapi setelah cpdieksekusi, saya hanya catisi chmodke dalam file temp.
SpellingD
9

Menggunakan Perl:

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

setfacl -m u::rx /bin/chmod

... akan memberikan izin kepada pemilik untuk mengeksekusi.

Tapi, /lib/ld-linux.so.2triknya rapi. :)

Kyle Brantley
sumber
5

Ini aneh ... Saya melihat sesuatu seperti ini beberapa hari yang lalu melalui tweet seseorang ...

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

ThatGraemeGuy
sumber
Tautan ke situs lain tidak membantu karena tautan akan rusak di beberapa titik. Ini seperti memberi tahu seseorang kepada google jawabannya.
Phil Hannent
@ Philip Hannent: Saya sudah melihat slideshow itu juga, hanya tiga hari yang lalu, jadi itu adalah pikiran pertama saya, jika OP adalah salah satu pelamar di sana.
Boldewyn
Sama, baru melihat ini di Reddit beberapa hari yang lalu ...
Dentrasi
4

Jika Anda berada di sistem yang /bin/chmodtidak dapat dimuat oleh tautan dinamis:

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

Ini berfungsi pada sistem MacOS X saya.

Alnitak
sumber
2

/ rescue / chmod 555 / bin / chmod

Saya pikir Anda juga bisa menggunakan mtree.

Darius
sumber
Ini akan menjadi solusi favorit saya. Sayangnya, itu tidak bekerja dengan linux.
1

buat chmod baru dan gunakan itu untuk yang asli

umask 000
cat chmod > ~/my-chmod
~/my-chmod a+x chmod
Kevin M.
sumber
Mengatur umask dari 000 tidak akan memberikan izin eksekusi file ketika itu dibuat. Ini akan, paling-paling, mendapatkan izin rw-rw-rw-.
Barry Brown
2
@ Larry: Ini sebenarnya tergantung pada mode yang dilewatkan ke creat (2) / open (2) / mkdir (2) / etc. Jika umask == 0 dan syscall yang membuat file diberikan 0777 untuk mode, maka file tersebut akan mengeksekusi bit eksekusi. Sebagai contoh, penghubung / kompiler lulus 0777 ketika menulis "file yang dapat dieksekusi" (misalnya (umask 000;gcc -o foo foo.c)akan menghasilkan foodengan mode 777). Namun, banyak (kebanyakan?) Shell melewati 0666 ketika mereka membuka / membuat file untuk pengalihan, yang berarti bahwa jawaban ini tidak akan berfungsi di bawah banyak shell.
Chris Johnsen