it-swarm.asia

Linux'ta yalnızca belirli bir dizindeki yürütülebilir dosyaları nasıl bulabilirim?

Linux'ta yalnızca belirli bir dizindeki yürütülebilir dosyaları nasıl bulabilirim?

145
HaiYuan Zhang

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
148
knittl

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.

31
innaM

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
12
friederbluemle

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.

3
Mark McKenna

Ç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
2

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 &
1

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
0