Jak používat příkaz strings v systému Linux

Photo of author

By etechblogcz

Potřebujete zobrazit text uložený v binárním souboru nebo datovém souboru? Příkaz `strings` v Linuxu je nástroj, který vám z těchto souborů extrahuje čitelné textové úseky, známé jako „řetězce“.

Linux nabízí mnoho příkazů, které se mohou ukázat jako neocenitelné při řešení různých problémů. Příkaz `strings` patří mezi ně. K čemu přesně ale slouží? Jaký je smysl příkazu, který vypisuje tisknutelné řetězce z binárních souborů?

Zastavme se na chvíli. Binární soubory, jako jsou soubory spustitelných programů, mohou obsahovat textové řetězce čitelné pro člověka. Jak je ale můžeme zobrazit? Pokud použijeme `cat` nebo `less`, pravděpodobně dojde k zablokování terminálu. Programy určené pro práci s textovými soubory se totiž nedokáží správně vyrovnat s netisknutelnými znaky.

Většina bajtů v binárním souboru není určena pro lidské čtení a nelze je smysluplně zobrazit v terminálu. Neexistují standardní symboly pro binární hodnoty, které by neodpovídaly alfanumerickým znakům, interpunkci nebo mezerám. Souhrnně tyto znaky označujeme jako „tisknutelné“ znaky, zbytek pak jako „netisknutelné“ znaky.

Zobrazení nebo vyhledávání textových řetězců v binárním nebo datovém souboru je tedy problém. A právě zde vstupuje do hry příkaz `strings`. Ten extrahuje tisknutelné znakové řetězce ze souborů, což umožňuje ostatním příkazům pracovat s textovými informacemi bez nutnosti řešit netisknutelné znaky.

Použití příkazu `strings`

Použití příkazu `strings` je jednoduché. Stačí zadat název souboru, ve kterém chceme hledat řetězce, a to na příkazovém řádku.

V tomto příkladu použijeme `strings` na binárním souboru s názvem „jibber“. Napíšeme `strings jibber` a stiskneme Enter.

strings jibber

Řetězce se extrahují ze souboru a zobrazí se v terminálu.

Nastavení minimální délky řetězce

Ve výchozím nastavení `strings` vyhledává řetězce o délce čtyř a více znaků. Pro nastavení kratší nebo delší minimální délky použijeme volbu `-n` (minimální délka).

Je třeba si uvědomit, že čím kratší minimální délku nastavíme, tím vyšší je pravděpodobnost, že se ve výstupu objeví i nežádoucí data.

Některé binární hodnoty se mohou shodovat s číselnými hodnotami, které představují tisknutelné znaky. Pokud se tyto hodnoty nacházejí v souboru vedle sebe a minimální délka je nastavena na dva, budou tyto bajty vyhodnoceny jako řetězec.

Pro vyhledání řetězců o minimální délce dvou znaků použijeme následující příkaz:

strings -n 2 jibber

Výsledky nyní zahrnují i dvouznakové řetězce. Je důležité si uvědomit, že mezery se také počítají jako tisknutelné znaky.

Propojení výstupu příkazu `strings` s `less`

Vzhledem k tomu, že výstup příkazu `strings` může být velmi rozsáhlý, je praktické jej přesměrovat do příkazu `less`, který umožňuje procházení výstupu a vyhledávání v něm.

strings jibber | less

Výpis je nyní zobrazen v `less`, začínaje jeho horní částí.

Použití `strings` s objektovými soubory

Zdrojové kódy programů se obvykle kompilují do objektových souborů. Ty se následně propojují se soubory knihoven, čímž vzniká spustitelný binární soubor. Máme k dispozici objektový soubor „jibber“, podívejme se tedy, co obsahuje. Přípona souboru je „.o“.

strings jibber.o | less

První sada řetězců je zalomena ve sloupci osm, pokud je delší než osm znaků. Pokud je řetězec zalomen, je ve sloupci devět znak „H“. Tyto řetězce můžeme identifikovat jako SQL příkazy.

Při prohlížení výstupu můžeme zjistit, že toto formátování není použito v celém souboru.

Je zajímavé porovnat textové řetězce v objektovém souboru s finálním spustitelným souborem.

Vyhledávání v určitých částech souboru

Kompilované programy mají různé oblasti, které slouží k ukládání textu. Ve výchozím nastavení `strings` prohledává text v celém souboru, což je ekvivalentní použití volby `-a` (all). Pokud chceme prohledávat pouze inicializované datové sekce souboru, použijeme volbu `-d` (data).

strings -d jibber | less

Pokud nemáte specifický důvod, můžete použít výchozí nastavení a prohledat celý soubor.

Zobrazení offsetu řetězce

Příkaz `strings` může zobrazit offset od začátku souboru, na kterém se daný řetězec nachází. Použijeme volbu `-o` (offset).

strings -o parse_phrases | less

Offset je zobrazen v osmičkové soustavě.

Pro zobrazení offsetu v jiné číselné soustavě, například v desítkové nebo šestnáctkové soustavě, použijeme volbu `-t` (radix). Za touto volbou musí následovat `d` (desítková), `x` (šestnáctková) nebo `o` (osmičková). Použití `-to` je ekvivalentní použití `-o`.

strings -t d parse_phrases | less

Offsety se nyní zobrazují v desítkové soustavě.

strings -t x parse_phrases | less

Offsety se nyní zobrazují v šestnáctkové soustavě.

Zahrnutí mezer

Příkaz `strings` považuje tabulátory a mezery za součást řetězců. Ostatní mezery, jako jsou znaky nového řádku nebo návratu vozíku, nejsou považovány za součást řetězce. Volba `-w` (mezery) způsobí, že `strings` bude se všemi znaky mezer zacházet jako s částí řetězce.

strings -w add_data | less

Ve výstupu vidíme prázdný řádek, který je výsledkem (neviditelného) znaku návratu vozíku a nového řádku na konci druhého řádku.

Nejsme omezeni pouze na soubory

Příkaz `strings` můžeme použít na cokoliv, co je nebo může vytvořit proud bajtů.

Pomocí tohoto příkazu můžeme nahlédnout do operační paměti (RAM) našeho počítače.

Je nutné použít příkaz `sudo`, protože přistupujeme k `/dev/mem`. Jedná se o speciální soubor zařízení, který obsahuje obraz hlavní paměti počítače.

sudo strings /dev/mem | less

Výpis nezobrazuje celý obsah RAM, ale pouze řetězce, které lze z ní extrahovat.

Hledání ve více souborech najednou

Pro vyhledávání v několika souborech najednou můžeme použít zástupné znaky. Znak `*` zastupuje libovolný počet znaků a znak `?` zastupuje jeden libovolný znak. Můžeme také uvést více názvů souborů na příkazovém řádku.

V tomto příkladu použijeme zástupný znak a prohledáme všechny spustitelné soubory v adresáři `/bin`. Protože výstup bude obsahovat výsledky z mnoha souborů, použijeme volbu `-f` (název souboru), která vytiskne název souboru na začátku každého řádku, abychom věděli, ve kterém souboru byl daný řetězec nalezen.

Výsledky budeme ještě zpracovávat pomocí příkazu `grep` a hledáme řetězce, které obsahují slovo „Copyright“.

strings -f /bin/* | grep Copyright

Získáme přehledný seznam autorských prohlášení pro každý soubor v adresáři `/bin`, přičemž na začátku každého řádku je uveden název souboru.

`strings` – shrnutí

Příkaz `strings` není nijak komplikovaný. Jedná se o typický linuxový příkaz, který má velmi specifickou funkci a plní ji velmi dobře.

Je to další z mnoha linuxových nástrojů, který naplno ožívá při kombinaci s dalšími příkazy. Jakmile uvidíme, jak může být použit mezi binárními soubory a dalšími nástroji, jako je `grep`, začneme oceňovat funkčnost tohoto, na první pohled trochu obskurního, příkazu.