Како користити команду стрингова на Линуку

Da li želite da pogledate tekstualni sadržaj unutar binarne ili datoteke sa podacima? Linux komanda `strings` izvlači te tekstualne delove – koji se nazivaju „stringovi“ – umesto vas.

Linux obiluje komandama koje deluju kao rešenja koja traže problem. Komanda `strings` definitivno pripada toj grupi. Koja je njena prava svrha? Da li postoji valjan razlog za postojanje komande koja ispisuje stringove iz binarne datoteke?

Da razmotrimo malo širu sliku. Binarne datoteke, poput izvršnih programa, često sadrže delove teksta koji su čitljivi ljudima. Ali kako pristupiti tim delovima? Ukoliko koristite komande poput `cat` ili `less`, verovatno ćete dobiti terminal koji se „zaledi“. Programi dizajnirani za rad sa tekstualnim datotekama ne snalaze se dobro sa simbolima koji se ne mogu prikazati.

Većina bajtova u binarnoj datoteci nije čitljiva ljudima i ne može se prikazati na terminalu na način koji ima smisla. Ne postoje znakovi ili standardni simboli koji predstavljaju binarne vrednosti koje ne odgovaraju alfanumeričkim znakovima, interpunkciji ili razmacima. Zajedno, oni su poznati kao znakovi koji se mogu štampati. Ostalo su znaci koji se „ne mogu štampati“.

Dakle, pregled ili pretraga tekstualnih nizova u binarnoj ili datoteci sa podacima predstavlja izazov. Tu na scenu stupa `strings`. Ona izdvaja nizove znakova koji se mogu štampati iz datoteka, omogućavajući drugim komandama da koriste ove stringove bez potrebe da se bore sa znakovima koji se ne mogu štampati.

Korišćenje `strings` komande

Komanda `strings` nije komplikovana, a njena osnovna upotreba je vrlo jednostavna. Na komandnoj liniji navodimo ime datoteke unutar koje želimo da tražimo stringove.

U ovom primeru koristićemo `strings` na binarnoj datoteci, tačnije izvršnoj datoteci, pod nazivom „dziber“. Ukucaćemo `strings`, razmak, „dziber“ i pritisnuti Enter.

strings dziber

Stringovi se izdvajaju iz datoteke i prikazuju na terminalu.

Podešavanje minimalne dužine stringa

Po default-u, `strings` traži nizove koji imaju četiri ili više karaktera. Da biste podesili dužu ili kraću minimalnu dužinu, koristite opciju `-n` (minimalna dužina).

Treba imati na umu da što je kraća minimalna dužina, veća je verovatnoća da ćete naići na „smeće“.

Neke binarne vrednosti imaju istu numeričku vrednost kao i znak koji se može štampati. Ako se dve takve numeričke vrednosti nalaze jedna pored druge u datoteci, i ako navedete minimalnu dužinu od dva, ti bajtovi će biti prikazani kao string.

Da biste naložili `strings` da koristi dva kao minimalnu dužinu, koristite sledeću komandu:

strings -n 2 dziber

Sada su u rezultate uključeni i stringovi od dva slova. Imajte na umu da se razmaci takođe računaju kao znakovi za štampanje.

Prosleđivanje `strings` kroz `less`

Zbog dužine izlaza komande `strings`, isti ćemo proslediti kroz komandu `less`. Na taj način možemo pregledati fajl tražeći tekst koji nas zanima.

strings dziber | less

Lista je sada prikazana u `less`-u, sa prikazanim prvim vrhom liste.

Korišćenje `strings` sa objektnim datotekama

Tipično, datoteke izvornog koda programa se kompajliraju u objektne datoteke. One se povezuju sa datotekama biblioteke da bi se stvorila binarna izvršna datoteka. Imamo pri ruci datoteku objekta `dziber`, pa pogledajmo šta sadrži. Obratite pažnju na ekstenziju datoteke „.o“.

strings dziber.o | less

Prvi set stringova se prelama u kolonu od osam znakova ako su duži od osam znakova. Ako su prelomljeni, znak „H“ se nalazi u devetoj koloni. Ove stringove možete prepoznati kao SQL naredbe.

Kretanje kroz izlaz otkriva da se ovo formatiranje ne koristi u celoj datoteci.

Interesantno je videti razlike u tekstualnim nizovima između objektne datoteke i gotove izvršne datoteke.

Pretraživanje u određenim oblastima datoteke

Prevedeni programi imaju različite oblasti koje se koriste za skladištenje teksta. Po default-u, `strings` pretražuje celu datoteku tražeći tekst. To je isto kao da ste koristili opciju `-a` (sve). Da biste pretražili stringove samo u inicijalizovanim, učitanim odeljcima podataka u datoteci, koristite opciju `-d` (podaci).

strings -d dziber | less

Osim ako nemate dobar razlog za to, možete koristiti default podešavanje i pretražiti celu datoteku.

Prikazivanje pozicije stringa

Možemo omogućiti da `strings` prikaže poziciju, odnosno odmak od početka datoteke na kojoj se svaki string nalazi. Da biste to uradili, koristite opciju `-o` (odmak).

strings -o parse_phrases | less

Odmak je prikazan u oktalnom brojnom sistemu.

Da bi se odmak prikazao u drugom brojnom sistemu, kao što je decimalni ili heksadecimalni, koristite opciju `-t` (radiks). Opciju radiks mora pratiti `d` (decimalni), `x` (heksadecimalni), ili `o` (oktalni). Korišćenje `-to` je isto kao i korišćenje `-o`.

strings -t d parse_phrases | less

Odmaci se sada štampaju u decimalnom sistemu.

strings -t x parse_phrases | less

Odmaci se sada štampaju u heksadecimalnom sistemu.

Uključivanje razmaka

`strings` smatra da su karakteri tabulacije i razmaci deo stringova koje pronađe. Druge vrste razmaka, kao što su novi redovi i povratak na početak reda, ne tretiraju se kao deo stringova. Opcija `-w` (razmak) uzrokuje da `strings` tretira sve razmake kao delove stringa.

strings -w add_data | less

Možemo videti prazan red u izlazu, koji je rezultat (nevidljivih) karaktera za povratak na početak reda i novi red na kraju drugog reda.

Nismo ograničeni na datoteke

Možemo koristiti `strings` sa bilo čime što je, ili može proizvesti, tok bajtova.

Sa ovom komandom možemo pregledati RAM memoriju (RAM) našeg računara.

Moramo koristiti `sudo` jer pristupamo `/dev/mem`. To je datoteka karakternog uređaja koja sadrži sliku glavne memorije vašeg računara.

sudo strings /dev/mem | less

Lista nije celokupan sadržaj vaše RAM memorije. To su samo stringovi koji se mogu izvući iz nje.

Pretraga više datoteka odjednom

Džokeri se mogu koristiti za odabir grupa datoteka koje će se pretraživati. Znak `*` predstavlja više znakova, a znak `?` predstavlja bilo koji pojedinačni znak. Takođe možete navesti imena mnogih datoteka na komandnoj liniji.

Koristićemo džoker i pretražiti sve izvršne datoteke u `/bin` direktorijumu. Pošto će lista sadržati rezultate iz mnogih datoteka, koristićemo opciju `-f` (ime datoteke). Ovo će odštampati naziv datoteke na početku svakog reda. Tada možemo videti u kojoj je datoteci pronađen svaki string.

Prosleđujemo rezultate komandi `grep`, i tražimo stringove koji sadrže reč „Copyright“.

strings -f /bin/* | grep Copyright

Dobijamo uredan spisak izjava o autorskim pravima za svaku datoteku u `/bin` direktorijumu, sa imenom datoteke na početku svakog reda.

`strings` razjašnjeno

Nema misterije oko komande `strings`. To je tipična Linux komanda. Ona obavlja jednu vrlo specifičnu funkciju, i to veoma dobro.

Ona je samo još jedan u nizu Linux alata i zaista oživljava kada se koristi zajedno sa drugim komandama. Kada vidite kako može da posreduje između binarnih datoteka i drugih alata kao što je `grep`, počinjete da cenite funkcionalnost ove naizgled nejasne komande.