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 file
untuk 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'?
permissions
files
chmod
Larry Wang
sumber
sumber
/
atau direktori lain?/
, direktori sepenuhnya milik saya.Jawaban:
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\x7fELF
mana\x7f
adalah byte dengan nilai 12, dan beberapa jenis file jarang (a.out, apa pun terdaftarbinfmt_misc
). Oleh karena itu perintah berikut harus mengembalikan izin Anda ke keadaan yang wajar (mengasumsikan bash 4 atau zsh, jika tidak digunakanfind
untuk melintasi pohon direktori; peringatan, diketik langsung ke browser):Perhatikan bahwa ada cara sederhana untuk mencadangkan dan mengembalikan izin pohon direktori, di Linux dan mungkin beberapa kesatuan lainnya dengan dukungan ACL:
sumber
**/*
membutuhkanglobstar
.find
daripada globstar; dua, alih-alih melihat kepala, gunakanfile
perintah untuk melihat apa itu dan cabang dari sana.find
kurang dapat diandalkan daripadaglobstar
,globstar
lebih disukai di hampir setiap kasus.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)
mungkin versi yang lebih baik di atas (lebih sedikit pipa)
sumber
grep -L '^#!'
setidaknya (tanda kutip yang diperlukan, dan^
Membatasi pencocokan pada awal baris), tapi masih terlalu permisif karena sesuai#!
pada setiap baris. Menggunakanxargs
akan gagal dengan nama file yang mengandung spasi atau mengutip karakter; gunakanxargs -d '\n'
(membutuhkan GNUxargs
).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 beberapagrep
danchmod
kombo. 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.sumber
#!
.