Końcówka kapelusza do @Cynk gniourf_gniourf w celu wyjaśnienia fundamentalnego nieporozumienia.
Ta odpowiedź jest próbą przedstawienia przeglądu istniejących odpowiedzi i omówienia ich subtelności i względnych zalet, a także przedstawienia podstawowych informacji , szczególnie w odniesieniu do przenośności .
Wyszukiwanie plików wykonywalnych może odnosić się do dwóch różnych przypadków użycia :
- zorientowany na użytkownika : znajdź pliki, które są wykonywane przez bieżącego użytkownika .
- file-centric : znajdź pliki, które mają (jeden lub więcej) ustawiony wykonywalnych bitów uprawnień .
Zauważ, że w obu przypadkach sensowne może być użyciefind -L ...
zamiast tylko find ...
w celu znalezienia dowiązań symbolicznych do plików wykonywalnych .
Zauważ, że najprostszy przypadek dotyczący plików - szukanie plików wykonywalnych z bitem uprawnień do plików wykonywalnych ustawionym dla WSZYSTKICH trzech podmiotów zabezpieczeń (użytkownika, grupy, innych) - zazwyczaj , choć niekoniecznie, daje takie same wyniki, jak scenariusz skoncentrowany na użytkowniku - i ważne, aby zrozumieć różnicę.
Zorientowany na użytkownika (-executable
)
Odpowiedź Zaakceptowany pochlebnie zaleca -executable
, JEŚLI GNU find
jest dostępna.
- GNU
find
jest dostarczane z większością dystrybucji
Linuksa
- Z kolei platformy oparte na BSD, w tym macOS, są wyposażone w funkcję wyszukiwania BSD, która jest mniej wydajna.
- Zgodnie ze scenariuszem
-executable
dopasowuje tylko pliki, które może wykonać bieżący użytkownik (istnieją przypadki skrajne. [1] ).
BSD find
alternatywa oferowana przez odpowiedź akceptowanego ( -perm +111
) odpowiada na inny , plików -centric pytanie (jak sama odpowiedź Zjednoczonych).
- Używając tylko
-perm
do odpowiedzi użytkownika -centric pytanie jest niemożliwe , ponieważ to, co potrzebne jest, aby odnosić się w pliku na użytkownika i grupowej tożsamości do bieżącego użytkownika , natomiast-perm
może testować jedyny na plik za uprawnienia.
Używając tylko funkcji POSIXfind
, nie można odpowiedzieć na to pytanie bez zaangażowania zewnętrznych narzędzi.
Tak więc najlepiej-perm
można zrobić (sam w sobie) jest przybliżenie z -executable
. Być może bliższe przybliżenie niż -perm +111
jest-perm -111
, aby znaleźć pliki, które mają ustawiony bit wykonywalny dla WSZYSTKICH podmiotów zabezpieczeń (użytkownika, grupy, innych) - wydaje mi się to typowym scenariuszem w świecie rzeczywistym. Jako bonus, zdarza się, że jest również zgodny z POSIX (użyj find -L
do dołączania dowiązań symbolicznych, wyjaśnienie poniżej):
find . -type f -perm -111 # or: find . -type f -perm -a=x
Odpowiedź gniourf_gniourf dostarcza prawdziwego, przenośnego odpowiednika-executable
używania-exec test -x {} \;
, choć kosztem wydajności .
Łączenie -exec test -x {} \;
z -perm +111
(tj. Plikami z co najmniej jednym ustawionym bitem wykonywalnego) może pomóc w osiągnięciu wydajności, która exec
nie musi być wywoływana dla każdego pliku (poniżej użyto zgodnego z POSIX odpowiednika wyszukiwania BSD -perm +111
/ GNU find -perm /111
; wyjaśnienie znajduje się poniżej) :
find . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \) -exec test -x {} \; -print
Zorientowane na pliki ( -perm
)
- Do odpowiedzieć plików -centric pytania , to jest wystarczające, aby korzystać z POSIX
-perm
podstawowy (znany jako badania w terminologii znaleźć GNU).
-perm
pozwala przetestować dowolne uprawnienia do plików, a nie tylko wykonalność.
- Uprawnienia są określane w trybie ósemkowym lub symbolicznym . Tryby ósemkowe to liczby ósemkowe (np.
111
), Podczas gdy tryby symboliczne to łańcuchy (np a=x
.).
- Tryby symboliczne identyfikują podmioty zabezpieczeń jako
u
(użytkownik), g
(grupa) i o
(inne) luba
odnoszą się do wszystkich trzech. Uprawnienia są wyrażone x
w pliku wykonywalnego, na przykład, a przyporządkowana do zleceniodawcy pomocą operatorów =
, +
i -
; na pełną dyskusję, włącznie z trybami ósemkowym zobaczyć specyfikację POSIX dla chmod
użyteczność .
- W kontekście
find
:
- Przedrostek trybu z
-
(np., -ug=x
) Oznacza: dopasowywanie plików, które mają wszystkie uprawnienia określone (ale pasujące pliki mogą mieć dodatkowe uprawnienia).
- Mający bez prefiksu (np
755
) znaczy: pliki meczu, że mają tego pełną, dokładną zestaw uprawnień.
- Uwaga : zarówno GNU find, jak i BSD find implementują dodatkowy, niestandardowy przedrostek z logiką-ANY-of-the-specified-permission-set-set , ale robią to z niekompatybilną składnią :
- BSD znajdź:
+
- Znalezienie GNU:
/
[2]
- Dlatego unikaj tych rozszerzeń, jeśli Twój kod musi być przenośny .
- Poniższe przykłady przedstawiają przenośne odpowiedzi na różne pytania dotyczące plików.
Przykłady poleceń skoncentrowanych na plikach
Uwaga:
- Następujące przykłady są zgodne z POSIX , co oznacza, że powinny działać w każdej implementacji zgodnej z POSIX, włączając wyszukiwanie GNU i BSD; w szczególności wymaga to:
- NIE używa niestandardowych przedrostków trybu
+
ani/
.
- Korzystanie z POSIX-owych form podstawowych operatorów logicznych :
!
dla NOT (pozwalają również znaleźć GNU i BSD -not
); Zwróć uwagę, że \!
jest używany w przykładach w celu ochrony!
przed ekspansjami historii powłoki
-a
dla AND (GNU find i BSD find także pozwalają -and
)
-o
dla OR (pozwalają również znaleźć GNU i BSD -or
)
- W przykładach zastosowano tryby symboliczne , ponieważ są one łatwiejsze do odczytania i zapamiętania.
- Z przedrostkiem trybu
-
, operatory =
i +
mogą być używane zamiennie (np. -u=x
Jest równoważne -u+x
- chyba że zastosujesz -x
później, ale nie ma to sensu).
- Służy
,
do łączenia trybów częściowych; Logika AND jest implikowana; np. -u=x,g=x
oznacza, że musi być ustawiony zarówno bit wykonywalny użytkownika, jak i grupa.
- Tryby same w sobie nie mogą wyrażać negatywnego dopasowania w sensie „dopasuj tylko wtedy, gdy ten bit NIE jest ustawiony”; należy użyć osobnego
-perm
wyrażenia z NOT podstawowym, !
.
- Należy pamiętać, że znalezienie w prawyborach (takie jak
-print
, lub -perm
; znany również jako działań i badań w GNU znaleźć) są domyślnie połączone z -a
(logiczne AND), a że -o
i ewentualnie nawiasów (uciekły jak \(
i\)
dla powłoki) są potrzebne do wdrożenia lub logiczny.
find -L ...
zamiast just find ...
służy do dopasowywania dowiązań symbolicznych do plików wykonywalnych
-L
instruuje find, aby oceniać cele dowiązań symbolicznych zamiast samych dowiązań symbolicznych; Dlatego bez -L
, -type f
całkowicie zignorowałoby dowiązania symboliczne.
# Match files that have ALL executable bits set - for ALL 3 security
# principals (u (user), g (group), o (others)) and are therefore executable
# by *anyone*.
# This is the typical case, and applies to executables in _system_ locations
# (e.g., /bin) and user-installed executables in _shared_ locations
# (e.g., /usr/local/bin), for instance.
find -L . -type f -perm -a=x # -a=x is the same as -ugo=x
# The POSIX-compliant equivalent of `-perm +111` from the accepted answer:
# Match files that have ANY executable bit set.
# Note the need to group the permission tests using parentheses.
find -L . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \)
# A somewhat contrived example to demonstrate the use of a multi-principial
# mode (comma-separated clauses) and negation:
# Match files that have _both_ the user and group executable bit set, while
# also _not_ having the other executable bit set.
find -L . -type f -perm -u=x,g=x \! -perm -o=x
[1] Opis stanu -executable
z man find
GNU znaleźć 4.4.2:
Dopasowuje pliki, które są wykonywalne i katalogi, które można przeszukiwać (w sensie rozpoznawania nazw plików). Uwzględnia to listy kontroli dostępu i inne artefakty uprawnień, które test -perm ignoruje. Ten test wykorzystuje wywołanie systemowe access (2), więc może zostać oszukany przez serwery NFS, które wykonują mapowanie UID (lub wycinanie rootów), ponieważ wiele systemów implementuje dostęp (2) w jądrze klienta i nie może korzystać z informacje o odwzorowaniu UID przechowywane na serwerze. Ponieważ ten test jest oparty tylko na wyniku wywołania systemowego access (2), nie ma gwarancji, że plik, dla którego ten test się powiedzie, będzie mógł rzeczywiście zostać wykonany.
[2] GNU find wersje starsze niż 4.5.12 również dopuszczały prefiks +
, ale najpierw został on uznany za przestarzały i ostatecznie usunięty, ponieważ łączenie +
z trybami symbolicznymi daje prawdopodobnie nieoczekiwane rezultaty, ponieważ jest interpretowane jako dokładna maska uprawnień. Jeśli ty (a) prowadzony w wersji przed 4.5.12 i (b) nie ogranicza się do ósemkowe trybów tylko, to mógłby uciec z korzystaniem +
z obu GNU znaleźć i BSD znaleźć, ale nie jest to dobry pomysł.