Ønsker du å avdekke tekstinnholdet i binære filer eller datafiler? Linux-kommandoen «strings» er et kraftig verktøy som trekker ut disse tekstbitene, kjent som «strenger», for deg.
Linux tilbyr et mangfold av kommandoer, og «strings» kan i utgangspunktet virke som et verktøy uten en åpenbar bruksområde. Men hva er egentlig poenget? Hvilken verdi har en kommando som avslører lesbare tekststrenger fra en binær fil?
La oss ta et steg tilbake. Binære filer, som for eksempel programfiler, kan inneholde tekststrenger som er lesbare. Men hvordan får du tak i disse? Forsøk med kommandoer som «cat» eller «less» kan føre til at terminalvinduet henger seg opp. Programmer som er designet for å håndtere tekstfiler, håndterer dårlig situasjoner der ikke-utskrivbare tegn blir matet inn.
Majoriteten av bytene i en binær fil er ikke lesbare for mennesker og kan ikke vises i terminalen på en meningsfull måte. Det finnes ingen tegn eller standard symboler som representerer binære verdier som ikke samsvarer med alfanumeriske tegn, tegnsetting eller mellomrom. Disse er samlet kjent som «utskrivbare» tegn. De resterende tegnene faller under kategorien «ikke-utskrivbare» tegn.
Det å vise eller søke gjennom en binær- eller datafil etter tekststrenger kan derfor være problematisk. Det er her «strings» kommer inn. Kommandoen henter ut sekvenser av utskrivbare tegn fra filer, slik at andre kommandoer kan bruke dem uten problemer med tegn som ikke kan skrives ut.
Hvordan Bruke «strings» Kommandoen
Det er enkelt å bruke «strings», og den grunnleggende funksjonen er veldig rett frem. Du angir bare filnavnet som du vil at «strings» skal gjennomsøke, i kommandolinjen.
La oss bruke «strings» på en binær fil – en kjørbar fil – som vi har kalt «jibber». Vi skriver «strings», et mellomrom, «jibber» og trykker Enter:
strings jibber
Strengene hentes ut av filen og vises i terminalvinduet.
Angi Minimum Lengde for Strenger
Som standard søker «strings» etter strenger som består av fire tegn eller mer. For å endre minimumslengden, kan du bruke alternativet «-n» (minimumslengde).
Vær oppmerksom på at jo kortere minimumslengde du angir, jo større er risikoen for å se mer «søppel» i resultatet.
Enkelte binære verdier kan ha samme numeriske verdi som et utskrivbart tegn. Hvis to slike verdier tilfeldigvis ligger ved siden av hverandre i filen, og du setter minimumslengden til to, vil disse bytene bli tolket som en streng.
For å be «strings» om å bruke en minimumslengde på to tegn, bruker du følgende kommando:
strings -n 2 jibber
Resultatet inneholder nå strenger med to tegn. Merk at mellomrom også regnes som et utskrivbart tegn.
Overføre «strings» til «less» for Enklere Navigering
På grunn av den potensielt lange utdataen fra «strings», er det nyttig å sende den gjennom kommandoen «less». Dette gjør det enklere å bla gjennom og søke etter interessant tekst.
strings jibber | less
Utdataen vises nå i «less», med begynnelsen av filen først.
«strings» med Objektfiler
Vanligvis blir programkildekodefiler kompilert til objektfiler, som deretter kobles sammen med biblioteksfiler for å lage en kjørebar binærfil. Vi har objektfilen for «jibber», så la oss se hva vi finner der. Legg merke til filtypen «.o».
strings jibber.o | less
Det første settet med strenger er pakket inn i kolonne åtte hvis de er lenger enn åtte tegn, og merket med et «H» i kolonne ni hvis innpakking har skjedd. Du kan se at disse strengene er SQL-setninger.
Bla gjennom utdataen viser at denne formateringen ikke blir brukt i hele filen.
Det er interessant å se forskjellene i tekststrengene mellom objektfilen og den ferdige, kjørbare filen.
Søke i Spesifikke Områder av Filen
Kompilerte programmer har forskjellige områder for lagring av tekst. Som standard søker «strings» i hele filen, akkurat som om du brukte alternativet «-a» (alle). For å instruere «strings» om å søke kun i initialiserte dataseksjoner i filen, bruker du alternativet «-d» (data).
strings -d jibber | less
Med mindre du har en spesiell grunn, kan du like godt bruke standardinnstillingen og søke i hele filen.
Viser Strengens Offset
Vi kan be «strings» om å vise offset-verdien fra begynnelsen av filen der hver streng er lokalisert. For å gjøre dette bruker vi alternativet «-o» (offset).
strings -o parse_phrases | less
Offset-verdien er gitt i oktal format.
For å vise offset-verdien i et annet tallsystem, som desimal eller heksadesimal, kan du bruke alternativet «-t» (radix). Radix-alternativet må følges av «d» (desimal), «x» (heksadesimal) eller «o» (oktal). «-to» er det samme som å bare bruke «-o».
strings -t d parse_phrases | less
Offset-verdiene vises nå i desimaltall.
strings -t x parse_phrases | less
Offset-verdiene vises nå i heksadesimaltall.
Inkluderer Mellomrom i Strenger
«strings» ser tabulator- og mellomromstegn som en del av strengene den finner. Andre mellomromstegn, som nye linjer og vognretur, blir ikke behandlet som en del av strengene. Alternativet «-w» (mellomrom) får «strings» til å behandle alle mellomromstegn som deler av strengen.
strings -w add_data | less
Vi kan se den tomme linjen i utdataen som er et resultat av (usynlige) vognretur- og nylinjetegn på slutten av den andre linjen.
Ikke Bare Begrenset til Filer
Vi kan bruke «strings» med alt som er, eller kan produsere, en byte-strøm.
Med denne kommandoen kan vi for eksempel se på tilfeldig tilgangsminne (RAM) på datamaskinen vår.
Vi må bruke «sudo» fordi vi vil ha tilgang til «/dev/mem», en fil som representerer datamaskinens hovedminne.
sudo strings /dev/mem | less
Utdataen representerer ikke hele innholdet i RAM, men bare de strengene som kan hentes ut.
Søke i Flere Filer Samtidig
Jokertegn kan brukes for å velge grupper av filer for søk. Stjernen (*) representerer flere tegn, mens spørsmålstegnet (?) står for ett enkelt tegn. Du kan også liste opp flere filnavn i kommandolinjen.
Vi bruker et jokertegn til å søke gjennom alle kjørbare filer i «/bin»-katalogen. Fordi utdataen vil inneholde resultater fra mange filer, vil vi bruke alternativet «-f» (filnavn). Dette vil skrive ut filnavnet i begynnelsen av hver linje, slik at vi kan se hvilken fil hver streng kommer fra. Deretter sender vi resultatet gjennom grep og ser etter strenger som inneholder ordet «Copyright».
strings -f /bin/* | grep Copyright
Vi får en oversiktlig liste over opphavsrettserklæringene i hver fil i «/bin»-katalogen, med filnavnet i begynnelsen av hver linje.
«strings» forklart
Det er ingen hemmelighet bak «strings». Det er en typisk Linux-kommando som gjør en spesifikk oppgave veldig bra.
Kommandoen er et av de mange verktøyene i Linux-økosystemet, og den kommer virkelig til sin rett når den samarbeider med andre kommandoer. Når du ser hvordan den kan binde sammen binære filer og andre verktøy, som «grep», begynner du å sette pris på nytten til denne litt obskure kommandoen.