Bagaimana saya dapat menemukan hanya file yang dapat dieksekusi di bawah direktori tertentu di Linux?
linux
command-line
bash
find
HaiYuan Zhang
sumber
sumber
file
perintah standar ?ls -l | egrep '^[^d]..x..x..x.*$'
Di atas akan mencantumkan semua executable (untuk semua / pengguna dan grup) di direktori saat ini. Catatan :-executable
Opsi ini tidak berfungsi pada Mac karenanya solusi di atas.-rwxr-x---
), yang masih dapat dieksekusi untuk beberapa pengguna.Jawaban:
Memeriksa file yang dapat dieksekusi dapat dilakukan dengan
-perm
(tidak disarankan) atau-executable
(disarankan, karena ACL dimasukkan ke dalam akun). Untuk menggunakan-executable
opsi:jika Anda ingin menemukan hanya file yang dapat dieksekusi dan direktori yang tidak dapat dicari, gabungkan dengan
-type f
:sumber
-type x
keduanya.find: invalid predicate -executable'
pada RHELGunakan opsi temukan
-perm
. Ini akan menemukan file di direktori saat ini yang dapat dieksekusi oleh pemiliknya, oleh anggota grup atau oleh orang lain:Sunting:
Saya baru saja menemukan opsi lain yang hadir setidaknya di GNU find 4.4.0:
Ini harus bekerja lebih baik karena ACL juga dipertimbangkan.
sumber
find: invalid mode
/ u = x, g = x, o = x'`-perm /111
mungkin versi yang paling portabel.Saya tahu pertanyaan yang secara spesifik menyebutkan Linux, tetapi karena ini adalah hasil pertama di Google, saya hanya ingin menambahkan jawaban yang saya cari (misalnya jika Anda - seperti saya saat ini - dipaksa oleh atasan Anda untuk menggunakan non GNU / Sistem Linux).
Diuji pada macOS 10.12.5
sumber
Saya memiliki pendekatan lain, jika Anda benar-benar hanya ingin melakukan sesuatu dengan file yang dapat dieksekusi - dan tidak harus benar-benar memaksa menemukan untuk memfilter sendiri:
Saya lebih suka ini karena tidak bergantung pada
-executable
platform tertentu; dan itu tidak bergantung pada-perm
mana yang agak misterius, platform sedikit spesifik, dan seperti yang ditulis di atas membutuhkan file yang dapat dieksekusi untuk semua orang (bukan hanya Anda).Ini
-type f
penting karena dalam direktori * nix harus dapat dieksekusi agar dapat dilalui, dan semakin banyak kueri dalamfind
perintah, semakin efisien memori perintah Anda.Bagaimanapun, hanya menawarkan pendekatan lain, karena * nix adalah tanah satu miliar pendekatan.
sumber
find -perm
, menemukan file yang memiliki setiap mengeksekusi izin bit set. (2) Sebaliknya, jawaban ini hanya menemukan file yang izinnya dimiliki pengguna saat ini. Memang, itu mungkin yang diinginkan OP, tetapi tidak jelas. … (Lanjutan)`…`
ke$(…)
- lihat ini , ini , dan ini . (4) Tapi jangan lakukanfor i in $(find …); do …
; gagal pada nama file yang mengandung spasi. Sebaliknya, lakukanfind … -exec …
. (5) Dan, ketika Anda bekerja dengan variabel shell, selalu kutip mereka (dalam tanda kutip ganda) kecuali Anda memiliki alasan yang baik untuk tidak melakukannya, dan Anda yakin Anda tahu apa yang Anda lakukan.-perm
argumen yang membutuhkan ketiganya, bukan salah satunya. Juga, terima kasih atas masukan untuk melindungi argumen shell, itu saja yang tidak saya sadari.for i in
temukan. -type f; do [ -x $i ] && echo "$i is executable"; done
; Anda kehilangan bagian <dir>, yang saya gunakan titik (.)File yang ditandai executable tidak harus berupa file atau objek yang dapat dieksekusi atau dapat dimuat.
Inilah yang saya gunakan:
sumber
-name "*"
tidak berpengaruhfind
- biasanya menemukan semua file yang tidak dihilangkan dengan tes.Sebagai penggemar ...
Menggunakan 'xargs' untuk mengambil output dari perintah find (menggunakan print0 untuk memastikan nama file dengan spasi ditangani dengan benar). Kami sekarang memiliki daftar file yang dapat dieksekusi dan kami menyediakannya, satu per satu, sebagai parameter untuk perintah 'file'. Kemudian ambil istilah ASCII untuk mengabaikan binari. Ganti -executable in find command dengan gaya apa yang Anda sukai (lihat jawaban sebelumnya) atau yang berfungsi pada 'NIX OS Anda
Saya meminta hal di atas untuk menemukan file dengan eval di skrip yang dimiliki oleh root, jadi buat yang berikut untuk membantu menemukan kelemahan eskalasi privat di mana pengguna root menjalankan skrip dengan parameter tidak aman ...
sumber
file
melaporkan penyandian, sehingga skrip python dapat dilaporkan sebagaia /usr/bin/python script, UTF-8 Unicode text executable
.find ... | xargs file -b | grep -v '^ELF'
bisa bekerja lebih baik untuk mengenali non-binari.Saya membuat fungsi di
~/.bashrc
malam ini untuk menemukan file yang dapat dieksekusi tidak di jalur sistem dan bukan direktori:Keuntungannya adalah ia akan mencari tiga distro Linux dan instalasi Windows di bawah satu detik di mana
find
perintahnya memakan waktu 15 menit.Sebagai contoh:
Atau untuk seluruh direktori dan semua subs itu:
sumber