Jak mogę znaleźć tylko pliki wykonywalne w określonym katalogu w systemie Linux?
linux
command-line
bash
find
HaiYuan Zhang
źródło
źródło
file
polecenia ?ls -l | egrep '^[^d]..x..x..x.*$'
Powyższe spowoduje wyświetlenie wszystkich plików wykonywalnych (dla wszystkich / użytkowników i grup) w bieżącym katalogu. Uwaga : Ta-executable
opcja nie działa na komputerze Mac, dlatego powyższe obejście.-rwxr-x---
), Które mają uprawnienia do wykonywania na całym świecie, ale nie mają 750 ( ), które nadal mogą być wykonywane przez niektórych użytkowników.Odpowiedzi:
Sprawdzanie plików wykonywalnych można wykonać za pomocą
-perm
(niezalecane) lub-executable
(zalecane, ponieważ uwzględnia ACL). Aby użyć-executable
opcji:jeśli chcesz znaleźć tylko pliki wykonywalne i nie przeszukiwalne katalogi, połącz z
-type f
:źródło
-type x
.find: invalid predicate -executable'
na RHELUżyj opcji znalezienia
-perm
. Znajduje pliki w bieżącym katalogu, które mogą być wykonywane przez ich właściciela, członków grupy lub przez inne osoby:Edytować:
Właśnie znalazłem inną opcję, która jest obecna przynajmniej w GNU find 4.4.0:
Powinno to działać jeszcze lepiej, ponieważ uwzględniane są również listy ACL.
źródło
find: invalid mode
/ u = x, g = x, o = x''-perm /111
może być najbardziej przenośną wersją.Wiem, że pytanie konkretnie wspomina o Linuksie, ale ponieważ jest to pierwszy wynik w Google, chciałem tylko dodać odpowiedź, której szukałem (na przykład, jeśli jesteś - tak jak ja w tej chwili - zmuszony przez twojego pracodawcę do korzystania z systemu innego niż GNU / Linux).
Testowane na macOS 10.12.5
źródło
Mam inne podejście, na wypadek, gdyby naprawdę chciało się po prostu zrobić coś z plikami wykonywalnymi - i niekoniecznie zmuszać się do znalezienia filtru:
Wolę to, ponieważ nie zależy od tego,
-executable
która platforma jest specyficzna; i nie zależy od tego,-perm
co jest nieco tajemnicze, trochę specyficzne dla platformy, i jak napisano powyżej, wymaga, aby plik był wykonywalny dla wszystkich (nie tylko dla ciebie).Jest
-type f
to ważne, ponieważ w katalogach * nix musi być wykonywalny, aby można je było przechodzić, a im więcej zapytań znajduje się wfind
poleceniu, tym bardziej wydajna będzie pamięć.W każdym razie oferuje inne podejście, ponieważ * nix to kraina miliardów podejść.
źródło
find -perm
, wyszukuje pliki, które mają ustawiony dowolny bit wykonywania. (2) Natomiast ta odpowiedź znajduje tylko pliki, dla których bieżący użytkownik ma uprawnienia do wykonywania. To prawda, że może tego chce OP, ale nie jest jasne. … (Ciągdalszy)`…`
na$(…)
- zobacz to , to i to . (4) Ale nie róbfor i in $(find …); do …
; nie powiedzie się w nazwach plików zawierających spacje. Zamiast tego zróbfind … -exec …
. (5) A kiedy pracujesz ze zmiennymi powłoki, zawsze cytuj je (w podwójnych cudzysłowach), chyba że masz dobry powód, aby tego nie robić i jesteś pewien, że wiesz, co robisz.-perm
argument jako wymagający wszystkich trzech, a nie jednego. Ponadto dziękuję za wkład w ochronę argumentów powłoki, to wszystko, o czym nie wiedziałem.for i in
znajdź. -typ f; do [ -x $i ] && echo "$i is executable"; done
; brakuje ci części <katalog>, której używam kropki (.)Plik oznaczony jako wykonywalny nie musi być plikiem wykonywalnym ani plikiem lub obiektem, który można załadować.
Oto czego używam:
źródło
-name "*"
nie ma wpływu nafind
- zwykle znajduje wszystkie pliki, które nie są eliminowane przez testy.Jako fan jednego linera ...
Użycie „xargs” do pobrania danych wyjściowych z polecenia find (użycie print0 w celu zapewnienia poprawnej obsługi nazw plików ze spacjami). Mamy teraz listę plików, które można wykonać i podajemy je jeden po drugim jako parametr polecenia „file”. Następnie grep dla terminu ASCII, aby zignorować pliki binarne. Zastąp -executable w poleceniu find preferowanym stylem (patrz wcześniejsze odpowiedzi) lub działaniem w twoim systemie operacyjnym NIX
Wymagałem powyższego, aby znaleźć pliki eval w skryptach należących do roota, więc stworzyłem następujące informacje, aby pomóc w wykryciu słabości eskalacji prywatnych, w których użytkownik root uruchamia skrypty o niebezpiecznych parametrach ...
źródło
file
zgłasza kodowanie, więc skrypt w języku Python można zgłosić jakoa /usr/bin/python script, UTF-8 Unicode text executable
.find ... | xargs file -b | grep -v '^ELF'
może działać lepiej, aby wykryć pliki niebinarne.~/.bashrc
Dziś wieczorem utworzyłem funkcję, aby znaleźć pliki wykonywalne nie w ścieżce systemowej, a nie w katalogach:Zaletą jest to, że przeszuka trzy dystrybucje systemu Linux i instalację systemu Windows w ciągu sekundy, gdzie
find
polecenie zajmuje 15 minut.Na przykład:
Lub dla całego katalogu i wszystkich jego subskrybentów:
źródło