Hur man använder strängkommandot på Linux

Vill du se texten i en binär eller datafil? Kommandot Linux strängar drar ut dessa textbitar – så kallade ”strängar” – åt dig.

Linux är fullt av kommandon som kan se ut som lösningar på jakt efter problem. Strängkommandot faller definitivt in i det lägret. Vad är dess syfte? Finns det en mening med ett kommando som listar de utskrivbara strängarna från en binär fil?

Låt oss ta ett steg bakåt. Binära filer – som programfiler – kan innehålla strängar av läsbar text. Men hur får man se dem? Om du använder katt eller mindre kommer du sannolikt att sluta med ett hängt terminalfönster. Program som är designade för att fungera med textfiler klarar sig inte bra om icke-utskrivbara tecken matas genom dem.

De flesta byte i en binär fil är inte läsbara för människor och kan inte skrivas ut till terminalfönstret på ett sätt som är vettigt. Det finns inga tecken eller standardsymboler som representerar binära värden som inte motsvarar alfanumeriska tecken, skiljetecken eller blanksteg. Tillsammans är dessa kända som ”utskrivbara” tecken. Resten är ”icke-utskrivbara” tecken.

Så att försöka visa eller söka igenom en binär eller datafil efter textsträngar är ett problem. Och det är där strängar kommer in. Det extraherar strängar av utskrivbara tecken från filer så att andra kommandon kan använda strängarna utan att behöva kämpa med tecken som inte kan skrivas ut.

Använda kommandot strängar

Det finns inget komplicerat med kommandot strängar, och dess grundläggande användning är mycket enkel. Vi anger namnet på filen vi vill att strängar ska söka igenom på kommandoraden.

Här kommer vi att använda strängar på en binär fil – en körbar fil – som kallas ”jibber”. Vi skriver strängar, ett mellanslag, ”jibber” och trycker sedan på Enter.

strings jibber

Strängarna extraheras från filen och listas i terminalfönstret.

Ställa in minsta stränglängd

Som standard kommer strängar att söka efter strängar som är fyra tecken eller längre. För att ställa in en längre eller kortare minimilängd, använd alternativet -n (minsta längd).

Observera att ju kortare minimilängden är, desto större är chansen att du ser mer skräp.

Vissa binära värden har samma numeriska värde som det värde som representerar ett utskrivbart tecken. Om två av dessa numeriska värden råkar vara sida vid sida i filen och du anger en minsta längd på två, kommer dessa byte att rapporteras som om de vore en sträng.

För att be strängar att använda två som minsta längd, använd följande kommando.

strings -n 2 jibber

Vi har nu tvåbokstavssträngar inkluderade i resultaten. Observera att mellanslag räknas som ett utskrivbart tecken.

Rörsträngar genom mindre

På grund av längden på utsignalen från strängar kommer vi att röra igenom den mindre. Vi kan sedan bläddra igenom filen och leta efter text av intresse.

strings jibber | less

Listan presenteras nu för oss på mindre, med toppen av listan visas först.

Använda strängar med objektfiler

Vanligtvis kompileras programkällkodsfiler till objektfiler. Dessa är länkade med biblioteksfiler för att skapa en binär körbar fil. Vi har jibberobjektfilen till hands, så låt oss ta en titt inuti den filen. Notera filtillägget ”.o”.

jibber.o | less

Den första uppsättningen strängar lindas alla i kolumn åtta om de är längre än åtta tecken. Om de har raderats finns ett ”H”-tecken i kolumn nio. Du kanske känner igen dessa strängar som SQL-satser.

Att rulla igenom utdata visar att denna formatering inte används i hela filen.

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

Söka i specifika områden i filen

Kompilerade program har olika områden inom sig som används för att lagra text. Som standard söker strängar igenom hela filen och letar efter text. Detta är precis som om du hade använt alternativet -a (alla). För att få strängar att söka endast i initierade, laddade datasektioner i filen, använd alternativet -d (data).

strings -d jibber | less

Om du inte har en bra anledning till det kan du lika gärna använda standardinställningen och söka i hela filen.

Skriva ut strängoffset

Vi kan låta strängar skriva ut offset från början av filen där varje sträng finns. För att göra detta, använd alternativet -o (offset).

strings -o parse_phrases | less

Offset ges in Octal.

För att visa offset i en annan numerisk bas, som decimal eller hexadecimal, använd alternativet -t (radix). Alternativet radix måste följas av d (decimal-), x (hexadecimal), eller o (oktal). Att använda -to är samma sak som att använda -o.

strings -t d parse_phrases | less

Offseten skrivs nu ut med decimaler.

strings -t x parse_phrases | less

Offseten skrivs nu ut i hexadecimal.

Inklusive Whitespace

strängar anser tabb- och mellanslagstecken vara en del av strängarna den hittar. Andra blanktecken, som nyrader och vagnreturer, behandlas inte som om de vore en del av strängarna. Alternativet -w (blanksteg) gör att strängar behandlar alla blanksteg som om de vore delar av strängen.

strings -w add_data | less

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

Vi är inte begränsade till filer

Vi kan använda strängar med allt som är, eller kan producera, en ström av bytes.

Med detta kommando kan vi titta igenom random access minne (RAM) på vår dator.

Vi måste använda sudo eftersom vi använder /dev/mem. Detta är en teckenenhetsfil som innehåller en bild av din dators huvudminne.

sudo strings /dev/mem | less

Listan är inte hela innehållet i ditt RAM-minne. Det är bara strängarna som kan extraheras från den.

Söker många filer samtidigt

Jokertecken kan användas för att välja grupper av filer som ska sökas. Tecknet * representerar flera tecken och ? tecken representerar ett enskilt tecken. Du kan också välja att ange många filnamn på kommandoraden.

Vi kommer att använda ett jokertecken och söka igenom alla körbara filer i katalogen /bin. Eftersom listan kommer att innehålla resultat från många filer kommer vi att använda alternativet -f (filnamn). Detta kommer att skriva ut filnamnet i början av varje rad. Vi kan sedan se vilken fil varje sträng hittades i.

Vi håller på att gå igenom resultaten grepoch letar efter strängar som innehåller ordet ”Copyright”.

strings -f /bin/* | grep Copyright

Vi får en snygg lista över upphovsrättsförklaringarna för varje fil i /bin-katalogen, med namnet på filen i början av varje rad.

strängar upplösta

Det finns inget mysterium för strängar; det är ett typiskt Linux-kommando. Den gör något väldigt specifikt och gör det väldigt bra.

Det är en annan av Linuxs kuggar och kommer verkligen till liv när den arbetar med andra kommandon. När du ser hur det kan sitta mellan binära filer och andra verktyg som grep, börjar du uppskatta funktionaliteten i detta lite obskyra kommando.