Vil du se teksten i en binær eller datafil? Linux-strenger-kommandoen trekker ut disse tekstbitene – kalt «strenger» – for deg.
Linux er full av kommandoer som kan se ut som løsninger på jakt etter problemer. Stringskommandoen faller definitivt inn i den leiren. Akkurat hva er formålet? Er det et poeng med en kommando som viser de utskrivbare strengene fra en binær fil?
La oss ta et skritt tilbake. Binære filer – for eksempel programfiler – kan inneholde strenger med lesbar tekst. Men hvordan får du se dem? Hvis du bruker katt eller mindre, vil du sannsynligvis ende opp med et hengt terminalvindu. Programmer som er laget for å fungere med tekstfiler, takler det dårlig hvis ikke-utskrivbare tegn mates gjennom dem.
De fleste bytene i en binær fil er ikke lesbare for mennesker og kan ikke skrives ut til terminalvinduet på en måte som gir mening. Det er ingen tegn eller standardsymboler som representerer binære verdier som ikke samsvarer med alfanumeriske tegn, tegnsetting eller mellomrom. Til sammen er disse kjent som «utskrivbare» tegn. Resten er «ikke-utskrivbare» tegn.
Så det er et problem å prøve å se eller søke gjennom en binær eller datafil for tekststrenger. Og det er her strenger kommer inn. Det trekker ut strenger med utskrivbare tegn fra filer slik at andre kommandoer kan bruke strengene uten å måtte kjempe med tegn som ikke kan skrives ut.
Innholdsfortegnelse
Bruke strengkommandoen
Det er ikke noe komplisert med strengkommandoen, og dens grunnleggende bruk er veldig enkel. Vi oppgir navnet på filen vi ønsker at strenger skal søke gjennom på kommandolinjen.
Her skal vi bruke strenger på en binær fil – en kjørbar fil – kalt «jibber». Vi skriver inn strenger, et mellomrom, «jibber» og trykker deretter på Enter.
strings jibber
Strengene trekkes ut fra filen og vises i terminalvinduet.
Stille inn minimum strenglengde
Som standard vil strenger søke etter strenger som er på fire tegn eller lengre. For å angi en lengre eller kortere minimumslengde, bruk alternativet -n (minimumslengde).
Merk at jo kortere minimumslengden er, jo større er sjansen for at du ser mer søppel.
Noen binære verdier har samme numeriske verdi som verdien som representerer et utskrivbart tegn. Hvis to av disse numeriske verdiene tilfeldigvis er side ved side i filen og du angir en minimumslengde på to, vil disse bytene bli rapportert som om de var en streng.
For å be strenger om å bruke to som minimumslengde, bruk følgende kommando.
strings -n 2 jibber
Vi har nå to-bokstavsstrenger inkludert i resultatene. Merk at mellomrom regnes som et utskrivbart tegn.
Rørstrenger gjennom mindre
På grunn av lengden på utgangen fra strenger, kommer vi til å røre den gjennom mindre. Vi kan deretter bla gjennom filen og se etter tekst av interesse.
strings jibber | less
Oppføringen er nå presentert for oss på mindre, med toppen av oppføringen vist først.
Bruke strenger med objektfiler
Vanligvis blir programkildekodefiler kompilert til objektfiler. Disse er koblet til biblioteksfiler for å lage en binær kjørbar fil. Vi har jibber-objektfilen for hånden, så la oss ta en titt i den filen. Legg merke til filtypen «.o».
jibber.o | less
Det første settet med strenger pakkes i kolonne åtte hvis de er lengre enn åtte tegn. Hvis de har blitt pakket inn, er et «H»-tegn i kolonne ni. Du kan gjenkjenne disse strengene som SQL-setninger.
Bla gjennom utdataene viser at denne formateringen ikke brukes i hele filen.
Det er interessant å se forskjellene i tekststrengene mellom objektfilen og den ferdige kjørbare filen.
Søke i bestemte områder i filen
Kompilerte programmer har forskjellige områder i seg selv som brukes til å lagre tekst. Som standard søker strenger i hele filen på jakt etter tekst. Dette er akkurat som om du hadde brukt alternativet -a (alle). For å få strenger til å søke kun i initialiserte, lastede dataseksjoner i filen, bruk alternativet -d (data).
strings -d jibber | less
Med mindre du har en god grunn til det, kan du like godt bruke standardinnstillingen og søke i hele filen.
Skrive ut strengoffset
Vi kan la strenger skrive ut offset fra starten av filen der hver streng er plassert. For å gjøre dette, bruk -o (offset) alternativet.
strings -o parse_phrases | less
Offset er gitt inn Oktal.
For å få forskyvningen vist i en annen numerisk base, for eksempel desimal eller heksadesimal, bruk alternativet -t (radix). Radix-alternativet må følges av d (desimal), x (heksadesimal), eller o (oktal). Å bruke -to er det samme som å bruke -o.
strings -t d parse_phrases | less
Forskyvningene er nå skrevet ut med desimaler.
strings -t x parse_phrases | less
Offsetene er nå skrevet ut i heksadesimal.
Inkludert mellomrom
strenger anser tabulator- og mellomromstegn som en del av strengene den finner. Andre mellomromstegn, som nylinjer og vognretur, behandles ikke som om de var en del av strengene. Alternativet -w (mellomrom) får strenger til å behandle alle mellomromstegn som om de er deler av strengen.
strings -w add_data | less
Vi kan se den tomme linjen i utdataene, som er et resultat av (usynlig) vognretur og nylinjetegn på slutten av den andre linjen.
Vi er ikke begrenset til filer
Vi kan bruke strenger med alt som er, eller kan produsere, en strøm av bytes.
Med denne kommandoen kan vi se gjennom tilfeldig tilgangsminne (RAM) på datamaskinen vår.
Vi må bruke sudo fordi vi har tilgang til /dev/mem. Dette er en tegnenhetsfil som inneholder et bilde av hovedminnet på datamaskinen din.
sudo strings /dev/mem | less
Oppføringen er ikke hele innholdet i RAM-en din. Det er bare strengene som kan trekkes ut av det.
Søker i mange filer samtidig
Jokertegn kan brukes til å velge grupper av filer som skal søkes i. *-tegnet representerer flere tegn, og ? tegn representerer et enkelt tegn. Du kan også velge å angi mange filnavn på kommandolinjen.
Vi skal bruke et jokertegn og søke gjennom alle de kjørbare filene i /bin-katalogen. Fordi oppføringen vil inneholde resultater fra mange filer, vil vi bruke alternativet -f (filnavn). Dette vil skrive ut filnavnet på begynnelsen av hver linje. Vi kan da se hvilken fil hver streng ble funnet i.
Vi fører resultatene gjennom grepog ser etter strenger som inneholder ordet «Copyright».
strings -f /bin/* | grep Copyright
Vi får en ryddig liste over opphavsrettserklæringene for hver fil i /bin-katalogen, med navnet på filen i starten av hver linje.
strenger løst opp
Det er ikke noe mysterium for strenger; det er en typisk Linux-kommando. Den gjør noe veldig spesifikt og gjør det veldig bra.
Det er en annen av Linuxs tannhjul, og kommer virkelig til live når den jobber med andre kommandoer. Når du ser hvordan det kan sitte mellom binære filer og andre verktøy som grep, begynner du å sette pris på funksjonaliteten til denne litt obskure kommandoen.