Hur man använder strängkommandot på Linux

By rik

Behöver du extrahera text från en binär eller datafil? Linux-kommandot `strings` är verktyget du söker för att hitta och visa dessa textfragment, kallade ”strängar”.

Linux erbjuder många kommandon som kan verka vara lösningar på problem som inte existerar. Kommandot `strings` kan vara ett av dem. Vad är dess syfte? Är det verkligen användbart med ett kommando som kan lista utskrivbara strängar från en binär fil?

Låt oss ta ett steg tillbaka. Binära filer, som till exempel programfiler, kan innehålla textsträngar som är läsbara. Men hur kan man få tillgång till dem? Om du använder `cat` eller `less`, riskerar du att terminalen låser sig. Program som är designade för textfiler kan inte hantera icke-utskrivbara tecken.

Majoriteten av byten i en binär fil är inte läsbara för människor och kan inte visas i terminalen på ett vettigt sätt. Det saknas standardtecken eller symboler för att representera binära värden som inte motsvarar alfanumeriska tecken, skiljetecken eller mellanslag. Tillsammans kallas dessa för ”utskrivbara” tecken, medan de andra är ”icke-utskrivbara”.

Att visa eller söka efter textsträngar i binära filer är därför en utmaning. Det är här `strings` kommer in. Kommandot extraherar utskrivbara teckensträngar från filer, vilket gör det möjligt för andra kommandon att arbeta med texten utan problem med icke-utskrivbara element.

Använda kommandot `strings`

Kommandot `strings` är enkelt och grundläggande. Du anger bara filnamnet som ska undersökas på kommandoraden.

Här kommer vi att använda `strings` på en binär fil, en körbar fil kallad ”jibber”. Vi skriver `strings`, mellanslag och sedan filnamnet ”jibber”, och trycker på Enter.

strings jibber

Strängarna extraheras och listas i terminalfönstret.

Ange minsta stränglängd

Som standard söker `strings` efter strängar som är fyra tecken eller längre. Du kan ändra den minsta längden med alternativet `-n` (minsta längd).

Observera att om du minskar den minsta längden, ökar risken för att se ”skräp”.

Vissa binära värden kan ha samma numeriska representation som utskrivbara tecken. Om två sådana värden råkar ligga bredvid varandra i filen och du ställer in minsta längden till två, kommer dessa byten att identifieras som en sträng.

För att ange att `strings` ska använda två som minsta längd, skriv:

strings -n 2 jibber

Nu inkluderas strängar med två bokstäver i resultatet. Kom ihåg att mellanslag räknas som ett utskrivbart tecken.

Använda `strings` med `less`

Långa utskrifter från `strings` kan hanteras med `less`. Då kan vi bläddra och söka efter intressant text.

strings jibber | less

Listan visas nu i `less`, med början högst upp.

`strings` och objektfiler

Programkällkodsfiler kompileras normalt till objektfiler. Dessa länkas sedan med biblioteksfiler för att skapa en binär körbar fil. Vi har objektfilen ”jibber.o” tillgänglig, låt oss se vad den innehåller. Notera filändelsen ”.o”.

jibber.o | less

De inledande strängarna är radbrytna till kolumn åtta om de är längre än åtta tecken. Om de har raderats, visas ett ”H” i kolumn nio. Du kanske känner igen dessa strängar som SQL-kommandon.

Genom att skrolla genom resultatet ser vi att denna formatering inte används genomgående.

Det är intressant att se skillnaderna mellan textsträngarna i objektfilen och den färdiga körbara filen.

Söka i specifika områden av filen

Kompilerade program innehåller olika områden där text lagras. Som standard söker `strings` igenom hela filen. Detta är samma sak som att använda alternativet `-a` (alla). För att söka enbart i initierade, laddade datasektioner av filen, använd alternativet `-d` (data).

strings -d jibber | less

Om du inte har särskilda skäl till det, är det oftast bäst att använda standardinställningen och söka genom hela filen.

Visar offset för strängar

Du kan låta `strings` visa offseten från början av filen där varje sträng finns. Använd alternativet `-o` (offset) för detta.

strings -o parse_phrases | less

Offseten visas i oktal form.

För att visa offseten i en annan numerisk bas, som decimal eller hexadecimal, använd alternativet `-t` (radix). Radix-alternativet ska följas av `d` (decimal), `x` (hexadecimal), eller `o` (oktal). Att använda `-to` är detsamma som att använda `-o`.

strings -t d parse_phrases | less

Offseten visas nu i decimaltal.

strings -t x parse_phrases | less

Offseten visas nu i hexadecimal.

Inkludera blanksteg

`strings` räknar tabbar och mellanslag som en del av strängarna. Andra blanktecken, som ny rad och vagnretur, behandlas inte som en del av strängarna. Med alternativet `-w` (blanksteg) behandlar `strings` alla blanktecken som en del av strängen.

strings -w add_data | less

Vi kan se den tomma raden i resultatet, som är ett resultat av (osynliga) vagnretur- och nyradstecken i slutet av den andra raden.

Inte bara filer

`strings` kan användas med allt som är, eller kan generera, en ström av byten.

Med detta kommando kan vi se RAM-minnet i din dator.

Vi måste använda `sudo` eftersom vi använder `/dev/mem`. Detta är en teckenenhetsfil som innehåller en bild av datorns primärminne.

sudo strings /dev/mem | less

Listan är inte hela innehållet i ditt RAM-minne, bara de strängar som kan extraheras.

Söka flera filer samtidigt

Jokertecken kan användas för att välja flera filer att söka i. Tecknet `*` representerar flera tecken och `?` representerar ett enskilt tecken. Du kan också lista flera filnamn direkt på kommandoraden.

Vi använder ett jokertecken för att söka i alla körbara filer i katalogen `/bin`. Eftersom listan kommer innehålla resultat från många filer, använder vi alternativet `-f` (filnamn), vilket visar filnamnet i början av varje rad så att vi kan se var strängarna hittades.

Vi skickar resultaten genom `grep` för att hitta strängar som innehåller ordet ”Copyright”.

strings -f /bin/* | grep Copyright

Vi får en överskådlig lista med upphovsrättsmeddelanden för varje fil i `/bin`-katalogen, med filnamnet i början av varje rad.

`strings` i korthet

Kommandot `strings` är inget mysterium; det är ett typiskt Linux-kommando. Det gör en specifik sak mycket bra.

Det är en av Linux många komponenter som verkligen briljerar i samarbete med andra kommandon. När du ser hur det kan fungera mellan binära filer och verktyg som `grep`, börjar du uppskatta funktionaliteten i detta lite okända kommando.