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.