Jak korzystać z polecenia ciągów w systemie Linux

Opublikowany: 2022-01-29
Terminal Linux na laptopie
Fatmawati Achmad Zaenuri/Shutterstock.com

Chcesz zobaczyć tekst w pliku binarnym lub pliku danych? Polecenie Linux strings wyciąga dla ciebie te fragmenty tekstu - zwane "stringami".

Linux jest pełen poleceń, które mogą wyglądać jak rozwiązania w poszukiwaniu problemów. Do tego obozu zdecydowanie należy dowództwo strings . Jaki jest jego cel? Czy istnieje sens polecenia, które wyświetla listę ciągów do wydrukowania 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 less , 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 wyświetlić w oknie terminala w żaden sensowny sposób. Nie ma żadnych znaków ani standardowych symboli reprezentujących wartości binarne, które nie odpowiadają znakom alfanumerycznym, interpunkcji lub odstępom. Łącznie są one znane 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 stanowi problem. I tu właśnie wkraczają strings . Wyodrębnia z plików łańcuchy znaków drukowalnych, aby inne polecenia mogły używać tych łańcuchów bez konieczności walki ze znakami niedrukowalnymi.

Korzystanie z polecenia ciągów

W poleceniu strings nie ma nic skomplikowanego, a jego podstawowe użycie jest bardzo proste. W wierszu poleceń podajemy nazwę pliku, w którym mają być przeszukiwane strings .

Reklama

Tutaj użyjemy ciągów w pliku binarnym – pliku wykonywalnym – zwanym „jibber”. Wpisujemy strings , spację, „jibber” i wciskamy Enter.

 strunowe jibbber 

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

Ustawianie minimalnej długości struny

Domyślnie strings wyszukuje ciągi, które mają co najmniej cztery znaki. Aby ustawić dłuższą lub krótszą minimalną długość, użyj opcji -n (minimalna długość).

Pamiętaj, że im krótsza minimalna długość, tym większe prawdopodobieństwo, że zobaczysz więcej śmieci.

Niektóre wartości binarne mają taką samą wartość liczbową jak 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 łańcuchem.

Reklama

Aby poprosić strings , aby używały dwóch jako minimalnej długości, użyj następującego polecenia.

 strings -n 2 jibber 

W wynikach znajdują się teraz dwuliterowe ciągi znaków. Zwróć uwagę, że spacje są liczone jako znak drukowalny.

Rurociągi przez Less

Ze względu na długość danych wyjściowych z strings , będziemy je przepuszczać przez less . Następnie możemy przewijać plik w poszukiwaniu interesującego tekstu.

 jibbber strun | mniej 

Aukcja jest teraz dla nas prezentowana w less , z górną częścią wykazu wyświetlaną jako pierwsza.

Używanie ciągów z plikami obiektowymi

Zazwyczaj pliki kodu źródłowego programu są kompilowane w pliki obiektowe. Są one połączone z plikami bibliotek w celu utworzenia binarnego pliku wykonywalnego. Mamy pod ręką plik obiektu jibber, więc zajrzyjmy do środka tego pliku. Zwróć uwagę na rozszerzenie pliku „.o”.

 jibber.o | mniej 

Pierwszy zestaw ciągów jest zawinięty w kolumnie ósmej, jeśli jest dłuższy niż osiem znaków. Jeśli zostały zapakowane, znak „H” znajduje się w kolumnie dziewiątej. Możesz rozpoznać te ciągi jako instrukcje SQL.

Reklama

Przewijanie danych wyjściowych pokazuje, ż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 pliku

Skompilowane programy mają w sobie różne obszary, które służą do przechowywania tekstu. Domyślnie strings przeszukuje cały plik w poszukiwaniu tekstu. To tak, jakbyś użył opcji -a (wszystkie). Aby wyszukiwać ciągi tylko w zainicjowanych, załadowanych sekcjach danych w pliku, użyj opcji -d (dane).

 ciągi -d jibbber | mniej 

Jeśli nie masz ku temu dobrego powodu, równie dobrze możesz użyć ustawienia domyślnego i przeszukać cały plik.

Drukowanie przesunięcia ciągu

Możemy poprosić strings o wypisanie offsetu od początku pliku, w którym znajduje się każdy string. Aby to zrobić, użyj opcji -o (przesunięcie).

 strings -o parse_phrases | mniej 

Przesunięcie podano w ósemkach.

Aby przesunięcie było wyświetlane w innej podstawie numerycznej, na przykład dziesiętnej lub szesnastkowej, użyj opcji -t (podstawa). Po opcji podstawy musi następować d (dziesiętny), x (szesnastkowy) lub o (ósemkowy). Użycie -to jest tym samym co użycie -o .

 strings -td parse_phrases | mniej 

Przesunięcia są teraz drukowane w postaci dziesiętnej.

 strings -tx parse_phrases | mniej 

Przesunięcia są teraz drukowane w systemie szesnastkowym.

W tym białe znaki

strings traktuje znaki tabulacji i spacji jako część znalezionych ciągów. Inne znaki odstępu, takie jak znaki nowej linii i powrót karetki, nie są traktowane tak, jakby były częścią łańcuchów. Opcja -w (białe znaki) powoduje, że łańcuchy traktują wszystkie białe znaki tak, jakby były częścią łańcucha.

 strings -w add_data | mniej 

Reklama

Na wyjściu możemy zobaczyć pustą linię, która jest wynikiem (niewidocznego) powrotu karetki i znaków nowej linii na końcu drugiej linii.

Nie ograniczamy się do plików

strings możemy używać ze wszystkim, co jest lub może wytworzyć strumień bajtów.

Za pomocą tego polecenia możemy przejrzeć pamięć o dostępie swobodnym (RAM) naszego komputera.

Musimy użyć sudo , ponieważ uzyskujemy dostęp do /dev/mem. Jest to plik urządzenia znakowego, który przechowuje obraz pamięci głównej komputera.

 sudo stringi /dev/mem | mniej 

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

POWIĄZANE: Co oznacza „Wszystko jest plikiem” w systemie Linux?

Wyszukiwanie wielu plików jednocześnie

Symbole wieloznaczne mogą służyć do wybierania grup plików do przeszukania. Znak * reprezentuje wiele znaków, a ? znak reprezentuje dowolny pojedynczy znak. Możesz także podać wiele nazw plików w wierszu poleceń.

Reklama

Użyjemy symbolu wieloznacznego i przeszukamy wszystkie pliki wykonywalne w katalogu /bin. Ponieważ listing 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. Możemy wtedy zobaczyć, w którym pliku został znaleziony każdy ciąg.

Przepuszczamy wyniki przez program grep i szukamy ciągów zawierających słowo „Prawa autorskie”.

 ciągi -f /bin/* | grep Prawa autorskie 

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

smyczki rozwinięte

Struny nie mają żadnej tajemnicy; jest to typowe polecenie Linuksa. Robi coś bardzo konkretnego i robi to bardzo dobrze.

Jest to kolejny trybik Linuksa, który naprawdę ożywa, gdy pracuje z innymi poleceniami. Kiedy zobaczysz, jak może siedzieć między plikami binarnymi a innymi narzędziami, takimi jak grep , zaczynasz doceniać funkcjonalność tego nieco niejasnego polecenia.

POWIĄZANE: Najlepsze laptopy z systemem Linux dla programistów i entuzjastów