====== 3. Interfața în linia de comandă ====== Interfața în linia de comandă este forma cea mai "portabilă" de folosire a unui sistem Linux/Unix. Interfața în linia de comandă, deși mai greu de folosit decât interfața grafică, are avantajul că se prezintă în aceeași formă pe toate sistemele Unix/Linux. În plus este foarte ușor extensibilă (se pot adăuga comenzi noi sau opțiuni noi la parametri) și se pot automatiza acțiuni folosind (shell) scripting. ===== Subiecte abordate ===== * Terminal, shell * Prompt, comenzi * Command completion * Contul privilegiat * Comenzi: opțiuni, parametri ==== Utilitare folosite ==== * ''touch'', ''mkdir'', ''ls'', ''cd'' * ''sudo'', ''su'' * ''tar'', ''zip'', ''unzip'' ===== Resurse utile ===== * TODO * TODO ===== Exerciții ===== ==== Demo-uri ==== Ce înseamnă promptul unei comenzi? Copy paste în terminal Folosirea TAB pentru completion-ul unei comenzi. Folosirea '''' pentru afișarea tuturor posibilităților. Autentificarea ca ''root''. Rularea comenzii ''chown'' ca ''root'' și prefixată de ''sudo''. Anatomia comenzii ps -e -o pid,ppid,cmd Anatomia comenzii tar -czvf a.tar.gz /etc/security/ Anatomia comenzii actualizate tar -c -z -v -f a.tar.gz /etc/security tar --create --gzip --verbose --file a.tar.gz /etc/security Folosirea ''%%--help%%'' pentru documentare legată de o comandă. Opțiuni, opțiuni parametrizate, parametri pentru o comandă. Codul de eroare al unei comenzi ==== Copy-paste în terminal ==== După ce ați deschis terminalul dați următoarea comandă (nu trebuie să înțelegeți acum ce face): cat /dev/urandom | tr -dc _A-Z-a-z-0-9 | head -c 33 && echo -ne "\n" Cum dăm Copy&Paste într-un terminal? * Copy: ''**Ctrl+Insert**'' (valabil în orice terminal. În Ubuntu mai poate fi folosită și combinația ''**Ctrl+Shift+c**'') * Paste: ''**Shift+Insert**'' (valabil în orice terminal. În Ubuntu mai poate fi folosită și combinația ''**Ctrl+Shift+v**'' Am dat o comandă lungă pe care vreau să o mai dau o dată. Cum fac? * **R**: apasă ''uparrow'' (săgeată sus) Vreau să copiez o comandă din terminal fără a folosi mouse-ul. Cum fac? * **R**: Folosim săgeată sus pentru a prelua comanda lungă anterioară. Apoi vom folosi ''**Ctrl+a**'' pentru a ne duce la începutul rândului. Apoi apăsăm ''**Ctrl+k**'' pentru a copia toată linia. Observăm că a dispărut. Acum apăsăm ''**Ctrl+y**'' (yank). ==== Prompt-ul și comenzi simple ==== Rulați comanda ''whoami''. Ce v-a afișat? Care este utilizatorul curent și care este numele mașinii? Rulați comanda ''hostname'' și observați ce afișează. Rulați comanda ''sudo su''. Verificați din nou utilizatorul curent cu comanda ''whoami''. Părăsiți prompt-ul de ''root'' folosind comanda ''exit'' sau combinația de taste ''Ctrl+d''. ==== Comenzi rulate de root ==== Rulați, ca utilizator obișnuit, comanda ifconfig Observați că nu afișează nimic. Apoi, rulați ''sudo su'' ca să obțineți un prompt de ''root'' și rulați și acolo comanda ifconfig Observați că acum afișează informații despre rețea. Pentru a identifica această cauză, rulați, în fiecare dintre cele două prompturi (de utilizator obișnuit și de ''root'') cele două comenzi de mai jos echo $PATH which ifconfig ==== Comenzi cu argumente ==== Aflați informații despre Linux-ul instalat folosind comanda ''uname'' cu parametrul (flag-ul) ''-a'' sau {{{--all}}}. Ce alte flag-uri are comanda ''uname''? Rulați comanda ''zip''. Merge fără a avea vreun argument? Creați două fișiere cu comanda ''touch''. ''touch'' primește ca argumente (număr variabil de argumente) numele fișierelor. Rulati comanda touch file1 file2 file3 Arhivați fișierele //file1// și //file2// într-o arhivă //files.zip//. Comanda zip files.zip file1 file2 Rulati comanda ''zip'' fără parametri și observați flag-ul de "quiet operation". Rulați comanda ''zip'' cu flag-ul ''-q'' pentru a adăuga și fișierul //file3// la arhivă. Adică rulați zip -q files.zip file3 ==== Documentație ==== Aflați ce face comanda ''who'' folosind utilitarul ''whatis'': ''whatis who''. Ce argumente poate primi comanda ''who''? Folosiți help-ul intern al comenzii: {{{who --help}}}. Similar, aflați ce face comanda ''last''. Rulați comanda id Pentru a afișa informații despre utilizatorul curent. Folosiți opțiunea pentru a afișa doar UID-ul utilizatorului. La fel, folosiți opțiunea pentru a afișa doar GID-urile grupurilor din care face parte utilizatorul. ==== Rulare vimtutor ==== Rulați comanda ''vimtutor'' pentru a vă acomoda cu editorul Vim. ==== Scriere program C în Vim și compilare ==== Deschideți un terminal. Dorim să ne asigurăm că suntem în directorul ''/home/training''. Folosiți comanda pwd Folosiți comanda ''vim hello.c'' pentru a edita un fișier C care afișează mesajul ''Hello, World!''. Puteți folosi programul de mai jos: #include int main(void) { puts("Hello, World!"); return 0; } Compilați programul scris la mai sus, folosind comanda gcc hello.c -o hello Încercați să scrieți de mână, **folosind tasta TAB** comanda astfel: ''gcc hel -o hello'' Spre deosebire de Windows, unde executabilele au, în general extensia ''.exe'', într-un sistem Linux fișierele executabile se numesc, în general, **binare**. ''hello'' este un astfel de fișier binar. Se poate rula folosind comanda ./hello ==== Afișare mesaje la consolă ==== Pentru a afișa mesaje la consolă putem folosi comanda ''echo'': echo Hello echo "I'm here" echo -e "\t1\t2" ==== Coduri de eroare ==== O comandă își poate termina execuția cu succes (status 0) sau cu eroare (status diferit de 0). Într-un terminal statusul cu care s-a încheiat ultima comandă lansată se poate vedea cu ajutorul comenzii: echo $? true și false sunt două programe care întotdeauna se termină cu succes, respectiv cu eroare. Testați acest lucru: true echo $? false echo $? Folosind operatorii ''&&'' și ''||'', putem rula o a doua comandă doar dacă prima s-a încheiat cu succes, respectiv eroare. Operatorii se aseamănă cu funcțiile logice AND și OR. true && echo "Success" false && echo "Success" true || echo "Fail" false || echo "Fail" Căutați un fișier (folosind ''locate'') și afișați pe ecran "FOUND", în cazul în care fișierul a fost găsit. ==== Globbing ==== Am văzut în secțiunea de Demo că putem folosi anumite caractere ce țin locul unor bucăți de text, de exemplu caracterul ''*''. De exemplu, dacă dorim să listăm toate fișierele din ''/etc'' care încep cu stringul ''ssh'' putem folosi comanda: student@uso:~$ ls /etc/ssh* După cum observați, caracterul ''*'' ține loc pentru %%"oricâte și orice caractere"%%. Procedați asemănător și afișați fișierele sau directoarele din ''/etc'' cu extensia ''.conf''. Realizați o arhivă de tipul ''zip'' în directorul ''home'' al utilizatorului ''student'' (''/home/student'') care să conțină toate fișierele și directoarele din ''/etc/'' care conțin stringul ''conf'' în numele lor. Este foarte probabil ca printre fișierele și directoarele găsite să existe directoare care nu sunt goale. Pentru a arhiva și conținutul acestora trebuie să specificăm acest lucru explicit comenzii ''zip''. Căutați în output-ul comenzii zip --help după opțiunea care trece recursiv prin directoare (//recurse into directories//). Comanda ''unzip'' dezarhivează o arhivă ''.zip'' dar are și o opțiunea de listare a conținutului acelei arhive fără a o dezarhiva însă. Identificați acea opțiune. ==== Lucrul cu fișiere ==== Creați trei fișiere, denumite ''unu'', ''doi'' și ''trei'' în directorul propriu (directorul de tip home) și afişați-le folosind comanda {{{ls}}}. Adăugați apoi parametrul ''-l'' comenzii ''ls'' pentru a afișa mărimile acestor fișiere. Așteptați un minut după crearea fișierelor de mai sus. Folosiți comanda {{{touch}}} pe fișierul {{{unu}}}. Folosiți, din nou, comanda {{{ls -l}}}. Ce observați? Creați în directorul propriu două directoare denumite ''dir1'' și ''dir2''. Listați conținutul directoarelor. Creați fisierul {{{file.dat}}} care să conțină 10MB de date aleatoare, folosiți comanda dd if=/dev/urandom of=file.dat bs=1M count=10 Comprimare fișierul {{{file.dat}}} pe rând în format {{{gzip}}}, {{{bzip2}}} și {{{zip}}}. Care sunt diferențele de mărime ale arhivelor? După fiecare comprimare fișierul inițial se șterge în cazul comenzilor ''gzip'' și ''bzip2'' așa că va trebui să-l regenerați. Aflați cât durează fiecare comandă de comprimare folosind comanda ''time'' înaintea oricărei alte comenzi.