Próbuję znaleźć skuteczny sposób na wykonanie 5 poziomu wyzwania bandyty OverTheWire .
W każdym razie mam kilka plików i tylko jeden spełnia następujące kryteria:
- Czytelny dla człowieka
- Rozmiar 1033 bajtów
- Niewykonalny
Obecnie używam find
polecenia i mogę znaleźć pliki spełniające 2 ostatnie kryteria:
find . -size 1033c ! -executable
Nie wiem jednak, jak usprawiedliwić pliki nieczytelne dla człowieka. Rozwiązania, które znalazłem dla tego wyzwania, wykorzystują -readable
parametr testowy, ale nie sądzę, żeby to działało. -readable
patrzy tylko na uprawnienia do plików, a nie na ich zawartość, podczas gdy opis wyzwania prosi o plik ASCII lub coś w tym rodzaju.
Odpowiedzi:
Tak, możesz użyć,
find
aby wyszukać pliki wykonywalne o odpowiednim rozmiarze, a następnie użyć,file
aby sprawdzić ASCII. Coś jak:Pytanie nie jest jednak tak proste, jak się wydaje. „Czytelny dla człowieka” to strasznie niejasne określenie. Prawdopodobnie masz na myśli tekst. OK, ale jaki rodzaj tekstu? Tylko znak łaciński ASCII? Pełny Unicode? Weźmy na przykład następujące trzy pliki:
Wszystkie są czytelne dla ludzi i tekstu. Zobaczmy teraz, co
file
je tworzy:Tak więc
find
powyższe polecenie znajdzie tylkofile1
(na potrzeby tego przykładu wyobraźmy sobie, że pliki te miały 1033 znaki). Możesz rozwinąć,find
aby wyszukać ciągtext
:Za pomocą
-w
,grep
drukuje tylko wiersze, w którychtext
występuje jako samodzielne słowo. Który powinien być dość blisko tego, co chcesz, ale nie mogę zagwarantować, że nie ma innego typu pliku, którego opis może również zawierać ciągtext
.źródło
Chociaż
-exec
jest najczęściej używany do robienia czegoś z plikami, które zostały znalezione, może również działać jako test. Dlatego możemy dodać go do innych kryteriów:Pamiętaj,
grep
zwraca wartość niezerową, gdy wzorzec nie został znaleziony, ish -c "COMMAND"
zwróci wynik oceny (o ile jest poprawny). Spowoduje to więc wydrukowanie tylko plików, w którychfile <filename>
wypluwa się coś, co kończy się natext
, np. „UTF-8 Unicode text” lub „ASCII text”, ale nie „Text non-ISO Extended-ASCII, z sekwencjami ucieczki”.W jednym wierszu jest nawet krótszy niż przejście
xargs
:Pamiętaj, że możesz zastąpić
sh -c 'file {} | grep "text$"'
dowolne niestandardowe polecenie. Jeśli chcesz sprawdzić coś bardzo złożonego, lepszym pomysłem może być udostępnienie skryptu powłoki i użycie go:co na dłuższą metę jest łatwiejsze do utrzymania niż historia twojej powłoki:
źródło
text$
wyklucza rzeczy rozpoznawane jako skrypty powłoki. Wszystko z shebang jest identyfikowane jako skrypt, a te są doskonale czytelne dla ludzi.źródło
Musisz tylko użyć:
To da ci jedyny plik zawierający hasło.
źródło
Po prostu uruchom następujące polecenie w stosunku do zawartości katalogu:
źródło
Spróbuj tych połączonych poleceń. działa na mojej stacji.
źródło
Możesz tego spróbować
Twoje wyzwanie nie pozwala
grep
. plik hasła zostanie zgłoszony jako „tekst ASCII, z bardzo długimi liniami”źródło
Aby odfiltrować nazwy plików czytelne dla człowieka, możesz użyć
[:print:]
( klasy drukowalnej ) nazwy klasy znaków . Więcej informacji o takich klasach znajdziesz w instrukcji dlagrep
.Z drugiej strony wymóg „czytelny dla człowieka” może odnosić się do zawartości pliku, a nie jego nazwy. Innymi słowy, szukałbyś plików tekstowych . To trochę trudniejsze. Zgodnie z sugestią @D_Bye w komentarzu, należy użyć
file
polecenia, aby określić typ zawartości pliku. Ale nie byłoby dobrym pomysłem uruchamianiefile
po potoku, ponieważ skomplikowałoby to zadanie wyświetlania nazwy pliku. Oto, co sugeruję:Oto pokrótce, jak
file
działa -part:-exec
Wykonuje predykatywnychsh -c 'file -b $0 | grep -q text' FILENAME
dla każdegoFILENAME
, które spełnia wszystkie poprzednie warunki (typ, rozmiar, nie wykonywany).sh
) uruchamia ten krótki scenariusz :file -b $0 | grep -q text
, zastępując$0
z nazwy pliku.file
Program określa typ zawartości każdego pliku i wysyła tę informację. Ta-b
opcja zapobiega drukowaniu nazwy każdego testowanego pliku.grep
filtruje wyjście pochodzące zfile
programu, wyszukując wiersze zawierające „tekst” . (Przekonaj się, jak wygląda typowe wyjściefile
polecenia).grep
nie wyświetla przefiltrowanego tekstu, ponieważ ma-q
podaną opcję (cichą). To, co robi, to po prostu zmień status wyjścia na albo0
(co oznacza „prawda” - znaleziono przefiltrowany tekst) lub 1 (co oznacza „błąd” - tekst „tekst” nie pojawił się na wyjściu zfile
).grep
przepuszcza dalejsh
sięfind
i działa jako wynik końcowy całego „-exec sh -c 'file $0 | grep -q text' {} \;
” test.-print
polecenie jest wykonywane (tzn. Wypisywana jest nazwa testowanego pliku).źródło
źródło
dostanie plik z ćwiczenia
źródło
Fan jednego z wkładek
źródło
Myślę, że dłuższy sposób na znalezienie hasła dla tego poziomu bandyty wspomniany przez większość powyżej przy użyciu funkcji find i grep jest najbardziej opisowym poleceniem.
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
Ale po użyciu komendy „file” bardziej uświadomiłem sobie, że łatwo jest zlokalizować pliki czytelne dla ludzi (inaczej ASCII na tym poziomie) w ten sposób, sprawdzając całe typy plików katalogów. Katalog inhere przechowuje pliki o nazwie „-filexx” lub szybko sprawdza cały katalog inhere za pomocą
file ./*
Oto moje podejście.
źródło
dostanie twój wynik
źródło