Polecenia UNIX - znajdź


9

Próbuję nauczyć się komend UNIX i gram w tę grę, aby się uczyć i w tej chwili naprawdę utknąłem. Jestem na serwerze przez ssh, a katalog jest pełen losowych plików i folderów, a hasło do następnego poziomu znajduje się w jednym z plików. Powiedziano mi, że plik ma następujące attrbutes:

  • czytelny dla człowieka
  • 1033 bajtów
  • niewykonywalny

Zgaduję, że powinienem użyć findpolecenia i próbowałem, find ! -executableale to zwróciło ładunek plików. Jedyną czytelną dla człowieka pomocą, którą mogę znaleźć w instrukcji lub w Internecie, jest wydrukowanie rozmiarów plików w postaci czytelnej dla człowieka. Więc jestem trochę zagubiony?

Próbowałem też, find ~ -size 1033bale to nic nie zwróciło. Ale kiedy próbowałem find ~ -size -1033b, zwróciło każdy plik w katalogu.


Naprawdę chciałbym dowiedzieć się więcej o tej grze!
ivanivan

2
@ivanivan bandit.overthewire.org
avgvstvs

Odpowiedzi:


16

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 dla grep.

find . -type f -size 1033c -name "[[:print:]]*" ! -executable

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ć filepolecenia, aby określić typ zawartości pliku. Ale nie byłoby dobrym pomysłem uruchamianie fileza potokiem, ponieważ skomplikowałoby to zadanie wyświetlania nazwy pliku. Oto, co sugeruję:

find . -type f -size 1033c ! -executable -exec sh -c 'file -b $0 | grep -q text' {} \; -print

Oto pokrótce, jak filedziała -part:

  • W -execWykonuje predykatywnych sh -c 'file -b $0 | grep -q text' FILENAMEdla każdego FILENAME, które spełnia wszystkie poprzednie warunki (typ, rozmiar, nie wykonywany).
  • Dla każdego z tych plików, powłoki ( sh) uruchamia ten krótki scenariusz : file -b $0 | grep -q text, zastępując $0z nazwy pliku.
  • fileProgram określa typ zawartości każdego pliku i wysyła tę informację. Ta -bopcja uniemożliwia wydrukowanie nazwy każdego testowanego pliku.
  • grepfiltruje wyjście pochodzące z fileprogramu, wyszukując wiersze zawierające „tekst” . (Przekonaj się, jak wygląda typowe wyjście filepolecenia).
  • Ale grepnie wyświetla przefiltrowanego tekstu, ponieważ ma -qpodaną opcję (cichą). To, co robi, to po prostu zmień status wyjścia na albo 0(co oznacza „prawda” - znaleziono przefiltrowany tekst) lub 1 (co oznacza „błąd” - tekst „tekst” nie pojawił się na wyjściu z file).
  • Prawdziwy / false status wyjścia pochodzące z grepprzepuszcza dalej shsię findi działa jako wynik końcowy całego „ -exec sh -c 'file $0 | grep -q text' {} \;” test.
  • W przypadku, gdy powyższy test zwrócił wartość true , -printpolecenie jest wykonywane (tzn. Wypisywana jest nazwa testowanego pliku).

Wiem, że to stare, ale chcę dodać, że użycie find . -type f -size 1033czwróci również tę samą odpowiedź.
Brandon Benefield,

8
find . -type f -readable -size 1033c ! -executable

Zauważ, że użyłem czamiast brozmiaru pliku. bjest dla 512 bajtów bloków. cjest dla rzeczywistych bajtów.


2
Nie sądzę, by -readableznaczyło to dla człowieka (tzn. Nie binarnie)
hhaamu,

1
@hhaamu - racja. Jednak prawdopodobnie nie jest źle odfiltrować pliki, których użytkownik nie ma prawa do odczytu! W celu ustalenia, czy plik zawiera treści czytelnych dla ludzi, rur nazwy zwracane przez findsię file.
D_Bye

2

wszystko co napisałem to:

find -size 1033c ! -executable

i dostałem plik. Najwyraźniej częścią czytelną dla człowieka było zrzucenie cię.


0
find . -readable -size 1033c \! -executable

-readable oznacza, że ​​pliki mogą być odczytywane przez konto, co niekoniecznie czyni je czytelnymi dla człowieka.
Anthon

0

Myślę, że dla gry poprawna składnia to:

file ./* 

Otrzymasz zwrot z listą każdego pliku. Sprawdziło się naprawdę dobrze w przypadku tego, co próbujesz osiągnąć w grze Bandit. Prawdziwa krzywa dla tego zadania polega na tym, że każdy plik zaczyna się od - (łącznika).


Możesz to poprawić, dodając łącznik do tego polecenia w file ./-*ten sposób.
ConstantFun,

0

Myślę, że to najlepsza odpowiedź, która spełni wszystkie 3 warunki

find inhere/ -type f -size 1033c ! -executable |xargs file | grep text

Ale jak wiele osób mówiło, pliki wykonywalne i czytelne dla ludzi miały nas zrzucić, więc wykorzystując

find inhere/ -type f -size 1033c 

wystarczy!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.