Chcesz zobaczyć tekst w pliku binarnym lub pliku danych? Polecenie linuksowe ciągi wyciąga te fragmenty tekstu – zwane „ciągami” – za Ciebie.
Linux jest pełen poleceń, które mogą wyglądać jak rozwiązania w poszukiwaniu problemów. Polecenie strun zdecydowanie pasuje do tego obozu. Jaki jest jego cel? Czy jest jakiś punkt do polecenia, które wyświetla listę drukowalnych ciągów z pliku binarnego?
Cofnijmy się o krok. Pliki binarne – takie jak pliki programów – mogą zawierać ciągi tekstu czytelnego dla człowieka. Ale jak możesz je zobaczyć? Jeśli używasz cat lub mniej, prawdopodobnie skończysz z zawieszonym oknem terminala. Programy zaprojektowane do pracy z plikami tekstowymi nie radzą sobie dobrze, jeśli są przez nie podawane znaki niedrukowalne.
Większość bajtów w pliku binarnym nie jest czytelna dla człowieka i nie można ich wydrukować w oknie terminala w sposób, który ma jakikolwiek sens. Nie ma znaków ani standardowych symboli reprezentujących wartości binarne, które nie odpowiadają znakom alfanumerycznym, znakom interpunkcyjnym ani odstępom. Znane są one łącznie jako znaki „drukowalne”. Reszta to znaki „niedrukowalne”.
Tak więc próba wyświetlenia lub przeszukania pliku binarnego lub pliku danych w poszukiwaniu ciągów tekstowych jest problemem. I tu pojawiają się struny. Wydobywa ciągi drukowalnych znaków z plików aby inne polecenia mogły używać łańcuchów bez konieczności borykania się ze znakami niedrukowalnymi.
Korzystanie z polecenia ciągów znaków
Polecenie strings nie jest skomplikowane, a jego podstawowe użycie jest bardzo proste. Podajemy nazwę pliku, który chcemy przeszukać w wierszu poleceń.
Tutaj użyjemy ciągów znaków w pliku binarnym – pliku wykonywalnym – zwanym „jibber”. Wpisujemy stringi, spację, „jibber” i wciskamy Enter.
strings jibber
Ciągi są wyodrębniane z pliku i wyświetlane w oknie terminala.
Ustawianie minimalnej długości ciągu
Domyślnie ciągi wyszukują ciągi składające się z co najmniej czterech znaków. Aby ustawić dłuższą lub krótszą długość minimalną, użyj opcji -n (długość minimalna).
Pamiętaj, że im krótsza minimalna długość, tym większe szanse, że zobaczysz więcej śmieci.
Niektóre wartości binarne mają tę samą wartość liczbową, co wartość reprezentująca znak drukowalny. Jeśli dwie z tych wartości liczbowych znajdują się obok siebie w pliku i określisz minimalną długość dwóch, te bajty zostaną zgłoszone tak, jakby były ciągiem.
Aby poprosić ciągi o użycie dwóch jako minimalnej długości, użyj następującego polecenia.
strings -n 2 jibber
W wynikach mamy teraz dwuliterowe łańcuchy. Zwróć uwagę, że spacje liczone są jako znaki drukowalne.
Przewijanie sznurków przez Less
Ze względu na długość danych wyjściowych ze stringów zamierzamy przepuścić je przez less. Następnie możemy przewijać plik w poszukiwaniu interesującego nas tekstu.
strings jibber | less
Lista jest teraz prezentowana dla nas w mniej, z górną częścią listy wyświetlaną jako pierwszą.
Używanie ciągów z plikami obiektów
Zazwyczaj pliki kodu źródłowego programu są kompilowane do plików obiektowych. Są one połączone z plikami biblioteki, aby utworzyć binarny plik wykonywalny. Mamy pod ręką plik obiektu jibber, więc przyjrzyjmy się temu plikowi. Zwróć uwagę na rozszerzenie pliku „.o”.
jibber.o | less
Pierwszy zestaw ciągów jest zawijany w kolumnie ósmej, jeśli jest dłuższy niż osiem znaków. Jeśli zostały opakowane, w kolumnie dziewiątej znajduje się znak „H”. Możesz rozpoznać te ciągi jako instrukcje SQL.
Przewijanie danych wyjściowych ujawnia, że to formatowanie nie jest używane w całym pliku.
Interesujące jest zobaczenie różnic w ciągach tekstowych między plikiem obiektowym a gotowym plikiem wykonywalnym.
Wyszukiwanie w określonych obszarach w pliku
Skompilowane programy mają w sobie różne obszary, które są używane do przechowywania tekstu. Domyślnie ciągi przeszukują cały plik w poszukiwaniu tekstu. To jest tak, jakbyś użył opcji -a (all). Aby wyszukiwać ciągi tylko w zainicjowanych, załadowanych sekcjach danych w pliku, użyj opcji -d (dane).
strings -d jibber | less
Jeśli nie masz ku temu dobrego powodu, równie dobrze możesz użyć domyślnego ustawienia i przeszukać cały plik.
Drukowanie przesunięcia sznurka
Możemy kazać ciągom wypisywać przesunięcie od początku pliku, w którym znajduje się każdy łańcuch. Aby to zrobić, użyj opcji -o (offset).
strings -o parse_phrases | less
Przesunięcie jest podane w Ósemkowe.
Aby przesunięcie było wyświetlane z inną podstawą numeryczną, taką jak dziesiętna lub szesnastkowa, użyj opcji -t (radix). Po opcji podstawy musi następować d (dziesiętny), x (szesnastkowy) lub o (ósemkowe). Użycie -to jest tym samym, co użycie -o.
strings -t d parse_phrases | less
Przesunięcia są teraz drukowane dziesiętnie.
strings -t x parse_phrases | less
Przesunięcia są teraz drukowane szesnastkowo.
W tym spacje
stringi traktują znaki tabulacji i spacji jako część znalezionych ciągów. Inne białe znaki, takie jak znaki nowej linii i powrotu karetki, nie są traktowane tak, jakby były częścią ciągów. Opcja -w (biała spacja) powoduje, że łańcuchy traktują wszystkie białe znaki tak, jakby były częściami łańcucha.
strings -w add_data | less
Widzimy pusty wiersz na wyjściu, który jest wynikiem (niewidocznego) powrotu karetki i znaków nowej linii na końcu drugiego wiersza.
Nie jesteśmy ograniczeni do plików
Możemy używać łańcuchów do wszystkiego, co jest lub może wytworzyć strumień bajtów.
Za pomocą tego polecenia możemy przejrzeć plik pamięć o dostępie swobodnym (RAM) naszego komputera.
Musimy użyć sudo, ponieważ uzyskujemy dostęp do / dev / mem. Jest to plik znakowy urządzenia, który zawiera obraz głównej pamięci komputera.
sudo strings /dev/mem | less
Lista nie obejmuje całej zawartości pamięci RAM. To tylko struny, które można z niego wyciągnąć.
Wyszukiwanie wielu plików naraz
Do wybierania grup plików do przeszukania można używać symboli wieloznacznych. Znak * reprezentuje wiele znaków, a znak? znak reprezentuje dowolny pojedynczy znak. Możesz także podać wiele nazw plików w wierszu poleceń.
Zamierzamy użyć symbolu wieloznacznego i przeszukać wszystkie pliki wykonywalne w katalogu / bin. Ponieważ lista będzie zawierać wyniki z wielu plików, użyjemy opcji -f (nazwa pliku). Spowoduje to wydrukowanie nazwy pliku na początku każdego wiersza. Następnie możemy zobaczyć, w którym pliku znaleziono każdy ciąg.
Przepuszczamy wyniki grepi szukam ciągów zawierających słowo „Copyright”.
strings -f /bin/* | grep Copyright
Otrzymujemy zgrabną listę oświadczeń o prawach autorskich dla każdego pliku w katalogu / bin, z nazwą pliku na początku każdego wiersza.
struny Unraveled
Nie ma żadnej tajemnicy w strunach; jest to typowe polecenie Linuksa. Robi coś bardzo konkretnego i robi to bardzo dobrze.
To kolejna z trybów Linuksa i naprawdę ożywa, gdy współpracuje z innymi poleceniami. Kiedy zobaczysz, jak może siedzieć między plikami binarnymi i innymi narzędziami, takimi jak grep, zaczynasz doceniać funkcjonalność tego nieco niejasnego polecenia.