Zmień temat, tak aby zawierał słowo „binarne”, które jest kluczem do udzielenia odpowiedzi na pytanie.
Stefan Lasiewski
Odpowiedzi:
44
Możesz wypróbować filenarzędzie. Według strony podręcznika:
Magiczne testy służą do sprawdzania plików z danymi w określonych stałych formatach. Kanonicznym przykładem tego jest binarny plik wykonywalny (skompilowany program) a.out, którego format jest zdefiniowany i ewentualnie w standardowym katalogu dołączania.
Być może będziesz musiał bawić się wyrażeniem regularnym, ale coś takiego:
Powiedziałbym użyć find -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print. Da ci tylko pliki (a zatem może zostać przekazany do następnego polecenia, które chce uruchomić)
Gert
Rozwiązanie serverfault.com/a/584595/211551 znajduje pliki, które NIE są oznaczone jako pliki wykonywalne, ale są pliki wykonywalne.
user2067125,
W systemie OS X możesz zainstalować GNU findz brew install findutilslub, sudo port install findutilsa następnie możesz uruchomić takie wywołanie z podobnym skutkiem:gfind . -type f -executable -exec file '{}' \; | grep -i execut
GDP2
7
Oto sposób na wykluczenie skryptów, tj. Plików, których pierwsze dwa znaki to #!:
find -type f -executable -exec sh -c 'test "$(head -c 2 "$1")" != "#!"' sh {} \; -print
W przypadku niektórych rodzajów plików nie jest jasne, czy mają być klasyfikowane jako skrypty, czy binarne, na przykład pliki kodu bajtowego. W zależności od konfiguracji rzeczy mogą, ale nie muszą zaczynać #!. Jeśli mają one dla Ciebie znaczenie, będziesz musiał skomplikować skrypt wewnętrznej powłoki. Na przykład, oto, w jaki sposób możesz dołączyć pliki binarne ELF i pliki wykonywalne Mono oraz programy kodu bajtowego Objective Caml, ale nie inne rodzaje plików wykonywalnych, takie jak skrypty powłoki lub skrypty perl lub programy bajtowe JVM:
find -type f -executable -exec sh -c '
case "$(head -n 1 "$1")" in
?ELF*) exit 0;;
MZ*) exit 0;;
#!*/ocamlrun*) exit 0;;
esac
exit 1
' sh {} \; -print
Na wypadek, gdybyś znalazł się w systemie z niższym poziomem find(wciąż, jak piszę, istnieje wiele klastrów naukowych z systemem RHEL5!) Bez uprawnień do aktualizacji: zamiast
find /mypath/ -executable -type f
w powyższych doskonałych odpowiedziach możesz zrobić np.
find /mypath/h -type f -perm -u+x
który wyszukuje bity uprawnień. Niestety powyższe znajduje tylko pliki, dla których użytkownik ma plik wykonywalny, ale to zwykle działa dla mnie.
Odpowiedzi:
Możesz wypróbować
file
narzędzie. Według strony podręcznika:Być może będziesz musiał bawić się wyrażeniem regularnym, ale coś takiego:
plik ma wiele opcji, więc możesz przyjrzeć się bliżej stronie man. Użyłem pierwszej znalezionej opcji, która wydawała się dawać wynik łatwy do grepa.
źródło
find -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print
. Da ci tylko pliki (a zatem może zostać przekazany do następnego polecenia, które chce uruchomić)find
zbrew install findutils
lub,sudo port install findutils
a następnie możesz uruchomić takie wywołanie z podobnym skutkiem:gfind . -type f -executable -exec file '{}' \; | grep -i execut
Oto sposób na wykluczenie skryptów, tj. Plików, których pierwsze dwa znaki to
#!
:W przypadku niektórych rodzajów plików nie jest jasne, czy mają być klasyfikowane jako skrypty, czy binarne, na przykład pliki kodu bajtowego. W zależności od konfiguracji rzeczy mogą, ale nie muszą zaczynać
#!
. Jeśli mają one dla Ciebie znaczenie, będziesz musiał skomplikować skrypt wewnętrznej powłoki. Na przykład, oto, w jaki sposób możesz dołączyć pliki binarne ELF i pliki wykonywalne Mono oraz programy kodu bajtowego Objective Caml, ale nie inne rodzaje plików wykonywalnych, takie jak skrypty powłoki lub skrypty perl lub programy bajtowe JVM:źródło
Na wypadek, gdybyś znalazł się w systemie z niższym poziomem
find
(wciąż, jak piszę, istnieje wiele klastrów naukowych z systemem RHEL5!) Bez uprawnień do aktualizacji: zamiastw powyższych doskonałych odpowiedziach możesz zrobić np.
który wyszukuje bity uprawnień. Niestety powyższe znajduje tylko pliki, dla których użytkownik ma plik wykonywalny, ale to zwykle działa dla mnie.
źródło