Cum să utilizați comanda șiruri de caractere pe Linux

Te întrebi cum poți vizualiza textul stocat într-un fișier binar sau de date? Comanda `strings` din Linux este instrumentul perfect pentru a extrage acele porțiuni de text, denumite „șiruri”, pentru tine.

Linux oferă o multitudine de comenzi care pot părea soluții în căutarea unei probleme. Comanda `strings` se încadrează cu siguranță în această categorie. Dar care este rolul ei? De ce am avea nevoie de o comandă care afișează șirurile de caractere tipăribile dintr-un fișier binar?

Să analizăm mai îndeaproape. Fișierele binare, precum cele executabile, pot include fragmente de text lizibile. Însă cum le putem accesa? Utilizând comenzi ca `cat` sau `less`, riscul de a bloca terminalul este mare. Programele concepute pentru fișiere text nu funcționează corect atunci când întâlnesc caractere non-imprimabile.

Majoritatea octeților dintr-un fișier binar nu sunt ușor de citit și nu pot fi afișați în terminal într-un mod inteligibil. Valorile binare care nu corespund caracterelor alfanumerice, semnelor de punctuație sau spațiilor albe, nu au reprezentări standard. Acestea din urmă sunt numite caractere „imprimabile”, în timp ce restul sunt „non-imprimabile”.

Așadar, încercarea de a vizualiza sau căuta text într-un fișier binar sau de date reprezintă o provocare. Aici intervine comanda `strings`. Aceasta extrage șirurile de caractere tipăribile din fișiere, permițând altor comenzi să le utilizeze fără a se confrunta cu caracterele non-imprimabile.

Cum folosim comanda `strings`

Utilizarea comenzii `strings` este simplă și directă. Trebuie doar să specificăm numele fișierului în care dorim să căutăm șiruri, direct în linia de comandă.

De exemplu, vom utiliza `strings` pe un fișier binar executabil numit „jibber”. Vom introduce `strings`, un spațiu, apoi „jibber” și vom apăsa Enter.

strings jibber

Șirurile sunt extrase din fișier și afișate în terminal.

Setarea lungimii minime a șirului

Implicit, `strings` caută șiruri cu o lungime de cel puțin patru caractere. Pentru a specifica o altă lungime minimă, folosim opțiunea `-n` (lungime minimă).

Reține că, cu cât lungimea minimă este mai mică, cu atât sunt mai mari șansele de a vedea mai multe rezultate irelevante.

Unele valori binare pot corespunde valorilor numerice ale caracterelor imprimabile. Dacă două astfel de valori se află una lângă alta în fișier și specificăm o lungime minimă de doi, octeții vor fi raportați ca un șir.

Pentru a solicita comenzii `strings` să utilizeze doi ca lungime minimă, introducem:

strings -n 2 jibber

Acum, rezultatele includ și șiruri de două caractere. Reține că spațiile sunt considerate caractere imprimabile.

Redirecționarea șirurilor prin `less`

Având în vedere că rezultatul comenzii `strings` poate fi lung, îl vom redirecționa prin `less`. Astfel, vom putea naviga prin fișier și căuta textul dorit.

strings jibber | less

Lista este acum afișată în `less`, începând cu partea de sus.

Utilizarea `strings` cu fișiere obiect

De obicei, codul sursă al unui program este compilat în fișiere obiect, care ulterior sunt legate de biblioteci pentru a crea un executabil binar. Vom analiza un fișier obiect numit `jibber.o`. Reține extensia „.o” la final.

strings jibber.o | less

Primele șiruri sunt împachetate pe coloana opt dacă sunt mai lungi de opt caractere. Dacă sunt împachetate, apare un caracter „H” pe coloana nouă. Acestea par a fi instrucțiuni SQL.

Derulând prin rezultat, observăm că această formatare nu se aplică întregului fișier.

Este interesant să comparăm diferențele dintre șirurile de text din fișierul obiect și executabilul final.

Căutarea în zone specifice ale fișierului

Programele compilate conțin diverse zone pentru stocarea textului. Implicit, `strings` caută în întregul fișier. Este echivalent cu utilizarea opțiunii `-a` (toate). Pentru a căuta șiruri doar în secțiunile de date inițializate, încărcate din fișier, folosim opțiunea `-d` (date).

strings -d jibber | less

În majoritatea cazurilor, este suficient să folosim setarea implicită și să căutăm în tot fișierul.

Afișarea offset-ului șirurilor

Putem solicita comenzii `strings` să afișeze offset-ul de la începutul fișierului unde se află fiecare șir. Acest lucru se realizează cu opțiunea `-o` (offset).

strings -o parse_phrases | less

Offset-ul este afișat în format octal.

Pentru a afișa offset-ul într-o bază numerică diferită, cum ar fi zecimală sau hexazecimală, folosim opțiunea `-t` (radix), urmată de `d` (zecimal), `X` (hexazecimal), sau `o` (octal). Utilizarea `-to` este echivalentă cu `-o`.

strings -t d parse_phrases | less

Acum, offset-urile sunt afișate în format zecimal.

strings -t x parse_phrases | less

Offset-urile sunt afișate în format hexazecimal.

Includerea spațiilor albe

Comanda `strings` consideră tab-urile și spațiile ca făcând parte din șirurile găsite. Alte caractere spațiu alb, precum linia nouă sau returul de cărucior, nu sunt tratate ca parte a șirurilor. Opțiunea `-w` (spații albe) face ca toate caracterele spațiu alb să fie incluse în șiruri.

strings -w add_data | less

În rezultat vedem o linie goală, ca efect al caracterelor invizibile de tip retur de cărucior și linie nouă, de la sfârșitul celui de-al doilea rând.

Nu suntem limitați la fișiere

Putem folosi `strings` cu orice sursă care produce un flux de octeți.

De exemplu, putem analiza memoria cu acces aleatoriu (RAM) a computerului nostru.

Vom avea nevoie de `sudo` pentru că accesăm `/dev/mem`, un fișier de dispozitiv care conține o imagine a memoriei principale a computerului.

sudo strings /dev/mem | less

Lista nu este întregul conținut al memoriei RAM, ci doar șirurile care pot fi extrase.

Căutarea în mai multe fișiere

Putem folosi metacaractere pentru a selecta grupuri de fișiere. Caracterul `*` reprezintă mai multe caractere, iar `?` un singur caracter. De asemenea, putem specifica mai multe nume de fișiere pe linia de comandă.

Vom utiliza un metacaracter și vom căuta în toate executabilele din directorul `/bin`. Având în vedere că lista va include rezultate din mai multe fișiere, vom folosi opțiunea `-f` (nume fișier), care afișează numele fișierului la începutul fiecărei linii. Astfel, vom identifica în ce fișier a fost găsit fiecare șir.

Redirecționăm rezultatele către `grep` și căutăm șiruri care conțin cuvântul „Copyright”.

strings -f /bin/* | grep Copyright

Obținem o listă a declarațiilor de copyright din fiecare fișier din `/bin`, cu numele fișierului la începutul fiecărei linii.

Comanda `strings` în Concluzie

Comanda `strings` nu este deloc misterioasă, fiind o comandă tipică din Linux, care îndeplinește un rol foarte specific și o face foarte bine.

Aceasta este o unealtă esențială din arsenalul Linux, care strălucește în colaborare cu alte comenzi. Atunci când vezi cum interacționează cu fișierele binare și cu alte instrumente precum `grep`, începi să apreciezi utilitatea acestei comenzi aparent obscure.