2009-09-10 11:56:56 +0000 2009-09-10 11:56:56 +0000
170
170

Jak mogę znaleźć tylko pliki wykonywalne pod określonym katalogiem w systemie Linux?

Jak mogę znaleźć tylko pliki wykonywalne pod określonym katalogiem w systemie Linux?

Odpowiedzi (7)

170
170
170
2009-09-10 11:59:26 +0000

Sprawdzanie plików wykonywalnych można wykonać za pomocą -perm (nie zalecane) lub -executable (zalecane, ponieważ uwzględnia ACL). Aby skorzystać z opcji -executable:

find <dir> -executable

jeśli chcesz znaleźć tylko pliki wykonywalne, a nie przeszukiwalne katalogi, połącz z -type f:

find <dir> -executable -type f
35
35
35
2009-09-10 15:55:13 +0000

Użyj opcji znaleziska -perm. To znajdzie pliki w bieżącym katalogu, które są albo wykonywane przez ich właściciela, przez członków grupy lub przez innych:

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

Edycja:

Właśnie znalazłem inną opcję, która jest obecna przynajmniej w GNU find 4.4.0:

find . -executable

To powinno działać jeszcze lepiej, ponieważ ACL są również brane pod uwagę.

16
16
16
2017-06-01 06:59:33 +0000

Wiem, że pytanie odnosi się konkretnie do Linuksa, ale ponieważ jest to pierwszy wynik w Google, chciałem tylko dodać odpowiedź, której szukałem (na przykład, jeśli jesteś - jak ja w tej chwili - zmuszony przez swojego pracodawcę do korzystania z systemu innego niż GNU/Linux).

Testowany na macOS 10.12.5

find . -perm +111 -type f
3
3
3
2016-04-24 02:38:26 +0000

Mam inne podejście, na wypadek gdybyś naprawdę chciał zrobić coś z plikami wykonywalnymi - a nie koniecznie wymusić na nim filtrowanie:

for i in `find -type f`; do [-x $i] && echo "$i is executable"; done

Wolę to, ponieważ nie opiera się na -executable, który jest specyficzny dla danej platformy; i nie opiera się na -perm, który jest nieco tajemniczy, nieco specyficzny dla danej platformy, i jak napisano powyżej wymaga, aby plik był wykonywalny dla wszystkich (nie tylko dla Ciebie).

-type f jest ważny, ponieważ w *katalogach *nix musi być wykonywalny, aby mógł być przesuwany, i im więcej zapytań jest w komendzie find, tym bardziej wydajna będzie pamięć twojej komendy.

Tak czy inaczej, po prostu oferuję inne podejście, ponieważ *nix jest krainą miliarda podejść.

2
2
2
2014-03-26 07:52:24 +0000

Plik oznaczony jako wykonywalny nie musi być plikiem lub obiektem wykonywalnym lub ładowalnym.

Oto czego używam:

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
1
1
1
2017-07-09 12:31:14 +0000

Jako wentylator jednej wkładki…

find /usr/bin -executable -type f -print0 | xargs file | grep ASCII

Używając ‘xargs’ do pobrania danych wyjściowych z polecenia find (używając print0 do zapewnienia, że nazwy plików ze spacjami są obsługiwane poprawnie). Mamy teraz listę plików, które są wykonywalne i podajemy je, jeden po drugim, jako parametr polecenia ‘file’. Następnie chwalimy się terminem ASCII, aby ignorować pliki binarne. Proszę zastąpić -executable w poleceniu find tym, który styl preferujesz (zobacz wcześniejsze odpowiedzi) lub tym, który działa na twoim ‘NIX OS

Wymagałem powyższego, aby znaleźć pliki z evalem w skryptach należących do roota, więc stworzyłem poniższe, aby pomóc znaleźć słabości eskalacji priv, gdzie użytkownik root uruchamia skrypty z niebezpiecznymi parametrami…

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 &
0
0
0
2019-06-06 00:08:27 +0000

Stworzyłem funkcję w ~/.bashrc dziś wieczorem, aby znaleźć pliki wykonywalne nie w ścieżce systemowej i nie w katalogach:

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

Zaletą jest to, że przeszuka trzy dystrybucje Linuksa i instalację Windows w ciągu sekundy, gdzie polecenie find trwa 15 minut.

Na przykład:

$ 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

Albo dla całego katalogu i wszystkich jego podkatalogów:

$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65

real 0m0.741s
user 0m0.705s
sys 0m0.032s