Jak używać polecenia strings w systemie Linux

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

strings jibber w oknie terminala

Ciągi są wyodrębniane z pliku i wyświetlane w oknie terminala.

ciągi wysyłane 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

strings -n 2 jibber w oknie terminala

W wynikach mamy teraz dwuliterowe łańcuchy. Zwróć uwagę, że spacje liczone są jako znaki drukowalne.

łańcuchy wysyłane z dwoma literami w oknie terminala

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

jibber struny |  mniej w oknie terminala

Lista jest teraz prezentowana dla nas w mniej, z górną częścią listy wyświetlaną jako pierwszą.

łańcuchy wysyłane w less w oknie terminala

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

jibber.o |  mniej w oknie terminala

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.

łańcuchy wysyłane w less w oknie terminala

Przewijanie danych wyjściowych ujawnia, że ​​to formatowanie nie jest używane w całym pliku.

łańcuchy wysyłane w less w oknie terminala

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

stringi -d jibber |  mniej w oknie terminala

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

strings -o parse_phrases |  mniej

Przesunięcie jest podane w Ósemkowe.

łańcuchy z przesunięciem ósemkowym w oknie terminala

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

strings -td parse_phrases |  mniej w oknie terminala

Przesunięcia są teraz drukowane dziesiętnie.

łańcuchy wysyłane z przesunięciami dziesiętnymi w oknie terminala

strings -t x parse_phrases | less

strings -tx parse_phrases |  mniej w oknie terminala

Przesunięcia są teraz drukowane szesnastkowo.

łańcuchy wysyłane z przesunięciami szesnastkowymi w oknie terminala

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

strings -w add_data |  mniej w oknie terminala

Widzimy pusty wiersz na wyjściu, który jest wynikiem (niewidocznego) powrotu karetki i znaków nowej linii na końcu drugiego wiersza.

ciągi wysyłane w oknie terminala

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

sudo strings / dev / mem |  mniej w oknie terminala

Lista nie obejmuje całej zawartości pamięci RAM. To tylko struny, które można z niego wyciągnąć.

łańcuchy wysyłane w less w oknie terminala

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

strings -f / bin / * |  grep Prawa autorskie w oknie terminala

Otrzymujemy zgrabną listę oświadczeń o prawach autorskich dla każdego pliku w katalogu / bin, z nazwą pliku na początku każdego wiersza.

w oknie terminala wyświetlane są łańcuchy znaków pokazujące oświadczenia o prawach autorskich

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.