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. .
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.&."...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`>.
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, ).
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 , care există și ). 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
