Saya tidak sengaja chmod -R + x pada direktori. Bagaimana cara mengembalikan izin yang benar?

20

Yah, untuk lebih spesifik, itu chmod -R 755. Sekarang setiap file dapat dieksekusi, yang tidak saya inginkan. Saya berpikir bahwa saya harus melihat dua byte pertama dari setiap file untuk #!, tetapi apakah ini akan mencakup semuanya? Haruskah saya gunakan fileuntuk melihat semuanya dan mendasarkan keputusan saya pada hal itu? Atau, lebih mungkin, apakah ada cara yang lebih baik untuk melakukan ini?

Apa cara yang disukai untuk secara rekursif melalui direktori dan menetapkan -x pada file yang tidak 'dieksekusi'?

Larry Wang
sumber
Apakah Anda melakukan ini di /atau direktori lain?
gvkv
1
@ gvkv: Tidak /, direktori sepenuhnya milik saya.
Larry Wang
1
@Larry di masa depan Anda mungkin harus menggunakan beberapa varian + x daripada memperkosa semua izin, dan mungkin menyebabkan penulisan pada semua file.
xenoterracide
@xenoterracide: Setuju. Yang benar-benar saya inginkan adalah memberikan izin grup yang sama seperti saya (yang akhirnya terjadi!), Saya hanya tidak cukup berpikir sebelum mengetik.
Larry Wang
Berapa banyak file yang kita bicarakan? Berapa banyak yang harus dieksekusi? Apakah ada cara untuk mengetahui dari nama file?
David Thornley

Jawaban:

15

Tidak ada peluru ajaib di sini. Izin membawa informasi yang tidak selalu berlebihan.

Jika Anda melakukan ini di direktori sistem, sistem Anda akan berada dalam kondisi yang sangat buruk, karena Anda harus khawatir tentang setuid dan bit setgid, dan tentang file yang seharusnya tidak dapat dibaca dunia, dan tentang file yang seharusnya bisa ditulis kelompok atau dunia.

Dalam direktori per pengguna, Anda harus khawatir tentang file yang seharusnya tidak dapat dibaca dunia. Tidak ada yang bisa membantu Anda di sana.

Adapun executability, aturan praktis yang baik adalah membuat segala sesuatu yang tidak tampak seperti itu dapat dieksekusi, tidak dapat dieksekusi. Kernel dapat menjalankan skrip yang dua byte pertama adalah #!, binari ELF yang pertama empat byte yang \x7fELFmana \x7fadalah byte dengan nilai 12, dan beberapa jenis file jarang (a.out, apa pun terdaftar binfmt_misc). Oleh karena itu perintah berikut harus mengembalikan izin Anda ke keadaan yang wajar (mengasumsikan bash 4 atau zsh, jika tidak digunakan finduntuk melintasi pohon direktori; peringatan, diketik langsung ke browser):

for x in **/*; do
  if ! [ -f "$x" ]; then continue; fi # skip all but regular files
  case $(head -c 4 "$x") in
    "#!"??) :;; # skip script
    "\x7fELF") :;; # skip ELF executable
    *) chmod a-x "$x";;
  esac
done

Perhatikan bahwa ada cara sederhana untuk mencadangkan dan mengembalikan izin pohon direktori, di Linux dan mungkin beberapa kesatuan lainnya dengan dukungan ACL:

getfacl -R >saved-permissions
setfacl --restore=saved-permissions
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih! Untungnya, saya pikir semuanya termasuk dalam dua kategori ini. Jika ini melewatkan sesuatu, saya bisa mengatasinya nanti.
Larry Wang
Ingatlah bahwa itu **/*membutuhkan globstar.
Chris Down
Saya akan merekomendasikan dua perubahan pada skrip ini. Satu, gunakan finddaripada globstar; dua, alih-alih melihat kepala, gunakan fileperintah untuk melihat apa itu dan cabang dari sana.
Shadur
@ Safur findkurang dapat diandalkan daripada globstar, globstarlebih disukai di hampir setiap kasus.
Chris Down
1
@Gilles Lebih disukai seperti pada "jika Anda memilikinya, itu jauh lebih unggul", tidak hanya lebih cepat, tetapi juga lebih dapat diandalkan (dan tidak memiliki SNAFU tak terduga).
Chris Down
6

Saya percaya Anda akan menginginkan sesuatu seperti

find dir -type f -exec chmod ugo-x '{}' +

Ini mencari semua file biasa, secara dir secara rekursif, (tidak termasuk direktori, dan perangkat) dan menghapus bit yang dapat dieksekusi.

Saya akan mulai di sini, dan kemudian bekerja dengan cara saya untuk membuat file yang seharusnya dapat dieksekusi, dieksekusi.

Yang berikut ini harus bekerja persis seperti yang Anda minta (itu akan menemukan semua file biasa, ambil mereka untuk #! Dan kemudian hapus x bit jika tidak ditemukan)

find . -type f | xargs grep -L #! | xargs chmod ugo-x

mungkin versi yang lebih baik di atas (lebih sedikit pipa)

find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x 
xenoterracide
sumber
3
Membuat grep -L '^#!'setidaknya (tanda kutip yang diperlukan, dan ^Membatasi pencocokan pada awal baris), tapi masih terlalu permisif karena sesuai #!pada setiap baris. Menggunakan xargsakan gagal dengan nama file yang mengandung spasi atau mengutip karakter; gunakan xargs -d '\n'(membutuhkan GNU xargs).
Gilles 'SO- stop being evil'
0

Nah, tanpa garis shebang, file tersebut akan dieksekusi sebagai skrip shell, secara nominal dengan /bin/sh. Ide Anda adalah awal yang baik dan dengan asumsi bahwa direktori tersebut tidak mengandung file mission-critical mungkin tidak ada banyak risiko untuk mengeksekusi beberapa grepdan chmodkombo. Anda mungkin menemukan positif palsu, yaitu file dengan garis shebang yang tidak dimaksudkan untuk memiliki bit yang dapat dieksekusi tetapi tanpa mengetahui informasi lebih lanjut tentang tujuan dari apa yang ada di direktori, hanya Anda yang dapat memutuskan apakah itu merupakan ancaman eksistensial yang signifikan bagi Anda. sistem dan / atau data.

gvkv
sumber
Saya tidak terlalu khawatir tentang positif palsu sebagai negatif palsu. Ada beberapa biner yang saya pikir tidak memulainya #!.
Larry Wang