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

Chcete vidět text v binárním nebo datovém souboru? Linuxový příkaz strings vytáhne tyto kousky textu – nazývané „řetězce“ – za vás.

Linux je plný příkazů, které mohou vypadat jako řešení při hledání problémů. Příkaz pro struny do toho tábora rozhodně spadá. Jaký je jen jeho účel? Existuje nějaký bod k příkazu, který uvádí tisknutelné řetězce z binárního souboru?

Udělejme krok zpět. Binární soubory – například soubory programů – mohou obsahovat řetězce textu čitelného pro člověka. Ale jak je můžete vidět? Pokud používáte cat nebo méně, pravděpodobně skončíte se zavěšeným oknem terminálu. Programy, které jsou navrženy pro práci s textovými soubory, si dobře neporadí, pokud se do nich vkládají netisknutelné znaky.

Většina bajtů v binárním souboru není čitelná pro člověka a nelze je vytisknout do okna terminálu způsobem, který dává smysl. Neexistují žádné znaky nebo standardní symboly reprezentující binární hodnoty, které neodpovídají alfanumerickým znakům, interpunkci nebo mezerám. Souhrnně jsou tyto znaky známé jako „tisknutelné“ znaky. Zbytek jsou „netisknutelné“ znaky.

Takže pokus o zobrazení nebo vyhledání textových řetězců v binárním nebo datovém souboru je problém. A to je místo, kde přichází na řadu struny. Extrahuje řetězce tisknutelných znaků ze souborů takže ostatní příkazy mohou používat řetězce, aniž by se musely potýkat s netisknutelnými znaky.

Použití příkazu strings

Na příkazu strings není nic složitého a jeho základní použití je velmi jednoduché. Na příkazovém řádku poskytujeme název souboru, ve kterém chceme řetězce prohledávat.

  Jak si vytvořit svůj vlastní Linux NAS s Open Media Vault

Zde budeme používat řetězce v binárním souboru – spustitelném souboru – nazvaném „jibber“. Napíšeme řetězce, mezeru, „jibber“ a stiskneme Enter.

strings jibber

Řetězce jsou extrahovány ze souboru a uvedeny v okně terminálu.

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

Ve výchozím nastavení budou řetězce hledat řetězce, které mají čtyři znaky nebo delší. Chcete-li nastavit delší nebo kratší minimální délku, použijte volbu -n (minimální délka).

Všimněte si, že čím kratší je minimální délka, tím vyšší je šance, že uvidíte více odpadu.

Některé binární hodnoty mají stejnou číselnou hodnotu jako hodnota, která představuje tisknutelný znak. Pokud jsou dvě z těchto číselných hodnot v souboru vedle sebe a zadáte minimální délku dvě, budou tyto bajty hlášeny, jako by šlo o řetězec.

Chcete-li řetězce požádat o použití dvou jako minimální délky, použijte následující příkaz.

strings -n 2 jibber

Nyní máme ve výsledcích zahrnuty dvoupísmenné řetězce. Pamatujte, že mezery se počítají jako tisknutelné znaky.

Potrubní řetězce Přes méně

Kvůli délce výstupu z řetězců jej budeme procházet potrubím méně. Poté můžeme procházet soubor a hledat text, který nás zajímá.

strings jibber | less

Výpis se nám nyní zobrazuje méně, přičemž jako první se zobrazuje horní část výpisu.

Použití řetězců s objektovými soubory

Soubory zdrojového kódu programu jsou obvykle kompilovány do objektových souborů. Ty jsou propojeny se soubory knihovny, aby se vytvořil binární spustitelný soubor. Máme po ruce soubor jibber object file, tak se pojďme podívat dovnitř tohoto souboru. Všimněte si přípony souboru „.o“.

jibber.o | less

První sada řetězců jsou všechny zalomeny ve sloupci osm, pokud jsou delší než osm znaků. Pokud byly zalomeny, je ve sloupci devět znak „H“. Tyto řetězce můžete rozpoznat jako příkazy SQL.

  Jak vytvořit vlastní upozornění na baterii pro notebook se systémem Linux

Procházením výstupu zjistíte, že toto formátování není použito v celém souboru.

Je zajímavé vidět rozdíly v textových řetězcích mezi objektovým souborem a hotovým spustitelným souborem.

Vyhledávání v konkrétních oblastech v souboru

Kompilované programy mají v sobě různé oblasti, které se používají k ukládání textu. Ve výchozím nastavení řetězec hledá text v celém souboru. Je to stejné, jako kdybyste použili volbu -a (all). Chcete-li, aby řetězce prohledávaly pouze v inicializovaných, načtených datových sekcích v souboru, použijte volbu -d (data).

strings -d jibber | less

Pokud k tomu nemáte dobrý důvod, můžete také použít výchozí nastavení a prohledat celý soubor.

Tisk řetězcového offsetu

Řetězce můžeme nechat tisknout offset od začátku souboru, ve kterém je každý řetězec umístěn. Chcete-li to provést, použijte volbu -o (offset).

strings -o parse_phrases | less

Posun je uveden v Osmičková.

Chcete-li, aby se posun zobrazoval v jiném číselném základu, například v desítkové nebo šestnáctkové soustavě, použijte volbu -t (radix). Za volbou radix musí následovat d (desetinný), X (hexadecimální), nebo o (osmičková). Použití -to je stejné jako použití -o.

strings -t d parse_phrases | less

Ofsety se nyní tisknou v desítkové soustavě.

strings -t x parse_phrases | less

Ofsety jsou nyní vytištěny v šestnáctkové soustavě.

Včetně mezer

strings považuje znaky tabulátoru a mezery za součást řetězců, které najde. S ostatními mezerami, jako jsou nové řádky a návraty na začátek řádku, se nezachází, jako by byly součástí řetězců. Volba -w (mezery) způsobí, že řetězce budou se všemi znaky mezer zacházet, jako by byly součá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.

  Jak vytvořit vzdálenou zálohu pevného disku v systému Linux

Nejsme omezeni pouze na soubory

Řetězce můžeme použít s čímkoli, co je nebo může vytvořit proud bajtů.

Pomocí tohoto příkazu můžeme prohlížet paměť s náhodným přístupem (RAM) našeho počítače.

Musíme použít sudo, protože přistupujeme k /dev/mem. Toto je soubor znakového zařízení, který obsahuje obraz hlavní paměti vašeho počítače.

sudo strings /dev/mem | less

Výpis není celý obsah vaší RAM. Jsou to jen struny, které se z něj dají vytáhnout.

Prohledávání mnoha souborů najednou

Zástupné znaky lze použít k výběru skupin souborů, které se mají prohledávat. Znak * představuje více znaků a znak ? znak představuje libovolný jednotlivý znak. Můžete se také rozhodnout poskytnout mnoho názvů souborů na příkazovém řádku.

Použijeme zástupný znak a prohledáme všechny spustitelné soubory v adresáři /bin. Protože výpis bude obsahovat výsledky z mnoha souborů, použijeme volbu -f (název souboru). To vytiskne název souboru na začátku každého řádku. Poté můžeme vidět, ve kterém souboru byl každý řetězec nalezen.

Shromažďujeme výsledky grepa hledá řetězce, které obsahují slovo „Copyright“.

strings -f /bin/* | grep Copyright

Získáme úhledný seznam prohlášení o autorských právech pro každý soubor v adresáři /bin s názvem souboru na začátku každého řádku.

struny Rozpletené

Struny nemají žádné tajemství; je to typický příkaz Linuxu. Dělá něco velmi specifického a dělá to velmi dobře.

Je to další z linuxových koleček a skutečně ožívá, když pracuje s jinými příkazy. Když uvidíte, jak může sedět mezi binárními soubory a dalšími nástroji, jako je grep, začnete oceňovat funkčnost tohoto mírně obskurního příkazu.