Linux'ta yalnızca belirli bir dizindeki yürütülebilir dosyaları nasıl bulabilirim?
Yürütülebilir dosyaları kontrol etmek -perm
(önerilmez) veya -executable
(ACL hesaba katıldığı için önerilir) ile yapılabilir. -executable
seçeneğini kullanmak için:
find <dir> -executable
yalnızca yürütülebilir dosyaları bulmak ve aranabilir dizinleri bulmak istemiyorsanız, -type f
ile birleştirin:
find <dir> -executable -type f
Find'ın -perm
seçeneğini kullanın. Bu, geçerli dizindeki dosyaları sahibinin, grup üyelerinin veya başkalarının çalıştırdığı dosyaları bulabilir:
find . -perm /u=x,g=x,o=x
Düzenle:
Sadece en azından GNU'de bulunan başka bir seçenek buldum _ _ 4.4.0:
find . -executable
ACL'ler de dikkate alındığından, bu daha iyi çalışmalıdır.
Sorunun özellikle Linux'tan bahsettiğini biliyorum, ancak Google’daki ilk sonuç olduğundan, sadece aradığım cevabı eklemek istedim (örneğin, şu anda benim gibi - eğer işvereniniz tarafından GNU’yu kullanmaya zorlamadı) Linux sistemi).
macOS 10.12.5 üzerinde test edildi
find . -perm +111 -type f
Başka bir yaklaşımım var, gerçekten istediğiniz şey yalnızca çalıştırılabilir dosyalarla bir şeyler yapmaktır - ve aslında bulmaya kendini filtrelemeye zorlamak zorunda kalmazsınız:
for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done
Bunu tercih ediyorum çünkü platforma özgü olan -executable
'a güvenmiyor; ve biraz eğik, biraz platforma özgü olan ve yukarıda yazıldığı gibi dosyanın herkes için çalıştırılabilir olmasını gerektiren (sadece siz değil) -perm
'ye dayanmaz.
-type f
önemlidir, çünkü * nix dizinlerinde gezilebilir olması için çalıştırılabilir olması gerekir ve sorgudan daha fazlası find
komutunda ise, komutunuz ne kadar verimli olursa o kadar verimli olur.
Her neyse, sadece başka bir yaklaşım önermek, çünkü * nix milyarlarca yaklaşımın ülkesidir.
Çalıştırılabilir olarak işaretlenmiş bir dosyanın yürütülebilir veya yüklenebilir bir dosya veya nesne olması gerekmez.
İşte kullandığım şey:
find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
case "$(head -n 1 "$1")" in
?ELF*) exit 0;;
MZ*) exit 0;;
#!*/ocamlrun*)exit0;;
esac
exit 1
' sh {} \; -print
Bir gömleğin hayranı olarak ...
find /usr/bin -executable -type f -print0 | xargs file | grep ASCII
Çıkışı find komutundan almak için 'xargs' kullanarak (boşluklu dosya adlarının doğru bir şekilde kullanıldığından emin olmak için print0 kullanılması). Artık çalıştırılabilir olan dosyaların bir listesine sahibiz ve 'file' komutunun parametresi olarak bunları birer birer sunuyoruz. Sonra ikilikleri yoksaymak için ASCII terimi için grep. Lütfen -executable yerine find komutunu hangi stile tercih ettiğinizi (önceki cevaplara bakın) veya 'NIX işletim sisteminizde neyin işe yaradığını yazın.
Root'un sahip olduğu komut dosyalarında eval içeren dosyaları bulması için yukarıdakileri istedim, bu nedenle root kullanıcısının güvensiz parametreleri içeren komut dosyalarını çalıştırdığı özel yükseltme zayıflıklarını bulmak için aşağıdakileri oluşturdum ...
echo -n "+ Identifying script files owned by root that execute and have an eval in them..."
find / -not \( -path /proc -Prune \) -type f -executable -user root -exec grep -l eval {} \; -exec file {} \; | grep ASCII| cut -d ':' -f1 > $outputDir"/root_owned_scripts_with_eval.out" 2>/dev/null &
Dizinlerde değil, sistem yolunda olmayan çalıştırılabilir dosyaları bulmak için bu gece ~/.bashrc
içinde bir işlev yarattım:
# Quickly locate executables not in the path
xlocate () {
locate -0r "$1" | xargs -0 -I{} bash -c '[[ -x "$1" ]] && [[ ! -d "$1" ]] \
&& echo "executable: $1"' _ {}
} # xlocate ()
Avantajı find
komutunun 15 dakika sürdüğü bir saniye içinde üç Linux dağıtımını ve bir Windows kurulumunu arayacağıdır.
Örneğin:
$ time xlocate llocate
executable: /bin/ntfsfallocate
executable: /home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/bin/ntfsfallocate
executable: /mnt/clone/home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/usr/bin/fallocate
executable: /mnt/e/bin/llocate
executable: /mnt/old/bin/ntfsfallocate
executable: /mnt/old/usr/bin/fallocate
executable: /usr/bin/fallocate
real 0m0.504s
user 0m0.487s
sys 0m0.018s
Veya bütün bir dizin ve bunun tümü için:
$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65
real 0m0.741s
user 0m0.705s
sys 0m0.032s