Comenzile de bază Linux pentru testeri și nu numai

Prefață

Salut tuturor! Mă numesc Sasha și mă ocup de testarea backend-ului (servicii Linux și API) de mai bine de șase ani. Ideea acestui articol mi-a venit după o nouă solicitare din partea unui tester cunoscut care m-a întrebat ce ar putea citi despre comenzile Linux înainte de un interviu. De obicei, de la un candidat pentru poziția de inginer QA se așteaptă să cunoască comenzile de bază (dacă, desigur, se preconizează că va lucra cu Linux), dar cum poți înțelege despre ce comenzi ar trebui să citești în timpul pregătirii pentru interviu, dacă ai puțin sau deloc experiență cu Linux?

Așadar, deși despre acest subiect s-a scris deja de multe ori, am decis totuși să scriu un alt articol „Linux pentru începători” și să enumer aici comenzile de bază pe care trebuie să le știi înainte de orice interviu în departamentul (sau compania) care utilizează Linux. M-am gândit la comenzile și utilitarele pe care le folosesc cel mai des, am adunat feedback de la colegi și am compus toate acestea într-un singur articol. Articolul este împărțit în 3 părți: mai întâi informații succinte despre bazele input-output în terminalul Linux, apoi o prezentare a celor mai elementare comenzi, iar în a treia parte se discută soluțiile pentru probleme tipice în Linux.

Fiecare comandă are multe opțiuni, nu toate vor fi enumerate aici. Întotdeauna poți introduce `man` sau `--help` pentru a obține mai multe informații despre comandă.

Exemplu:

[user@testhost ~]$ mkdir --help
Utilizare: mkdir [OPȚIUNE]...DIRECTOR...
Creează DIRECTOR(II), dacă nu există deja.

Argumentele obligatorii pentru opțiunile lungi sunt obligatorii și pentru opțiunile scurte.
  -m, --mode=MOD           setează modul fișier (ca în chmod), nu a=rwx - umask
  -p, --parents             nicio eroare dacă există, creează directoare părinte după cum este necesar
  -v, --verbose             afișează un mesaj pentru fiecare director creat
  -Z                       setează contextul de securitate SELinux pentru fiecare director creat
                            la tipul implicit
      --context[=CTX]        la fel ca -Z, sau dacă CTX este specificat, atunci setează contextul de securitate SELinux
                            sau SMACK la CTX
      --help                  afișează acest ajutor și iese
      --version               afișează informații despre versiune și iese

Ajutor online GNU coreutils: 
Pentru documentația completă, rulează: info coreutils 'invocarea mkdir'

Dacă o anumită comandă durează prea mult, o poți termina apăsând în consolă Ctrl+C (procesului i se trimite semnalul SIGINT).

Puțin despre ieșirea comenzilor

Când un proces este lansat în Linux, se creează 3 fluxuri standard de date pentru acest proces: stdin, stdout și stderr. Au numerele 0, 1 și 2 respectiv. Dar acum ne interesează stdout și, într-o măsură mai mică, stderr. Din denumiri nu este greu de dedus că stdout este folosit pentru a ieși datele, iar stderr — pentru afișarea mesajelor de eroare. Implicit, la executarea comenzii în Linux stdout și stderr afișează toată informația pe consolă, totuși, dacă ieșirea comenzii este mare, poate fi convenabil să o redirecționați într-un fișier. Acest lucru se poate face, de exemplu, astfel:

[user@testhost ~]$ man signal > man_signal

Dacă vom afișa conținutul fișierului man_signal, vom vedea că este identic cu ceea ce ar fi fost dacă am fi executat pur și simplu comanda `man signal`.

Operația de redirecționare `>` utilizează implicit stdout. Se poate specifica redirecționarea stdout în mod explicit: `1>. De asemenea, se poate specifica redirecționarea stderr: `2>. Aceste operații pot fi combinate pentru a separa ieșirea normală a comenzii de ieșirea mesajelor de eroare:

[user@testhost ~]$ man signal 1> man_signal 2> man_signal_error_log

Redirecționarea și stdout, și stderr într-un singur fișier se poate face astfel:

[user@testhost ~]$ man signal > man_signal 2>&1

Operația de redirecționare `2>&1` înseamnă redirecționarea stderr în aceeași direcție în care este direcționată stdout.

Un alt instrument convenabil pentru lucrul cu intrarea și ieșirea (sau, mai precis, un mijloc convenabil de interacțiune între procese) este pipe (sau conveyor). Conveioarele sunt utilizate frecvent pentru a conecta mai multe comenzi: stdout ieșirea unei comenzi este direcționată către stdin următoarea, și așa mai departe în lanț:

[user@testhost ~]$ ps aux | grep docker | tail -n 2
root     1045894  0.0  0.0   7512  3704 ?        Sl   16:04   0:00 docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/2fbfddaf91c1bb7b9a0a6f788f3505dd7266f1139ad381d5b51ec1f47e1e7b28 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
531      1048313  0.0  0.0 110520  2084 pts/2    S+   16:12   0:00 grep --color=auto docker

Comenzi de bază Linux

pwd

Afișează directorul curent (de lucru).

[user@testhost ~]$ pwd
/home/user

date

Afișează data și ora curentă a sistemului.

[user@testhost ~]$ date
Mon Dec 16 13:37:07 UTC 2019
[user@testhost ~]$ date +%s
1576503430

w

Această comandă arată cine este autentificat în sistem. De asemenea, afișează uptime și LA (load average).

[user@testhost ~]$ w
 05:47:17 up 377 days, 17:57,  1 user,  load average: 0,00, 0,01, 0,05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user     pts/0    32.175.94.241    05:47    2.00s  0.01s  0.00s w

ls

Afișează conținutul directorului. Dacă nu se transmite un cale, se va afișa conținutul directorului curent.

[user@testhost ~]$ pwd
/home/user
[user@testhost ~]$ ls
qqq
[user@testhost ~]$ ls /home/user
qqq
[user@testhost ~]$ ls /
bin  boot  cgroup  dev  etc  home  lib  lib64  local  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  swap  sys  tmp  usr  var

Personal, eu folosesc frecvent opțiunile -l (format de listare lungă - ieșire în coloane cu informații suplimentare despre fișiere), -t (sortare după timpul de modificare a fișierului/directorului) și -r (sortare inversă — combinată cu -t cele mai „fresc” fișiere vor fi la bază):

[user@testhost ~]$ ls -ltr /
total 4194416
drwxr-xr-x    2 root root    4096 Jan  6  2012 srv
drwxr-xr-x    2 root root    4096 Jan  6  2012 selinux
drwxr-xr-x    2 root root    4096 Jan  6  2012 mnt
drwxr-xr-x    2 root root    4096 Jan  6  2012 media
drwx------    2 root root   16384 Oct  1  2017 lost+found
drwxr-xr-x    2 root root    4096 Oct  1  2017 local
drwxr-xr-x   13 root root      4096 Oct  1  2017 usr
drwxr-xr-x   11 root root      4096 Apr 10  2018 cgroup
drwxr-xr-x    4 root root    4096 Apr 10  2018 run
-rw-------    1 root root 4294967296 Sep 10  2018 swap
dr-xr-xr-x   10 root root      4096 Dec 13  2018 lib
drwxr-xr-x    6 root root    4096 Mar  7  2019 opt
drwxr-xr-x   20 root root      4096 Mar 19  2019 var
dr-xr-xr-x   10 root root   12288 Apr  9  2019 lib64
dr-xr-xr-x    2 root root    4096 Apr  9  2019 bin
dr-xr-xr-x    4 root root    4096 Apr  9  2019 boot
dr-xr-xr-x    2 root root   12288 Apr  9  2019 sbin
dr-xr-xr-x 3229 root root          0 Jul  2 10:19 proc
drwxr-xr-x   34 root root      4096 Oct 28 13:27 home
drwxr-xr-x   93 root root      4096 Oct 30 16:00 etc
dr-xr-x---   11 root root      4096 Nov  1 13:02 root
dr-xr-xr-x   13 root root          0 Nov 13 20:28 sys
drwxr-xr-x   16 root root      2740 Nov 26 08:55 dev
drwxrwxrwt    3 root root    4096 Nov 26 08:57 tmp

Există 2 nume speciale de directoare: „.” și „..“. Primul reprezintă directorul curent, al doilea — directorul părinte. Acestea pot fi utile în diverse comenzi, în special, ls:

[user@testhost home]$ pwd
/home
[user@testhost home]$ ls ..
bin  boot  cgroup  dev  etc  home  lib  lib64  local  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  swap  sys  tmp  usr  var
[user@testhost home]$ ls ../home/user/
qqq

De asemenea, există o opțiune utilă pentru a afișa fișierele ascunse (care încep cu „.«) — -a:

[user@testhost ~]$ ls -a
.  ..  1  .bash_history  .bash_logout  .bash_profile  .bashrc  .lesshst  man_signal  man_signal_error_log  .mongorc.js  .ssh  temp  test  .viminfo

Și mai poți folosi opțiunea -h — afișare în format ușor de citit (observați dimensiunile fișierelor):

[user@testhost ~]$ ls -ltrh
total 16K
-rwxrwx--x 1 user user   31 Nov 26 11:09 temp
-rw-rw-r-- 1 user user 6.0K Dec  3 16:02 1
drwxrwxr-x 2 user user 4.0K Dec  4 10:39 test

cd

Schimbă directorul curent.

[user@testhost ~]$ pwd
/home/user
[user@testhost ~]$ cd /home/
[user@testhost home]$ pwd
/home

Dacă nu este transmis numele directorului ca argument, va fi folosită variabila de mediu $HOME, adică directorul home. De asemenea, poate fi convenabil să folosești `~` — simbol special care reprezintă $HOME:

[user@testhost etc]$ pwd
/etc
[user@testhost etc]$ cd ~/test/
[user@testhost test]$ pwd
/home/user/test

mkdir

Creează un director.

[user@testhost ~]$ mkdir test
[user@testhost ~]$ ls -ltr
total 38184
-rw-rw-r-- 1 user user 39091284 Nov 22 14:14 qqq
drwxrwxr-x 2 user user     4096 Nov 26 10:29 test

Uneori este necesară crearea unei structuri specifice de directoare: de exemplu, un director în interiorul altui director, care nu există. Pentru a nu face introduceri repetate, mkdir, se poate utiliza opțiunea -p — aceasta permite crearea tuturor directoarelor lipsă din ierarhie. De asemenea, cu această opțiune mkdir nu va returna o eroare dacă directorul există.

[user@testhost ~]$ ls
qqq  test
[user@testhost ~]$ mkdir test2/subtest
mkdir: cannot create directory ‘test2/subtest’: No such file or directory
[user@testhost ~]$ mkdir -p test2/subtest
[user@testhost ~]$ ls
qqq  test  test2
[user@testhost ~]$ ls test2/
subtest
[user@testhost ~]$ mkdir test2/subtest
mkdir: cannot create directory ‘test2/subtest’: File exists
[user@testhost ~]$ mkdir -p test2/subtest
[user@testhost ~]$ ls test2/
subtest

rm

Șterge fișierul.

[user@testhost ~]$ ls
qqq  test  test2
[user@testhost ~]$ rm qqq
[user@testhost ~]$ ls
test  test2

Opțiune -r permite ștergerea recursivă a directoarelor împreună cu tot conținutul lor, opțiunea -f permite ignorarea erorilor la ștergere (de exemplu, cele legate de un fișier inexistent). Aceste opțiuni permit, grosso modo, garantarea ștergerii întregii ierarhii de fișiere și directoare (dacă utilizatorul are permisiuni pentru aceasta), prin urmare, trebuie utilizate cu precauție (un exemplu clasic de glumă — „rm -rf /«, în anumite circumstanțe, va șterge, dacă nu întregul sistem, atunci foarte multe fișiere importante pentru funcționarea sa).

[user@testhost ~]$ ls
test  test2
[user@testhost ~]$ ls -ltr test2/
total 4
-rw-rw-r-- 1 user user    0 Nov 26 10:40 temp
drwxrwxr-x 2 user user 4096 Nov 26 10:40 temp_dir
[user@testhost ~]$ rm -rf test2
[user@testhost ~]$ ls
test

cp

Copiază un fișier sau un director.

[user@testhost ~]$ ls
temp  test
[user@testhost ~]$ cp temp temp_clone
[user@testhost ~]$ ls
temp  temp_clone  test

Această comandă are și opțiuni -r și -f, care pot fi utilizate pentru a garanta copierea ierarhiei directoarelor și folderelor într-un alt loc.

mv

Mută sau redenumește un fișier sau un director.

[user@testhost ~]$ ls -ltr
total 4
drwxrwxr-x 2 user user 4096 Nov 26 10:29 test
-rw-rw-r-- 1 user user    0 Nov 26 10:45 temp
-rw-rw-r-- 1 user user    0 Nov 26 10:46 temp_clone
[user@testhost ~]$ ls test
[user@testhost ~]$ mv test test_renamed
[user@testhost ~]$ mv temp_clone test_renamed/
[user@testhost ~]$ ls
temp  test_renamed
[user@testhost ~]$ ls test_renamed/
temp_clone

cat

Afișează conținutul unui fișier (sau fișiere).

[user@testhost ~]$ cat temp
Content of a file.
Lalalala...

De asemenea, merită menționate comenzile head (afișează n primele linii sau octeți din fișier) și tail (despre care — mai departe).

tail

Afișează n ultimele linii sau octeți din fișier.

[user@testhost ~]$ tail -1 temp
Lalalala...

O opțiune foarte utilă este -f — permite afișarea datelor noi într-un fișier în timp real.

less

Uneori un fișier text este prea mare și este incomod să fie afișat cu comanda cat. Atunci îl poți deschide folosind comanda less: fișierul va fi afișat în părți, navigarea între aceste părți, căutarea și alte funcționalități simple sunt disponibile.

[user@testhost ~]$ less temp

De asemenea, poate fi convenabil să folosești less cu un pipeline (pipe):

[user@testhost ~]$ grep "ERROR" /tmp/some.log | less

ps

Afișează lista proceselor.

[user@testhost ~]$ ps
    PID TTY          TIME CMD
 761020 pts/2    00:00:00 bash
 809720 pts/2    00:00:00 ps

Eu personal folosesc întotdeauna opțiunile BSD „aux“ — pentru a afișa toate procesele din sistem (deoarece pot fi multe procese, am afișat doar primele 5 dintre ele, folosind un pipeline (pipe) și comanda head):

[user@testhost ~]$ ps aux | head -5
USER         PID %CPU %MEM    VSZ   RSS TTY     STAT START   TIME COMMAND
root           1  0.0  0.0  19692  2600 ?        Ss   Jul02   0:10 /sbin/init
root           2  0.0  0.0     0     0 ?        S    Jul02   0:03 [kthreadd]
root           4  0.0  0.0     0     0 ?        I<   Jul02   0:00 [kworker/0:0H]
root           6  0.0  0.0     0     0 ?        I<   Jul02   0:00 [mm_percpu_wq]

Mulți folosesc, de asemenea, opțiunile BSD „axjf“, care permit afișarea arborelui proceselor (aici am eliminat o parte din output pentru a demonstra):

[user@testhost ~]$ ps axjf
   PPID     PID    PGID     SID TTY        TPGID STAT   UID   TIME COMMAND
      0       2       0       0 ?             -1 S        0   0:03 [kthreadd]
      2       4       0       0 ?             -1 I<       0   0:00  _ [kworker/0:0H]
      2       6       0       0 ?             -1 I<       0   0:00  _ [mm_percpu_wq]
      2       7       0       0 ?             -1 S        0   4:08  _ [ksoftirqd/0]
...
...
...
      1    4293    4293    4293 tty6        4293 Ss+      0   0:00 /sbin/mingetty /dev/tty6
      1  532967  532964  532964 ?             -1 Sl     495   0:00 /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent --log /var/log/td-agent/td-agent.log --use-v1-config --group td-agent --daemon /var/run/td-agent/td-agent.pid
 532967  532970  532964  532964 ?             -1 Sl     495 803:06  _ /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent --log /var/log/td-agent/td-agent.log --use-v1-config --group td-agent --daemon /var/run/td-agent/td-agent.pid
      1  537162  533357  532322 ?             -1 Sl       0 5067:43 /usr/bin/dockerd --default-ulimit nofile=262144:262144 --dns=172.17.0.1
 537162  537177  537177  537177 ?             -1 Ssl      0 4649:28  _ docker-containerd --config /var/run/docker/containerd/containerd.toml
 537177  537579  537579  537177 ?             -1 Sl       0   4:48  |   _ docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/0ee89b20deb3cf08648cd92e1f3e3c661ccffef7a0971
 537579  537642  537642  537642 ?             -1 Ss    1000  32:11  |   |   _ /usr/bin/python /usr/bin/supervisord -c /etc/supervisord/api.conf
 537642  539764  539764  537642 ?             -1 S     1000   0:00  |   |       _ sh -c echo "READY"; while read -r line; do echo "$line"; supervisorctl shutdown; done
 537642  539767  539767  537642 ?             -1 S     1000   5:09  |   |       _ php-fpm: master process (/etc/php73/php-fpm.conf)
 539767  783097  539767  537642 ?             -1 S     1000   0:00  |   |       |   _ php-fpm: pool test
 539767  783131  539767  537642 ?             -1 S     1000   0:00  |   |       |   _ php-fpm: pool test
 539767  783185  539767  537642 ?             -1 S     1000   0:00  |   |       |   _ php-fpm: pool test
...
...
...

Această comandă are multe opțiuni diferite, așa că, dacă o folosiți frecvent, vă recomand să consultați documentația. În cele mai multe cazuri, totuși, este suficient să știți „ps aux«.

kill

Trimite un semnal procesului. În mod implicit, se trimite semnalul SIGTERM, care încheie procesul.

[user@testhost ~]$ ps ux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
531      1027147  0.0  0.0 119956  4260 ?        S    14:51   0:00 sshd: user@pts/1
531      1027149  0.0  0.0 115408  3396 pts/1    Ss   14:51   0:00 -bash
531      1027170  0.0  0.0 119956  4136 ?        R    14:51   0:00 sshd: user@pts/2
531      1027180  0.0  0.0 115408  3564 pts/2    Ss   14:51   0:00 -bash
531      1033727  0.0  0.0 107960   708 pts/1    S+   15:17   0:00 sleep 300
531      1033752  0.0  0.0 117264  2604 pts/2    R+   15:17   0:00 ps ux
[user@testhost ~]$ kill 1033727
[user@testhost ~]$ ps ux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
531      1027147  0.0  0.0 119956  4260 ?        S    14:51   0:00 sshd: user@pts/1
531      1027149  0.0  0.0 115408  3396 pts/1    Ss+  14:51   0:00 -bash
531      1027170  0.0  0.0 119956  4136 ?        R    14:51   0:00 sshd: user@pts/2
531      1027180  0.0  0.0 115408  3564 pts/2    Ss   14:51   0:00 -bash
531      1033808  0.0  0.0 117268  2492 pts/2    R+   15:17   0:00 ps ux

Deoarece un proces poate avea gestionari de semnale, kill nu duce întotdeauna la rezultatul așteptat — terminarea imediată a procesului. Pentru a «opri» procesul cu siguranță, trebuie să trimiteți procesului semnalul SIGKILL. Cu toate acestea, aceasta poate duce la pierderea de date (de exemplu, dacă procesul trebuie să salveze informații pe disc înainte de a se închide), așa că trebuie să folosiți această comandă cu prudență. Numărul semnalului SIGKILL — 9, așa că varianta scurtă a comenzii arată astfel:

[user@testhost ~]$ ps ux | grep sleep
531      1034930  0.0  0.0 107960   636 pts/1    S+   15:21   0:00 sleep 300
531      1034953  0.0  0.0 110516  2104 pts/2    S+   15:21   0:00 grep --color=auto sleep
[user@testhost ~]$ kill -9 1034930
[user@testhost ~]$ ps ux | grep sleep
531      1035004  0.0  0.0 110516  2092 pts/2    S+   15:22   0:00 grep --color=auto sleep

În afară de cele menționate, SIGTERM și SIGKILL mai există o mulțime de semnale diferite, lista lor poate fi găsită ușor pe internet. Și nu uitați că semnalele SIGKILL și SIGSTOP nu pot fi interceptate sau ignorate.

ping

Trimiteți un pachet ICMP ECHO_REQUEST.

[user@testhost ~]$ ping google.com
PING google.com (172.217.15.78) 56(84) bytes of data.
64 bytes from iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=1 ttl=47 time=1.85 ms
64 bytes from iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=2 ttl=47 time=1.48 ms
64 bytes from iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=3 ttl=47 time=1.45 ms
64 bytes from iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=4 ttl=47 time=1.46 ms
64 bytes from iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=5 ttl=47 time=1.45 ms
^C
--- google.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 1.453/1.541/1.850/0.156 ms

Implicit ping funcționează până când este terminat manual. De aceea, poate fi utilă opțiunea -c — numărul de pachete după care ping se va termina singur. O altă opțiune pe care o folosesc uneori este -i, intervalul dintre trimiterea pachetelor.

[user@testhost ~]$ ping -c 3 -i 5 google.com
PING google.com (172.217.5.238) 56(84) bytes of data.
64 bytes from iad30s07-in-f238.1e100.net (172.217.5.238): icmp_seq=1 ttl=47 time=1.55 ms
64 bytes from iad30s07-in-f14.1e100.net (172.217.5.238): icmp_seq=2 ttl=47 time=1.17 ms
64 bytes from iad30s07-in-f14.1e100.net (172.217.5.238): icmp_seq=3 ttl=47 time=1.16 ms

--- google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 10006ms
rtt min/avg/max/mdev = 1.162/1.295/1.551/0.181 ms

ssh

Clientul SSH OpenSSH permite conectarea la un gazdă la distanță.

MacBook-Pro-User:~ user$ ssh user@11.11.22.22
Ultima conectare: Mar Nov 26 11:27:39 2019 de la another_host
[user@testhost ~]$ hostname
testhost

Există multe nuanțe în utilizarea SSH, iar acest client are o gamă largă de funcționalități, așadar, dacă doriți (sau aveți nevoie), puteți citi mai multe despre aceasta. în detaliu.

scp

Pentru a copia fișiere între gazde (se folosește ssh).

[user@testhost ~]$ pwd
/home/user
[user@testhost ~]$ ls
temp test_renamed
[user@testhost ~]$ exit
logout
Conexiunea cu 11.11.22.22 s-a încheiat.
MacBook-Pro-Aleksandr:~ user$ scp user@11.11.22.22:/home/user/temp Downloads/
temp                                                                                                                               100%   31     0.2KB/s   00:00
MacBook-Pro-Aleksandr:~ user$ cat Downloads/temp
Conținutul unui fișier.
Lalalala...

rsync

De asemenea, pentru sincronizarea directorilor între gazde, se poate utiliza rsync (-a — modul de arhivare, permite copierea întregului conținut al directorului «așa cum este», -v — afișează informații suplimentare în consolă):

MacBook-Pro-User:~ user$ ls Downloads/user
ls: Downloads/user: Nu există un astfel de fișier sau director
MacBook-Pro-User:~ user$ rsync -av user@testhost:/home/user Downloads
receiving file list ... done
user/
user/.bash_history
user/.bash_logout
user/.bash_profile
user/.bashrc
user/.lesshst
user/.mongorc.js
user/.viminfo
user/1
user/man_signal
user/man_signal_error_log
user/temp
user/.ssh/
user/.ssh/authorized_keys
user/test/
user/test/created_today
user/test/temp_clone

sent 346 bytes  received 29210 bytes  11822.40 bytes/sec
total size is 28079  speedup is 0.95
MacBook-Pro-User:~ user$ ls -a Downloads/user
.                .bash_history        .bash_profile        .lesshst             .ssh                 1                man_signal_error_log test
..               .bash_logout         .bashrc             .mongorc.js          .viminfo             man_signal           temp

echo

Afișează un text pe ecran.

[user@testhost ~]$ echo "Hello"
Hello

Aici merită menționate opțiunile -n — nu adăuga un caracter de sfârșit de linie la final, și -e — activează interpretarea escapării cu ajutorul «».

[user@testhost ~]$ echo "tHellon"
tHellon
[user@testhost ~]$ echo -n "tHellon"
tHellon[user@testhost ~]$
[user@testhost ~]$ echo -ne "tHellon"
	Hello

De asemenea, cu această comandă se pot afișa valorile variabilelor. De exemplu, în Linux codul de ieșire al ultimei comenzi terminate este stocat într-o variabilă specială. $?, și astfel se poate afla ce fel de eroare a apărut în ultima aplicație pornită:

[user@testhost ~]$ ls    # nu va fi nicio eroare
1  man_signal  man_signal_error_log  temp  test
[user@testhost ~]$ echo $?    # vom obține 0 — nu a fost nicio eroare
0
[user@testhost ~]$ ls qwerty    # va fi o eroare
ls: cannot access qwerty: No such file or directory
[user@testhost ~]$ echo $?    # vom obține 2 — Misuse of shell builtins (conform documentației Bash)
2
[user@testhost ~]$ echo $?    # ultimul echo a funcționat fără erori, vom obține 0
0

telnet

Client pentru protocolul TELNET. Este utilizat pentru comunicarea cu un alt host.

[user@testhost ~]$ telnet example.com 80
Trying 93.184.216.34...
Connected to example.com.
Escape character is '^]'.
GET / HTTP/1.1
Host: example.com

HTTP/1.1 200 OK
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Tue, 26 Nov 2019 11:59:18 GMT
Etag: "3147526947+gzip+ident"
Expires: Tue, 03 Dec 2019 11:59:18 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (dcb/7F3B)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1256

... aici a fost corpul răspunsului, pe care l-am tăiat manual ...

Dacă trebuie să folosești protocolul TLS (amintesc că SSL este deja depășit), atunci telnet acest lucru nu va funcționa. Totuși, clientul openssl:

Exemplu de utilizare openssl cu afișarea răspunsului la cererea GET

[user@testhost ~]$ openssl s_client -connect example.com:443
CONNECTED(00000003)
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, CN = DigiCert SHA2 Secure Server CA
verify return:1
depth=0 C = US, ST = California, L = Los Angeles, O = Internet Corporation for Assigned Names and Numbers, OU = Technology, CN = www.example.org
verify return:1
---
Certificate chain
 0 s:/C=US/ST=California/L=Los Angeles/O=Internet Corporation for Assigned Names and Numbers/OU=Technology/CN=www.example.org
   i:/C=US/O=DigiCert Inc/CN=DigiCert SHA2 Secure Server CA
 1 s:/C=US/O=DigiCert Inc/CN=DigiCert SHA2 Secure Server CA
   i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA
 2 s:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA
   i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIHQDCCBiigAwIBAgIQD9B43Ujxor1NDyupa2A4/jANBgkqhkiG9w0BAQsFADBN
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMScwJQYDVQQDEx5E
aWdpQ2VydCBTSEEyIFNlY3VyZSBTZXJ2ZXIgQ0EwHhcNMTgxMTI4MDAwMDAwWhcN
MjAxMjAyMTIwMDAwWjCBpTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3Ju
aWExFDASBgNVBAcTC0xvcyBBbmdlbGVzMTwwOgYDVQQKEzNJbnRlcm5ldCBDb3Jw
b3JhdGlvbiBmb3IgQXNzaWduZWQgTmFtZXMgYW5kIE51bWJlcnMxEzARBgNVBAsT
ClRlY2hub2xvZ3kxGDAWBgNVBAMTD3d3dy5leGFtcGxlLm9yZzCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBANDwEnSgliByCGUZElpdStA6jGaPoCkrp9vV
rAzPpXGSFUIVsAeSdjF11yeOTVBqddF7U14nqu3rpGA68o5FGGtFM1yFEaogEv5g
rJ1MRY/d0w4+dw8JwoVlNMci+3QTuUKf9yH28JxEdG3J37Mfj2C3cREGkGNBnY80
eyRJRqzy8I0LSPTTkhr3okXuzOXXg38ugr1x3SgZWDNuEaE6oGpyYJIBWZ9jF3pJ
QnucP9vTBejMh374qvyd0QVQq3WxHrogy4nUbWw3gihMxT98wRD1oKVma1NTydvt
hcNtBfhkp8kO64/hxLHrLWgOFT/l4tz8IWQt7mkrBHjbd2XLVPkCAwEAAaOCA8Ew
ggO9MB8GA1UdIwQYMBaAFA+AYRyCMWHVLyjnjUY4tCzhxtniMB0GA1UdDgQWBBRm
mGIC4AmRp9njNvt2xrC/oW2nvjCBgQYDVR0RBHoweIIPd3d3LmV4YW1wbGUub3Jn
ggtleGFtcGxlLmNvbYILZXhhbXBsZS5lZHWCC2V4YW1wbGUubmV0ggtleGFtcGxl
Lm9yZ4IPd3d3LmV4YW1wbGUuY29tgg93d3cuZXhhbXBsZS5lZHWCD3d3dy5leGFt
cGxlLm5ldDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsG
AQUFBwMCMGsGA1UdHwRkMGIwL6AtoCuGKWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNv
bS9zc2NhLXNoYTItZzYuY3JsMC+gLaArhilodHRwOi8vY3JsNC5kaWdpY2VydC5j
b20vc3NjYS1zaGEyLWc2LmNybDBMBgNVHSAERTBDMDcGCWCGSAGG/WwBATAqMCgG
CCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMAgGBmeBDAEC
AjB8BggrBgEFBQcBAQRwMG4wJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj
ZXJ0LmNvbTBGBggrBgEFBQcwAoY6aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t
L0RpZ2lDZXJ0U0hBMlNlY3VyZVNlcnZlckNBLmNydDAMBgNVHRMBAf8EAjAAMIIB
fwYKKwYBBAHWeQIEAgSCAW8EggFrAWkAdwCkuQmQtBhYFIe7E6LMZ3AKPDWYBPkb
37jjd80OyA3cEAAAAWdcMZVGAAAEAwBIMEYCIQCEZIG3IR36Gkj1dq5L6EaGVycX
sHvpO7dKV0JsooTEbAIhALuTtf4wxGTkFkx8blhTV+7sf6pFT78ORo7+cP39jkJC
AHYAh3W/51l8+IxDmV+9827/Vo1HVjb/SrVgwbTq/16ggw8AAAFnXDGWFQAABAMA
RzBFAiBvqnfSHKeUwGMtLrOG3UGLQIoaL3+uZsGTX3MfSJNQEQIhANL5nUiGBR6g
l0QlCzzqzvorGXyB/yd7nttYttzo8EpOAHYAb1N2rDHwMRnYmQCkURX/dxUcEdkC
wQApBo2yCJo32RMAAAFnXDGWnAAABAMARzBFAiEA5Hn7Q4SOyqHkT+kDsHq7ku7z
RDuM7P4UDX2ft2Mpny0CIE13WtxJAUr0aASFYZ/XjSAMMfrB0/RxClvWVss9LHKM
MA0GCSqGSIb3DQEBCwUAA4IBAQBzcIXvQEGnakPVeJx7VUjmvGuZhrr7DQOLeP4R
8CmgDM1pFAvGBHiyzvCH1QGdxFl6cf7wbp7BoLCRLR/qPVXFMwUMzcE1GLBqaGZM
v1Yh2lvZSLmMNSGRXdx113pGLCInpm/TOhfrvr0TxRImc8BdozWJavsn1N2qdHQu
N+UBO6bQMLCD0KHEdSGFsuX6ZwAworxTg02/1qiDu7zW7RyzHvFYA4IAjpzvkPIa
X6KjBtpdvp/aXabmL95YgBjT8WJ7pqOfrqhpcmOBZa6Cg6O1l4qbIFH/Gj9hQB5I
0Gs4+eH6F9h3SojmPTYkT+8KuZ9w84Mn+M8qBXUQoYoKgIjN
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Los Angeles/O=Internet Corporation for Assigned Names and Numbers/OU=Technology/CN=www.example.org
issuer=/C=US/O=DigiCert Inc/CN=DigiCert SHA2 Secure Server CA
---
No client certificate CA names sent
Peer signing digest: SHA256
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 4643 bytes and written 415 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    Session-ID: 91950DC50FADB57BF026D2661E6CFAA1F522E5CA60D2310E106EE0E0FD6E70BD
    Session-ID-ctx:
    Master-Key: 704E9145253EEB4E9DC47E3DC6725D296D4A470EA296D54F71D65E74EAC09EB096EA1305CBEDD9E7020B8F72FD2B68A5
    Key-Arg  : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - 68 84 4e 77 be e3 f5 00-49 c5 44 40 53 4d b9 61   h.Nw....I.D@SM.a
    0010 - c9 fe df e4 05 51 d0 53-ae cf 89 4c b6 ef 6c 9e   .....Q.S...L..l.
    0020 - fe 12 9a f0 e8 e5 4e 87-42 89 ac af ca e5 4a 85   ......N.B.....J.
    0030 - 38 08 26 e3 22 89 08 b5-62 c0 8b 7e b8 05 d3 54   8.&amp;."...b..~...T
    0040 - 8c 24 91 a7 b4 4f 79 ad-36 59 7c 69 2d e5 7f 62   .$...Oy.6Y|i-..b
    0050 - f6 73 a3 8b 92 63 c1 e3-df 78 ba 8c 5a cc 82 50   .s...c...x..Z..P
    0060 - 33 4e 13 4b 10 e4 97 31-cc b4 13 65 45 60 3e 13   3N.K...1...eE`&gt;.
    0070 - ac 9e b1 bb 4b 18 d9 16-ea ce f0 9b 5b 0c 8b bf   ....K.......[...
    0080 - fd 78 74 a0 1a ef c2 15-2a 0a 14 8d d1 3f 52 7a   .xt.....*....?Rz
    0090 - 12 6b c7 81 15 c4 c4 af-7e df c2 20 a8 dd 4b 93   .k......~.. ..K.

    Start Time: 1574769867
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
GET / HTTP/1.1
Host: example.com

HTTP/1.1 200 OK
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Tue, 26 Nov 2019 12:04:38 GMT
Etag: "3147526947+ident"
Expires: Tue, 03 Dec 2019 12:04:38 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (dcb/7EC8)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1256

<!doctype html>
<html>
<head>
    <title>Domen Exemplu</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;

    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 2em;
        background-color: #fdfdff;
        border-radius: 0.5em;
        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        div {
            margin: 0 auto;
            width: auto;
        }
    }
    </style>
</head>

<body>
<div>
    <h1>Domen Exemplu</h1>
    <p>Acest domeniu este destinat utilizării în exemple ilustrative în documente. Puteți folosi acest domeniu în literatură fără coordonare prealabilă sau cererea permisiunii.</p>
    <p><a href="https://www.iana.org/domains/example">Mai multe informații...</a></p>
</div>
</body>
</html>

Rezolvarea problemelor tipice în Linux

Schimbarea proprietarului unui fișier

Proprietarul unui fișier sau director poate fi schimbat folosind comanda chown:

[user@testhost ~]$ chown user:user temp
[user@testhost ~]$ ls -l temp
-rw-rw-r-- 1 user user 31 Nov 26 11:09 temp

Parametrul acestei comenzi trebuie să conțină noul proprietar și grupul (opțional), separate prin două puncte. De asemenea, atunci când schimbi proprietarul unui director, poate fi utilă opțiunea -R — astfel, proprietarii se vor schimba și pentru tot conținutul directorului.

Schimbarea permisiunilor unui fișier

Această problemă se rezolvă folosind comanda chmod. Ca exemplu, voi da setarea permisiunilor 'proprietarului i se permite citirea, scrierea și executarea, grupului i se permite citirea și scrierea, iar tuturor celorlalți — nimic':

[user@testhost ~]$ ls -l temp
-rw-rw-r-- 1 user user 31 Nov 26 11:09 temp
[user@testhost ~]$ chmod 760 temp
[user@testhost ~]$ ls -l temp
-rwxrw---- 1 user user 31 Nov 26 11:09 temp

Primul 7 (acesta este 0b111 în reprezentare binară) în parametru desemnează 'toate drepturile pentru proprietar', al doilea 6 (acesta este 0b110 în reprezentare binară) — 'citire și scriere', iar 0 — nimic pentru ceilalți. Masca de biți constă din trei biți: bitul cel mai puțin semnificativ ('dreapta') răspunde pentru execuție, următorul ('mediu') — pentru scriere, iar cel mai semnificativ ('stânga') — pentru citire.
De asemenea, se pot seta permisiunile folosind simboluri speciale (sintaxă mnemotehnică). De exemplu, în următorul exemplu, mai întâi sunt eliminate permisiunile de executare pentru utilizatorul curent, apoi sunt restabilite:

[user@testhost ~]$ ls -l temp
-rwxrw---- 1 user user 31 Nov 26 11:09 temp
[user@testhost ~]$ chmod -x temp
[user@testhost ~]$ ls -l temp
-rw-rw---- 1 user user 31 Nov 26 11:09 temp
[user@testhost ~]$ chmod +x temp
[user@testhost ~]$ ls -l temp
-rwxrwx--x 1 user user 31 Nov 26 11:09 temp

Această comandă are multe variante de utilizare, așa că vă recomand să citiți mai multe despre ea (în special despre sintaxa mnemonică, de exemplu, aici).

Afișarea conținutului unui fișier binar

Acest lucru se poate face cu ajutorul utilitarului hexdump. Mai jos sunt prezentate exemple de utilizare a acestuia.

[user@testhost ~]$ cat temp
Conținutul unui fișier.
Lalalala...
[user@testhost ~]$ hexdump -c temp
0000000   C   o   n   t   e   n   t       o   f       a       f   i   l
0000010   e   .  n   L   a   l   a   l   a   l   a   .   .   .  n
000001f
[user@testhost ~]$ hexdump -x temp
0000000    6f43    746e    6e65    2074    666f    6120    6620    6c69
0000010    2e65    4c0a    6c61    6c61    6c61    2e61    2e2e    000a
000001f
[user@testhost ~]$ hexdump -C temp
00000000  43 6f 6e 74 65 6e 74 20  6f 66 20 61 20 66 69 6c  |Conținutul unui fi|
00000010  65 2e 0a 4c 61 6c 61 6c  61 6c 61 2e 2e 2e 0a     |e..Lalalala....|
0000001f

Cu ajutorul acestui utilitar se pot afișa date și în alte formate, totuși cele mai frecvent utilizate variante sunt acestea.

Căutarea fișierelor

Pentru a găsi un fișier după o parte a numelui în ierarhia de directoare, se poate folosi comanda find:

[user@testhost ~]$ find test_dir/ -name "*le*"
test_dir/file_1
test_dir/file_2
test_dir/subdir/file_3

De asemenea, există alte opțiuni și filtre de căutare. De exemplu, astfel se pot găsi fișiere în folderul test, create mai mult de 5 zile în urmă:

[user@testhost ~]$ ls -ltr test
total 0
-rw-rw-r-- 1 user user 0 Nov 26 10:46 temp_clone
-rw-rw-r-- 1 user user 0 Dec  4 10:39 created_today
[user@testhost ~]$ find test/ -type f -ctime +5
test/temp_clone

Căutarea textului în fișiere

Această sarcină poate fi realizată cu ajutorul comenzii grep. Are multe variante de utilizare, aici ca exemplu este menționată cea mai simplă.

[user@testhost ~]$ grep -nr "content" test_dir/
test_dir/file_1:1:test content for file_1
test_dir/file_2:1:test content for file_2
test_dir/subdir/file_3:1:test content for file_3

Una dintre cele mai populare modalități de utilizare a comenzii grep — utilizarea acesteia în pipeline (pipe):

[user@testhost ~]$ sudo tail -f /var/log/test.log | grep "ERROR"

Opțiune -v permite inversarea efectului grep‘a, fiindcă vor fi afișate doar liniile care nu conțin modelul transmis în grep.

Vizualizarea pachetelor instalate

Nu există o comandă universală, deoarece totul depinde de distribuția Linux și de managerul de pachete utilizat. Probabil vă va ajuta una dintre următoarele comenzi:

yum list installed
apt list --installed
zypper se —installed-only
pacman -Qqe
dpkg -l
rpm -qa

Vizualizează cât spațiu ocupă arborele directorului

Una dintre modalitățile de utilizare a comenzii du:

[user@testhost ~]$ du -h -d 1 test_dir/
8,0K test_dir/subdir
20K test_dir/

Se poate schimba valoarea parametrului -d, pentru a obține informații mai detaliate despre arborele directorului. De asemenea, se poate folosi comanda în combinație cu sort:

[user@testhost ~]$ du -h -d 1 test_dir/ | sort -h
8,0K test_dir/subdir
16K test_dir/subdir_2
36K test_dir/
[user@testhost ~]$ du -h -d 1 test_dir/ | sort -h -r
36K test_dir/
16K test_dir/subdir_2
8,0K test_dir/subdir

Opțiune -h comanda sort permite sortarea dimensiunilor, scrise într-un format ușor de citit (de exemplu, 1K, 2G), opțiunea -r permite sortarea datelor în ordine inversă.

„Găsește și înlocuiește” într-un fișier, în fișiere din director

Această operațiune se realizează cu ajutorul utilitarului sed (fără flag g la sfârșit va înlocui doar prima apariție a „old-text” în linie):

sed -i 's/old-text/new-text/g' input.txt

Se poate utiliza pentru mai multe fișiere simultan:

[user@testhost ~]$ cat test_dir/file_*
test content for file_1
test content for file_2
[user@testhost ~]$ sed -i 's/test/edited/g' test_dir/file_*
[user@testhost ~]$ cat test_dir/file_*
edited content for file_1
edited content for file_2

Afișează o coloană din rezultatul

Aceasta sarcină poate fi realizată cu ajutorul awk. În acest exemplu se afișează a doua coloană a rezultatului comenzii `ps ux`:

[user@testhost ~]$ ps ux | awk '{print $2}'
PID
11023
25870
25871
25908
25909

Trebuie avut în vedere că awk are o funcționalitate mult mai bogată, așa că, în cazul în care trebuie să lucrezi cu text în linia de comandă, ar fi bine să citești mai multe despre această comandă.

Află adresa IP după numele gazdei

Te va ajuta una dintre următoarele comenzi:

[user@testhost ~]$ host ya.ru
ya.ru has address 87.250.250.242
ya.ru has IPv6 address 2a02:6b8::2:242
ya.ru mail is handled by 10 mx.yandex.ru.

[user@testhost ~]$ dig +short ya.ru
87.250.250.242

[user@testhost ~]$ nslookup ya.ru
Server: 8.8.8.8
Address: 8.8.8.8#53

Non-authoritative answer:
Name: ya.ru
Address: 87.250.250.242

Informații de rețea

Se poate utiliza ifconfig:

[user@testhost ~]$ ifconfig
eth0: flags=4163 mtu 1500
        inet 47.89.93.67 netmask 255.255.224.0 broadcast 47.89.95.255
        inet6 fd90::302:57ff:fe79:1 prefixlen 64  scopeid 0x20
        ether 04:01:57:79:00:01 txqueuelen 1000  (Ethernet)
        RX packets 11912135 bytes 9307046034 (8.6 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 14696632 bytes 2809191835 (2.6 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


lo: flags=73 mtu 65536
        inet 127.0.0.1 netmask 255.0.0.0
        inet6 ::1 prefixlen 128 scopeid 0x10
        loop  txqueuelen 0  (Local Loopback)
        RX packets 10 bytes 866 (866.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 10 bytes 866 (866.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Și se poate folosi ip:

[user@testhost ~]$ ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 04:01:57:79:00:01 brd ff:ff:ff:ff:ff:ff
    inet 47.89.93.67/19 brd 47.89.95.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fd90::302:57ff:fe79:1/64 scope link
       valid_lft forever preferred_lft forever
3: ip_vti0:  mtu 1500 qdisc noop state DOWN group default
    link/ipip 0.0.0.0 brd 0.0.0.0

Dacă, de exemplu, te interesează doar IPv4, poți adăuga opțiunea -4:

[user@testhost ~]$ ip -4 a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 47.89.93.67/19 brd 47.89.95.255 scope global eth0
       valid_lft forever preferred_lft forever

Vezi porturile deschise

Pentru asta se folosește utilitarul netstat. De exemplu, pentru a vedea toate porturile TCP și UDP care ascultă, cu afișarea PID-ului procesului care ascultă portul și cu reprezentarea numerică a portului, trebuie să-l folosești cu următoarele opțiuni:

[user@testhost ~]$ netstat -lptnu

Informații despre sistem

Poți obține aceste informații folosind comanda uname.

[user@testhost ~]$ uname -a
Linux alexander 3.10.0-123.8.1.el7.x86_64 #1 SMP Mon Sep 22 19:06:58 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

Pentru a înțelege în ce format se face ieșirea, poți consulta helpaceastă comandă:

[user@testhost ~]$ uname --help
Utilizare: uname [KEY]…
Afișează anumite informații despre sistem. Dacă KEY nu este specificat,
se consideră -s.

  -a, --all          afișează toate informațiile, în următoarea ordine,
                     cu exceptia -p și -i, dacă nu sunt cunoscute:
  -s, --kernel-name  afișează numele nucleului
  -n, --nodename     afișează numele mașinii în rețea
  -r, --release      afișează versiunea sistemului de operare
  -v, --kernel-version afișează versiunea nucleului
  -m, --machine      afișează tipul de echipament al mașinii
  -p, --processor    afișează tipul de procesor sau „necunoscut”
  -i, --hardware-platform afișează tipul de platformă hardware sau „necunoscut”
  -o, --operating-system afișează numele sistemului de operare
      --help         afișează această asistență și iese
      --version      afișează informații despre versiune și iese

Informații despre memorie

Pentru a înțelege câtă memorie RAM este utilizată sau liberă, poți folosi comanda free.

[user@testhost ~]$ free -h
              total        used        free      shared  buff/cache   available
Mem:           3,9G        555M        143M         56M        3,2G        3,0G
Swap:            0B          0B          0B

Informații despre sistemele de fișiere (spațiu liber pe discuri)

Comanda df permete să vezi cât spațiu este liber și ocupat pe sistemele de fișiere montate.

[user@testhost ~]$ df -hT
Sistem de fișiere Tip      Dimensiune Folosit  Liber Folosit% Montat în
/dev/vda1        ext4        79G          21G   55G           27% \/
devtmpfs         devtmpfs   2,0G            0  2,0G            0% \/dev
tmpfs            tmpfs      2,0G            0  2,0G            0% \/dev\/shm
tmpfs            tmpfs      2,0G          57M  1,9G            3% \/run
tmpfs            tmpfs      2,0G            0  2,0G            0% \/sys\/fs\/cgroup
tmpfs            tmpfs      396M            0  396M            0% \/run\/user\/1001

Opțiune -T indică că trebuie să afișeze tipul sistemului de fișiere.

Informații despre sarcini și diverse statistici ale sistemului

Pentru aceasta se folosește comanda top. Aceasta poate afișa diverse informații: de exemplu, procesele de top după utilizarea memoriei RAM sau procesele de top după utilizarea timpului CPU. De asemenea, aceasta afișează informații despre memorie, CPU, uptime și LA (load average).

[user@testhost ~]$ top | head -10
top - 17:19:13 up 154 de zile,  6:59,  3 utilizatori,  load average: 0.21, 0.21, 0.27
Sarcini: 2169 total,   2 în execuție, 2080 în repaus,   0 oprite,   0 zombie
Cpu(s):  1.7%us,  0.7%sy,  0.0%ni, 97.5%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:  125889960k total, 82423048k folosit, 43466912k liber, 16026020k cache
Swap:        0k total,        0k folosit,        0k liber, 31094516k cache

    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMANDĂ
  25282 user      20   0 16988 3936 1964 R  7.3  0.0   0:00.04 top
   4264 telegraf  20   0 2740m 240m  22m S  1.8  0.2  23409:39 telegraf
   6718 root      20   0 35404 4768 3024 S  1.8  0.0   0:01.49 redis-server

Această utilitară dispune de un funcțional bogat, așa că dacă trebuie să o folosiți frecvent, este mai bine să consultați documentația sa.

Dump de trafic de rețea

Pentru interceptarea traficului de rețea în Linux se folosește utilitarul tcpdump. Pentru a captura traficul pe portul 12345, poți folosi următoarea comandă:

[user@testhost ~]$ sudo tcpdump -i any -A port 12345

Opțiune -A indică că vom vedea ieșirea în ASCII (de aceea este bine pentru protocoale textuale), -i any indică că nu ne interesează interfața de rețea, port — traficul de pe ce port să fie capturat. În loc de port se poate folosi host, sau combinația host și port (host A și port X). Și o opțiune utilă poate fi -n — nu converti adresele în nume de gazdă în ieșire.
Ce se întâmplă dacă traficul este binar? Atunci ne va ajuta opțiunea -X — pentru a afișa datele în hex și ASCII:

[user@testhost ~]$ sudo tcpdump -i any -X port 12345

Este lucru trebuie luat în considerare, că în ambele variante de utilizare vor fi afișate pachete IP, așa că la începutul fiecărei variante vor fi antete binare IP și TCP. Iată un exemplu de ieșire pentru cererea „123” trimisă către un server care ascultă pe portul 12345:

[user@testhost ~]$ sudo tcpdump -i any -X port 12345
tcpdump: output detaliat reprimat, folosiți -v sau -vv pentru decodare completă a protocolului
ascultând pe any, tip-link LINUX_SLL (Linux preparat), dimensiunea capturii 262144 bytes
14:27:13.224762 IP localhost.49794 > localhost.italk: Flags [P.], seq 2262177478:2262177483, ack 3317210845, win 342, options [nop,nop,TS val 3196604972 ecr 3196590131], length 5
    0x0000:  4510 0039 dfb6 4000 4006 5cf6 7f00 0001  E..9..@.@......
    0x0010:  7f00 0001 c282 3039 86d6 16c6 c5b8 9edd  ......09........
    0x0020:  8018 0156 fe2d 0000 0101 080a be88 522c  ...V.-........R,
    0x0030:  be88 1833 3132 330d 0a00 0000 0000 0000  ...3123.........
    0x0040:  0000 0000 0000 0000 00                     .........

În loc de concluzie

Desigur, în Linux există multe alte lucruri interesante de citit pe Habr, StackOverflow și alte site-uri (de exemplu, amintesc despre Arta liniei de comandă, care există și în traducere). Administratorii de sistem și DevOps utilizează multe comenzi și utilitare pentru configurarea serverelor, dar chiar și testerilor le-ar putea lipsi comandele listate. Ar putea fi necesar să verificați corectitudinea unui timp de așteptare complicat de client către server sau funcționarea serverului în absența spațiului liber pe disc. Nu mai vorbesc despre, de exemplu, Docker, care este acum folosit activ de multe companii. Ar fi interesant în continuarea acestui articol de referință să analizăm câteva exemple de utilizare a diverselor utilitare de consolă Linux în timpul testării serviciilor? De asemenea, împărtășiți-vă topul comenzilor în comentarii 🙂

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster