Bagaimana cara menghapus izin eksekusi dari file tanpa menyentuh folder secara rekursif?

42

Saya membuat cadangan ke drive NTFS, dan well, cadangan ini benar-benar diperlukan. Namun, drive NTFS mengacaukan izin. Saya ingin mengembalikannya ke kondisi normal tanpa memperbaiki secara manual setiap file.

Satu masalah adalah bahwa tiba-tiba semua file teks saya memperoleh izin eksekusi, yang salah ofc. Jadi saya mencoba:

sudo chmod -R a-x folder\ with\ restored\ backup/

Tapi itu salah karena menghapus xizin dari direktori juga yang membuatnya tidak dapat dibaca.

Apa perintah yang benar dalam kasus ini?

gaazkam
sumber
1
Meta: Saya tidak pernah mengerti mengapa sistem Unix menambahkan bit eksekusi ke file yang dipasang dari sistem file DOS atau Windows. Ini tidak seperti ada orang yang akan mengeksekusi file-file itu. Saya biasanya menambahkan "noexec" ke opsi mount saya di mana pun praktis.
Edward Falk

Jawaban:

70
chmod -R -x+X *

The -xMenghapus melaksanakan hak akses untuk semua
yang +Xakan menambah melaksanakan hak akses untuk semua, tetapi hanya untuk direktori.

Jak Gibb
sumber
2
Perintah yang akhirnya saya gunakan untuk mengembalikan izin ke normal: `chmod -R a-x + X, u-x + rwX, go-wx + rX direktori / nama`
gaazkam
3
Lihat juga jawaban Edward tentang pengecualian untuk BSD
fikr4n
4
Ini gagal dengan persyaratan "tanpa menyentuh folder". Bagaimana jika eksekusi (mungkin untuk dunia) sengaja dihapus pada beberapa direktori? Anda seharusnya tidak menambahkannya.
Ben Voigt
4
ini tidak berfungsi di Mac. Memindahkan flag -R ke awal akan membuatnya bekerja di terminal linux dan Mac. chmod -R -x+x *
JoeMoe1984
2
Sebenarnya dengan urutan yang benar itu berjalan di OSX, tetapi sebenarnya tidak memiliki efek yang diinginkan. Anda harus melakukannya sebagai dua langkah terpisah:chmod -R -x * && chmod -R +X *
Timmmm
14

Oke, saya membaca kembali halaman manual "chmod" untuk Mac OS X, BSD, dan Linux, dan melakukan beberapa percobaan. Inilah yang saya pelajari tentang mode simbolik. Ini bisa menjadi rumit, tetapi perlu dipahami:

  • Bentuk umum adalah klausa [, klausa ...] di mana:
  • klausa : = [ugoa] [+ - =] [rwxXstugo]
  • [ugoa] ( siapa ) (sebutkan beberapa) berarti mengatur izin untuk pengguna, grup, lainnya, atau semua. Jika tidak ditentukan, standarnya adalah 'a', tetapi umask berlaku.
  • [+ - =] ( tindakan ) (sebutkan satu) berarti:
    • + berarti menambahkan izin yang ditentukan ke izin yang sudah berlaku
    • - Berarti menghapus izin yang ditentukan dari izin yang sudah berlaku
    • = berarti mengatur izin ke izin yang ditentukan, membersihkan semua yang lain
  • [rwxXstugo] ( izin ) (tentukan kelipatan rwxXst ATAU salah satu dari ugo) menetapkan izin untuk pengguna yang ditentukan sebagai berikut:
    • r - baca
    • menulis - w
    • x - jalankan / cari
    • X - jalankan / cari direktori iff ATAU bit eksekusi sudah ditetapkan.
    • s - suid atau sgid
    • t - lengket
    • u - salin izin pengguna
    • g - salin izin grup
    • o - salin izin lain

Jadi misalnya, a+xakan membuat file dapat dieksekusi oleh semua orang. a+Xakan membuat file dapat dieksekusi oleh semua orang JIKA itu bisa dieksekusi oleh siapa pun.

a+xakan membuat direktori dicari oleh semua orang. a+Xjuga akan membuat direktori dapat dicari oleh semua orang.

Perbedaan utama antara BSD dan Linux adalah bahwa dengan BSD, penentuan dilakukan berdasarkan izin file sebelum chmod dieksekusi. Sementara dengan Linux, penentuan dilakukan segera sebelum klausa + X dijalankan.

Jadi dengan BSD, kombinasi tersebut a-x,a+Xakan menghapus izin eksekusi / pencarian dan kemudian membuat direktori dapat dicari oleh semua orang, dan membuat file dapat dieksekusi oleh semua orang jika awalnya dapat dieksekusi oleh siapa pun.

Dengan Linux, a-x,a+Xakan menghapus izin eksekusi / pencarian dan kemudian membuat direktori dapat dicari oleh semua orang, sementara meninggalkan file yang dapat dieksekusi oleh siapa pun.


Berikut adalah contoh nyata: pada mesin BSD: direktori, file yang dapat dieksekusi, dan file yang tidak dapat dieksekusi:

drwxr-x---  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x---  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

Perhatikan bahwa direktori dan "fie" dapat dieksekusi / dicari oleh pengguna, tetapi tidak oleh orang lain.

Sekarang kita jalankan chmod a-x,a+X *. Klausa pertama akan menghapus bit eksekusi / pencarian dari semua pengguna untuk semua file, tetapi klausa kedua akan menambahkannya kembali untuk "biaya" dan "fie". "fee" karena ini adalah direktori, dan "fie" karena memiliki setidaknya satu bit yang dapat dieksekusi untuk memulai.

drwxr-x--x  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x--x  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

Saya memiliki hasil yang sama mengeksekusi chmod -x+X.

Kesimpulan: Solusi Jak Gibb akan bekerja di Linux, tetapi untuk BSD, Anda harus membuat dua lintasan.

Saya tidak menguji ini pada SVr4 atau varian Unix lainnya.

Edward Falk
sumber
Bagus dibaca. Terima kasih telah melakukan penelitian tentang ini.
Jak Gibb
10

Salah satu cara untuk melakukannya:

find backup -type f -exec chmod 0644 {} +
Satō Katsura
sumber
6
Ini bisa menambah atau menghapus izin yang tidak ingin Anda ubah. Lebih baik digunakanchmod a-x {}
Edward Falk
1
@ EdwardFalk chmod a-x {}juga bisa berakhir dengan menghapus izin yang tidak ingin Anda ubah, dan itu bisa membuat file dapat ditulisi dunia. Intinya, 0644 adalah kompromi yang "secara umum masuk akal". OP harus, tentu saja, juga melibatkan otak sebelum menerapkan solusi dari Internet di komputernya.
Satō Katsura
4
"ax" menghapus izin eksekusi untuk pengguna, grup, lainnya, dan membiarkan izin lainnya tidak berubah, sejauh yang saya tahu. Apakah saya salah?
Edward Falk
1
@ EdwardFalk Tidak, Anda benar. Tapi Anda tidak tahu apa set sebenarnya file, dan Anda juga tidak tahu apa izin sebelumnya chmod. Jika file cadangan berisi skrip dan binari, menghapusnya xsalah. Jika izin sebelumnya chmodadalah 0777 maka chmod a-xmasih akan meninggalkan mereka 0666, yang mungkin bukan yang Anda inginkan. Apa yang saya katakan adalah ituchmod 0644 heuristik yang lebih baik, bukan itu chmod a-xsalah.
Satō Katsura
1
@NajibIdrissi Kecuali, Anda tahu, mereka berubah menjadi 0777 ketika Anda menyalinnya pada sistem file asing yang tidak memiliki izin UNIX. Persis seperti yang dilakukan OP.
Satō Katsura
6
 find backup ! -type l ! -type d -exec chmod a-x {} +

Akan menghapus izin eksekusi ke file yang bukan dari jenis direktori (seperti yang Anda minta) atau tautan simbolis (symlink umumnya selalu rwxrwxrwx, dan chmodakan mempengaruhi target symlink pada mereka).

Perhatikan bahwa:

 find backup -type f -exec chmod a-x {} +

hanya akan mengubah izin file biasa . Itu akan mengecualikan direktori dan symlink , tetapi juga perangkat , bernama pipa , soket dan mungkin yang lain tergantung pada sistem (meskipun dalam kasus OP dari cadangan sistem file NTFS, itu tidak mungkin hadir).

Stéphane Chazelas
sumber
2

Di zsh, gunakan kualifikasi glob . untuk mencocokkan hanya file biasa (tidak termasuk tautan simbolik), dan Duntuk mencocokkan file dot:

sudo chmod a-x folder\ with\ restored\ backup/**/*(D.)

Jika baris perintah terlalu panjang, Anda dapat menggunakan zargs:

zargs -- folder\ with\ restored\ backup/**/*(D.) -- sudo chmod a-x 
Gilles 'SANGAT berhenti menjadi jahat'
sumber