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


157

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


İşte bir tür BASH betiği, fena değil, söyleyebileceğim şey :) stackoverflow.com/tr/20209457/2067125
AjayKumarBasuthkar

Standart filekomutu kullanmaya ne dersiniz ?
Atılım

5
Bunu Mac'te yapmak isteyen herkes için (OS X 10.9.5'te test edilmiştir): ls -l | egrep '^[^d]..x..x..x.*$' Yukarıdakiler geçerli dizindeki tüm yürütülebilir dosyaları (tümü / kullanıcı ve grup için) listeler. Not : Bu -executableseçenek bir Mac üzerinde çalışmadığından yukarıdaki geçici çözümü kullanır.
techfoobar


1
@techfoobar: Soru belirsiz: Yürütülebilir kod içeren dosyalar mı yoksa çalıştırılabilir izinlere sahip dosyalar mı? Ancak, yürütülebilir izinlerin ne istediğini kabul etsek bile (cevapların çoğunluğunun göründüğü gibi), soru dünyaca uygulanabilir olduğunu söylemez . Çözümünüz, -rwxr-x---bazı kullanıcılar tarafından hala çalıştırılabilen 750 ( ) olmayan, dünya üzerinde yürütme iznine sahip dosyaları (ve ayrıca beşleri, soketleri, sembolik bağlantıları vb.) Bulacaktır .
G-Man

Yanıtlar:


157

Yürütülebilir dosyaları denetleme -perm(önerilmez) veya -executable(ACL'yi hesaba kattığı için önerilir) ile yapılabilir . -executableSeçeneği kullanmak için :

find <dir> -executable

Yalnızca çalıştırılabilir dosyaları bulmak ve aranabilir dizinleri bulmak istemiyorsanız, şunlarla birleştirin -type f:

find <dir> -executable -type f

23
Bir shebang onların çalıştırılabilir olduğu anlamına gelmez. bize sadece hangi tercümanın kullanılacağını söyler. ve linux tanımıyla "çalıştırılabilir dosyalar" çalıştırılabilir (x) bit setli dosyalardır
knittl 10:09

2
Hangi tip find -type türünü destekler? adam benim sistemimde b, c, d, p, f, l, s ve D listelerini bulur.
innaM

2
Aynı, benim buldum da yok -type x.
davr

7
Eski bir sürümüne sahipseniz (muhtemelen 4.3.8'den önce) hangisi -ecececredise kullanılamaz. -perm / u = x, g = x, o = x
Ludwig Weinzierl

8
find: invalid predicate -executable'RHEL
SSH Bu

33

Bulun -permseçeneğini kullanın. Bu, geçerli dizindeki dosyaları sahibinin, grup üyelerinin veya başkalarının çalıştırdığı dosyaları bulur:

find . -perm /u=x,g=x,o=x

Düzenle:

Az önce GNU’da bulunan 4.4.0’da bulunan başka bir seçenek buldum:

find . -executable

ACL'ler de dikkate alındığından, bu daha iyi çalışmalıdır.


2
Bu yalnızca yeni bir bulma sürümünde çalışır. Varsayılan olarak CentOS ile gelen hata find: invalid mode / u = x, g = x, o =
x'`

12
Öyleyse GNU find'ta şu anda kullanımdan kaldırılan "-perm +" sürümünü denemelisiniz: find.
-perm

-perm /111En taşınabilir sürüm gibi görünüyor .
Scott

12

Sorunun özellikle Linux'tan bahsettiğini biliyorum, ancak Google’ın ilk sonucu 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).

Üzerinde test MacOS 10.12.5

find . -perm +111 -type f

1
RHEL 5'te de çalışır.
José Tomás Tocino

Bu, OS X 10.14, thx üzerinde çalışabileceğim tek değişken
Justin

3

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ü -executablehangisinin platforma özgü olduğuna güvenmiyor ; ve -permhangi biraz arcane, biraz platforma özgüdür ve yukarıda yazıldığı gibi dosyanın herkes için çalıştırılabilir olmasını gerektirir (sadece siz değil).

Bu -type fönemlidir, çünkü * nix dizinlerinin geçilebilir olması için çalıştırılabilir olması gerekir ve sorguda finddaha fazla komut varsa, komutunuz o kadar verimli olur.

Her neyse, sadece başka bir yaklaşım önermek, çünkü * nix milyarlarca yaklaşımın ülkesidir.


(0) Hangisini tercih ediyorsun, eğlenceyi, düzeltmeyi ya da sezgisel ve kusurlu? Ben doğru tercih ederim. (1)  innaM cevabı , özellikli find -perm, sahip dosyaları bulur herhangi izni bit kümesi yürütün. (2) Buna karşılık, bu cevap sadece geçerli kullanıcının izin verdiği dosyaları bulur. Verilen, OP'nin istediği şey olabilir, ancak belirsiz. … (Devam ediyor)
Scott

(Devam ediyor)… (3) Netlik için, değiştirmek `…`isteyebilirsiniz $(…)- bunu , bunu ve bunu görün . (4) Ama yapma for i in $(find …); do …; boşluk içeren dosya isimlerinde başarısız olur. Bunun yerine yapın find … -exec …. (5) Kabuk değişkenleriyle çalışırken, yapmamanın iyi bir sebebi yoksa ve ne yaptığını bildiğinden eminsen, daima (çift tırnak içinde) alıntı yap.
Scott,

@scott Tamam, düzeltilmiş duruyorum :) -permArgümanı üçünü de zorunlu olarak okudum, bunlardan birini değil. Ayrıca, kabuk argümanlarını koruma konusundaki katkınız için teşekkür ederim, bilmediğim her şey bu.
Mark McKenna

@MarkMcKenna orada bir yazım hatası var: for i in bulun. tipi f ; do [ -x $i ] && echo "$i is executable"; done; bir nokta kullandığım <dir> kısmını
özlüyorsun

2

Ç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
Bu ne işe yarıyor?
DerMike

@DerMike, .so dosyaları da dahil olmak üzere mevcut dizinde çalıştırılabilir bulmanın yollarından biridir, bir dosya çalıştırılabilir olarak işaretlenmemiş olsa bile.
AjayKumarBasuthkar 14:15

Yani, bunu nasıl yapıyor?
DerMike

Bulmak için dosyanın başlığından okur, her ikili dosya veya komut dosyasının başlığına sahiptir.
AjayKumarBasuthkar

Bildiğim kadarıyla -name "*", hiçbir etkisi olmaz find- normalde sınamalarla silinmeyen tüm dosyaları bulur.
G-Man

1

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 bir dosya listesine sahibiz ve bunları 'file' komutunun parametresi olarak tek tek sağlıyoruz. Sonra ASCII teriminin ikili dosyaları yoksaymasını bekleyin. Lütfen -executable işlevini find komutunun yerine hangi stili tercih ettiğinizi (önceki yanıtlara bakın) veya 'NIX işletim sisteminizde neyin işe yaradığını yazın

Root'un sahip olduğu betiklerde eval içeren dosyaları bulması için yukarıdakileri istedim, bu nedenle root kullanıcısının güvensiz parametrelerle betikleri çalıştırdığı yerlerde ö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 &

Komut dosyası ASCII olmayan karakterler içeriyorsa bu işe yaramaz. filekodlamayı bildirir, böylece bir python betiği olarak bildirilebilir a /usr/bin/python script, UTF-8 Unicode text executable. find ... | xargs file -b | grep -v '^ELF'İkili olmayanları bulmak için daha iyi çalışabilir.
xenoid

0

Bu ~/.bashrcgece, sistem yolunda değil dizinlerde çalıştırılabilir dosyalar bulmak için bir işlev oluşturdum :

# Quickly locate executables not in the path
xlocate () {
    locate -0r "$1" | xargs -0 -I{} bash -c '[[ -x "$1" ]] && [[ ! -d "$1" ]] \
        &&  echo "executable: $1"'  _  {}
} # xlocate ()

Bunun avantajı, findkomutun 15 dakika sürdüğü bir saniyede üç Linux dağıtımını ve bir Windows kurulumunu arayacak olması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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.