Forord
Hej alle sammen! Mit navn er Sasha, og jeg har arbejdet med backend-testning (Linux-tjenester og API'er) i over seks år. Ideen til denne artikel opstod, efter at en bekendt tester spurgte mig, hvad han kunne læse om Linux-kommandoer inden en jobsamtale. Normalt kræves det af kandidater til QA-ingeniørrollen, at de kender de grundlæggende kommandoer (hvis jobbet involverer Linux), men hvordan kan man finde ud af, hvilke kommandoer man skal læse op på under forberedelsen, hvis man har begrænset erfaring med Linux eller slet ingen?
Derfor, selvom det allerede er blevet skrevet meget om dette emne, har jeg alligevel besluttet at skrive endnu en artikel "Linux for begyndere" og nævne her de grundlæggende kommandoer, som man skal kende før enhver samtale i en afdeling (eller virksomhed), der bruger Linux. Jeg har tænkt over, hvilke kommandoer og værktøjer og med hvilke parametre jeg oftest bruger, samlet feedback fra kolleger og samlet det hele i en artikel. Artiklen er delt op i tre dele: først en kort information om grundlæggende ind- og uddata i Linux-terminalen, derefter en oversigt over de mest basale kommandoer, og i den tredje del beskrives løsningen på typiske opgaver i Linux.
Hver kommando har mange muligheder, her vil de ikke blive opremset alle. Man kan altid skrive `man` eller `--help` for at få mere information om kommandoen.
Eksempel:
[user@testhost ~]$ mkdir --help Brug: mkdir [OPTION]... DIRECTORY... Opret DIRECTORY(ier), hvis de ikke allerede findes. Obligatoriske argumenter til lange muligheder er også obligatoriske for korte muligheder. -m, --mode=MODE sæt filmode (som i chmod), ikke a=rwx - umask -p, --parents ingen fejl hvis eksisterende, lav overordnede mapper efter behov -v, --verbose udskriv en meddelelse for hver oprettet mappe -Z sæt SELinux sikkerhedskontekst for hver oprettet mappe til standardtypen --context[=CTX] ligesom -Z, eller hvis CTX er angivet, så sæt SELinux eller SMACK sikkerhedskontekst til CTX --help vis denne hjælp og afslut --version udskriv versionsinformation og afslut GNU coreutils online hjælp: For komplet dokumentation, kør: info coreutils 'mkdir invocation'
Hvis en kommando tager for lang tid at udføre, kan den afsluttes ved at trykke på Ctrl+C (et signal sendes til processen SIGINT).
Lidt om output fra kommandoer
Når en proces startes i Linux, oprettes der 3 standard data streams for denne proces: stdin, stdout og stderr. De har nummer 0, 1 og 2 respektivt. Men i øjeblikket er vi interesserede i stdout og i mindre grad, stderr. Ud fra navnene er det ikke svært at gætte, at stdout bruges til at udskrive data, og stderr — til at vise fejlmeddelelser. Som standard ved kørsel af en kommando i Linux stdout og stderr vises al information på konsollen, men hvis outputtet fra kommandoen er stort, kan det være praktisk at omdirigere det til en fil. Dette kan gøres f.eks. sådan:
[user@testhost ~]$ man signal > man_signal
Hvis vi viser indholdet af filen man_signal, ser vi, at det er identisk med det, der ville være, hvis vi blot kørte kommandoen `man signal`.
Omdirigeringsoperationen `>` bruger som standard stdout. Vi kan angive omdirigeringen stdout eksplicit: `1>`. Ligesom kan vi angive omdirigeringen stderr: `2>`. Disse operationer kan kombineres, så vi kan opdele normal output fra kommandoen og output af fejlmeldinger:
[user@testhost ~]$ man signal 1> man_signal 2> man_signal_error_log
Omdirigere og stdout, og stderr til en fil kan gøres som følger:
[user@testhost ~]$ man signal > man_signal 2>&1
Omdirigeringsoperationen `2>&1` betyder omdirigering stderr til samme sted som stdout.
En anden nyttig værktøj til arbejde med input-output (mere specifikt, det er et praktisk middel til mellemprocesinteraktion) — pipe (eller pipeline). Pipelines bruges ofte til at forbinde flere kommandoer: stdout output fra en kommando sendes til stdin den næste, og så videre i kæden:
[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
Grundlæggende Linux-kommandoer
pwd
Vis den aktuelle (arbejdende) mappe.
[user@testhost ~]$ pwd
/home/user
date
Vis den aktuelle dato og tidspunkt for systemet.
[user@testhost ~]$ date
Mon Dec 16 13:37:07 UTC 2019
[user@testhost ~]$ date +%s
1576503430
w
Denne kommando viser, hvem der er logget ind i systemet. Derudover vises også uptime og LA (load average) på skærmen.
[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
Vis indholdet af mappen. Hvis der ikke angives en sti, vises indholdet af den aktuelle mappe.
[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
Personligt bruger jeg ofte indstillingerne -l (long listing format — output i kolonner med ekstra information om filer), -t (sortering efter ændringstidspunkt for filen/mappen) og -r (omvendt sortering - i kombination med -t de mest "friske" filer vil være nederst):
[user@testhost ~]$ ls -ltr /\ntotal 4194416\ndrwxr-xr-x 2 root root 4096 Jan 6 2012 srv\ndrwxr-xr-x 2 root root 4096 Jan 6 2012 selinux\ndrwxr-xr-x 2 root root 4096 Jan 6 2012 mnt\ndrwxr-xr-x 2 root root 4096 Jan 6 2012 media\ndrwx------ 2 root root 16384 Oct 1 2017 lost+found\ndrwxr-xr-x 2 root root 4096 Oct 1 2017 local\ndrwxr-xr-x 13 root root 4096 Oct 1 2017 usr\ndrwxr-xr-x 11 root root 4096 Apr 10 2018 cgroup\ndrwxr-xr-x 4 root root 4096 Apr 10 2018 run\-rw------- 1 root root 4294967296 Sep 10 2018 swap\ndr-xr-xr-x 10 root root 4096 Dec 13 2018 lib\ndrwxr-xr-x 6 root root 4096 Mar 7 2019 opt\ndrwxr-xr-x 20 root root 4096 Mar 19 2019 var\ndr-xr-xr-x 10 root root 12288 Apr 9 2019 lib64\ndr-xr-xr-x 2 root root 4096 Apr 9 2019 bin\ndr-xr-xr-x 4 root root 4096 Apr 9 2019 boot\ndr-xr-xr-x 2 root root 12288 Apr 9 2019 sbin\ndr-xr-xr-x 3229 root root 0 Jul 2 10:19 proc\ndrwxr-xr-x 34 root root 4096 Oct 28 13:27 home\ndrwxr-xr-x 93 root root 4096 Oct 30 16:00 etc\ndr-xr-x--- 11 root root 4096 Nov 1 13:02 root\ndr-xr-xr-x 13 root root 0 Nov 13 20:28 sys\ndrwxr-xr-x 16 root root 2740 Nov 26 08:55 dev\ndrwxrwxrwt 3 root root 4096 Nov 26 08:57 tmp
Der er 2 specielle navne for mapper: "." og "..". Den første betyder den nuværende mappe, den anden - den overordnede mappe. De kan være nyttige at bruge i forskellige kommandoer, især ls:
[user@testhost home]$ pwd\n/home\n[user@testhost home]$ ls ..\nbin boot cgroup dev etc home lib lib64 local lost+found media mnt opt proc root run sbin selinux srv swap sys tmp usr var\n[user@testhost home]$ ls ..\/home\/user\/\nqqq
Der er også en nyttig mulighed for at vise skjulte filer (der starter med ".«) — -a:
[user@testhost ~]$ ls -a\n. .. 1 .bash_history .bash_logout .bash_profile .bashrc .lesshst man_signal man_signal_error_log .mongorc.js .ssh temp test .viminfo
Og man kan også bruge muligheden -h – output i menneske-læsbart format (bemærk filstørrelser):
[user@testhost ~]$ ls -ltrh\ntotal 16K\n-rwxrwx--x 1 user user 31 Nov 26 11:09 temp\n-rw-rw-r-- 1 user user 6.0K Dec 3 16:02 1\ndrwxrwxr-x 2 user user 4.0K Dec 4 10:39 test
cd
Skift nuværende mappe.
[user@testhost ~]$ pwd\n/home/user\n[user@testhost ~]$ cd \/home\/\n[user@testhost home]$ pwd\n/home
Hvis der ikke gives et mappenavn som argument, vil miljøvariablen $HOME, altså din hjemme-mappe, blive brugt. Det kan også være praktisk at bruge `~` - et specielt symbol, der betyder $HOME:
[user@testhost etc]$ pwd\n/etc\n[user@testhost etc]$ cd ~\/test\/\n[user@testhost test]$ pwd\n/home/user/test
mkdir
Opret en mappe.
[user@testhost ~]$ mkdir test\n[user@testhost ~]$ ls -ltr\ntotal 38184\n-rw-rw-r-- 1 user user 39091284 Nov 22 14:14 qqq\ndrwxrwxr-x 2 user user 4096 Nov 26 10:29 test
Nogle gange er det nødvendigt at oprette en bestemt struktur af mapper: for eksempel en mappe inden i en mappe, der ikke findes. For ikke at skulle skrive flere gange efter hinanden mkdir, kan du bruge optionen -p — den gør det muligt at oprette alle manglende mapper i hierarkiet. Med denne option mkdir returnerer den ikke fejl, hvis mappen allerede findes.
[user@testhost ~]$ ls
qqq test
[user@testhost ~]$ mkdir test2/subtest
mkdir: kan ikke oprette mappe ‘test2/subtest’: Ingen sådan fil eller mappe
[user@testhost ~]$ mkdir -p test2/subtest
[user@testhost ~]$ ls
qqq test test2
[user@testhost ~]$ ls test2/
subtest
[user@testhost ~]$ mkdir test2/subtest
mkdir: kan ikke oprette mappe ‘test2/subtest’: Filen eksisterer
[user@testhost ~]$ mkdir -p test2/subtest
[user@testhost ~]$ ls test2/
subtest
rm
Slet fil.
[user@testhost ~]$ ls
qqq test test2
[user@testhost ~]$ rm qqq
[user@testhost ~]$ ls
test test2
Mulighed -r giver mulighed for rekursivt at slette mapper med alt deres indhold, optionen -f giver mulighed for at ignorere fejl ved sletning (f.eks. om en fil ikke findes). Disse muligheder gør det, groft sagt, muligt at garantere at slette hele hierarkiet af filer og mapper (hvis brugeren har de nødvendige rettigheder), så de skal bruges med forsigtighed (et klassisk eksempel – vittighed — “rm -rf /«, som under visse omstændigheder vil slette, hvis ikke hele systemet, så i hvert fald mange vigtige filer til dens funktionalitet).
[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
Kopier en fil eller mappe.
[user@testhost ~]$ ls
temp test
[user@testhost ~]$ cp temp temp_clone
[user@testhost ~]$ ls
temp temp_clone test
Denne kommando har også muligheder, -r og -f, som kan bruges til at garantere at kopiere hele hierarkiet af mapper og filer til et andet sted.
mv
Flytte eller omdøbe en fil eller mappe.
[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
Vis indholdet af en fil (eller filer).
[user@testhost ~]$ cat temp
Indhold af en fil.
Lalalala...
Det er også værd at lægge mærke til kommandoerne head (vis første linjer eller bytes af filen) og n (om denne — senere). tail vis de sidste linjer eller bytes af filen.
tail
Udskriv n [user@testhost ~]$ tail -1 temp Lalalala...
En meget nyttig mulighed er
— den giver mulighed for at vise nye data i filen i realtid. -f Nogle gange er en tekstfil for stor, og det er ubehageligt at vise den med kommandoen
less
. Så kan man åbne den med kommandoen cat: filen vil blive vist i bidder, der er tilgængelig navigation mellem disse bidder, søgning og anden enkel funktionalitet. less[user@testhost ~]$ less temp
[user@testhost ~]$ less temp
Det kan også være en praktisk løsning at bruge less et pipeline (pipe):
[user@testhost ~]$ grep "ERROR" /tmp/some.log | less
ps
Vis listen over processer.
[user@testhost ~]$ ps
PID TTY TIME CMD
761020 pts/2 00:00:00 bash
809720 pts/2 00:00:00 ps
Jeg plejer normalt at bruge BSD-optionen «aux» — for at vise alle processer i systemet (da der kan være mange processer, har jeg kun vist de første 5 af dem ved at bruge et pipeline (pipe) og kommandoen 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]
Mange bruger også BSD-optionen «axjf«, som viser processernes træstruktur (her har jeg fjernet en del af outputtet for at vise det):
[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: masterprocess (/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
...
...
...
Denne kommando har mange forskellige muligheder, så jeg anbefaler at sætte sig ind i dokumentationen, hvis du bruger den aktivt. For de fleste situationer er det dog tilstrækkeligt blot at kende «ps aux«.
kill
Send et signal til processen. Som standard sendes signalet SIGTERM, der afslutter processen.
[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
Da en proces kan have signalbehandlere, kill fører det ikke altid til det forventede resultat — en øjeblikkelig afslutning af processen. For at «dræbe» processen sikkert skal du sende et signal til processen SIGKILL. Men dette kan føre til datatab (for eksempel hvis processen skal gemme oplysninger på disken, inden den afsluttes), så vær forsigtig med at bruge denne kommando. Signalet nummer SIGKILL er 9, så den korte version af kommandoen ser således ud:
[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
Udover de nævnte SIGTERM og SIGKILL findes der mange forskellige signaler, og deres liste kan nemt findes på internettet. Og glem ikke, at signalerne SIGKILL og SIGSTOP kan ikke fanges eller ignoreres.
ping
Send en ICMP pakke til værten 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
By default ping det fungerer, indtil det afsluttes manuelt. Derfor kan muligheden være nyttig -c — antallet af pakker, efter hvilket ping det afsluttes automatisk. En anden mulighed, som jeg nogle gange bruger — -i, intervallet mellem pakkeforsendelser.
[user@testhost ~]$ ping -c 3 -i 5 google.com
PING google.com (172.217.5.238) 56(84) bytes of data.
64 bytes fra iad30s07-in-f238.1e100.net (172.217.5.238): icmp_seq=1 ttl=47 tid=1.55 ms
64 bytes fra iad30s07-in-f14.1e100.net (172.217.5.238): icmp_seq=2 ttl=47 tid=1.17 ms
64 bytes fra iad30s07-in-f14.1e100.net (172.217.5.238): icmp_seq=3 ttl=47 tid=1.16 ms
--- google.com ping statistik ---
3 pakker sendt, 3 modtaget, 0% pakke tab, tid 10006ms
rtt min/avg/max/mdev = 1.162/1.295/1.551/0.181 ms
ssh
OpenSSH SSH-klient, der giver mulighed for at oprette forbindelse til en fjernhost.
MacBook-Pro-User:~ user$ ssh user@11.11.22.22
Sidste login: Tue Nov 26 11:27:39 2019 fra another_host
[user@testhost ~]$ hostname
testhost
Der er mange nuancer i brugen af SSH, og denne klient har mange funktioner, så hvis du ønsker (eller har brug for det), kan du læse om det .
scp
Kopiere filer mellem værter (til dette bruges ssh).
[user@testhost ~]$ pwd
/home/user
[user@testhost ~]$ ls
temp test_renamed
[user@testhost ~]$ exit
logout
Forbindelse til 11.11.22.22 lukket.
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
Indhold af en fil.
Lalalala...
rsync
For at synkronisere mapper mellem værter kan du også bruge rsync (-a — arkiveringsmode, som giver mulighed for at kopiere hele indholdet af mappen "som det er", -v — udskriver yderligere oplysninger til konsollen):
MacBook-Pro-User:~ user$ ls Downloads/user
ls: Downloads/user: Ingen sådan fil eller mappe
MacBook-Pro-User:~ user$ rsync -av user@testhost:/home/user Downloads
modtager fil liste ... færdig
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
sendt 346 bytes modtaget 29210 bytes 11822.40 bytes/sek
total størrelse er 28079 hastighedsforhold er 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
Udskriv en tekstlinje på skærmen.
[user@testhost ~]$ echo "Hello"
Hello
Her fortjener følgende muligheder at blive nævnt -n — ikke at tilføje en ny linje i slutningen, og -e — aktivere fortolkning af escape-tegn med "".
[user@testhost ~]$ echo "tHellon"
tHellon
[user@testhost ~]$ echo -n "tHellon"
tHellon[user@testhost ~]$
[user@testhost ~]$ echo -ne "tHellon"
Hello
Med denne kommando kan man også udskrive værdierne af variabler. For eksempel opbevares exit-koden for den sidst udførte kommando i en speciel variabel i Linux. $?, og på den måde kan man finde ud af, hvilken specifik fejl der opstod i den sidst kørte applikation:
[user@testhost ~]$ ls # der vil ikke være fejl
1 man_signal man_signal_error_log temp test
[user@testhost ~]$ echo $? # vi får 0 — der var ingen fejl
0
[user@testhost ~]$ ls qwerty # der vil være en fejl
ls: cannot access qwerty: No such file or directory
[user@testhost ~]$ echo $? # vi får 2 — Misuse of shell builtins (ifølge Bash-dokumentationen)
2
[user@testhost ~]$ echo $? # den sidste echo kørte uden fejl, vi får 0
0
telnet
Klienten til TELNET-protokollen. Den bruges til kommunikation med en anden vært.
[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
... her var kroppens svar, som jeg har klippet ud med hånden ...
Hvis det er nødvendigt at bruge TLS-protokollen (jeg vil minde om, at SSL er forældet for længst), så telnet vil dette ikke være egnet. Men klienten openssl:
Eksempel på brug af openssl med udskrift af svaret på GET-anmodningen
[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>Eksempel domæne</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>Eksempel domæne</h1>
<p>Dette domæne er til brug i illustrative eksempler i dokumenter. Du må bruge dette domæne i litteraturen uden forudgående koordinering eller anmodning om tilladelse.</p>
<p><a href="https://www.iana.org/domains/example">Mere information...</a></p>
</div>
</body>
</html>
Løsning af typiske opgaver i Linux
Ændre ejer af en fil
Ejer af en fil eller katalog kan ændres ved hjælp af kommandoen chown:
[user@testhost ~]$ chown user:user temp
[user@testhost ~]$ ls -l temp
-rw-rw-r-- 1 user user 31 Nov 26 11:09 temp
I parameteren for denne kommando skal den nye ejer og gruppe (valgfrit) angives, adskilt af et kolon. Derudover kan det være nyttigt at bruge indstillingen -R — så vil ejerskaberne også ændres for alt indholdet i kataloget.
Ændre adgangsrettigheder for en fil
Denne opgave løses ved hjælp af kommandoen chmod. Som eksempel vil jeg give installation af rettighederne 'ejeren har tilladelse til læsning, skrivning og udførelse, gruppen har tilladelse til læsning og skrivning, øvrige — ingen rettigheder':
[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
Den første 7 (det er 0b111 i binær repræsentation) i parameteret betyder "alle rettigheder for ejeren", den anden 6 (det er 0b110 i binær repræsentation) — "læsning og skrivning", og 0 — det betyder ingen rettigheder for andre. Bitmasken består af tre bits: den mindst betydende ("højre") bit bestemmer udførelsen, den næste bit ("mellem") bestemmer skrivning, og den mest betydende ("venstre") bit bestemmer læsning.
Man kan også angive rettigheder med specielle tegn (mnemonisk syntaks). For eksempel i det følgende eksempel fjernes udførelsesrettigheder for den aktuelle bruger, hvorefter de gives tilbage:
[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
Denne kommando har mange anvendelsesmuligheder, så jeg anbefaler at læse mere om den (især om den mnemoniske syntaks, for eksempel, ).
Vis indholdet af en binær fil
Det kan gøres med værktøjet hexdump. Nedenfor er der eksempler på dens anvendelse.
[user@testhost ~]$ cat temp
Content of a file.
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 |Content of a fil|
00000010 65 2e 0a 4c 61 6c 61 6c 61 6c 61 2e 2e 2e 0a |e..Lalalala....|
0000001f
Med dette værktøj kan man også udskrive data i andre formater, men ofte vil de nævnte anvendelser være de mest nyttige.
Søg efter filer
For at finde en fil baseret på en del af navnet i mappestrukturen kan man bruge kommandoen find:
[user@testhost ~]$ find test_dir/ -name "*le*"
test_dir/file_1
test_dir/file_2
test_dir/subdir/file_3
Der er også andre søgeindstillinger og filtre tilgængelige. For eksempel kan man finde filer i en mappe test, der er oprettet for mere end 5 dage siden:
[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
Søg efter tekst i filer
At klare denne opgave vil hjælpe kommandoen grep. Den har mange anvendelsesmuligheder, her angives det enkleste eksempel.
[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
En af de populære anvendelser af kommandoen grep — brugen i en pipeline (pipe):
[user@testhost ~]$ sudo tail -f /var/log/test.log | grep "ERROR"
Mulighed -v giver en effekt grep‘omvendt — vil kun vise linjer, der ikke indeholder mønsteret givet i grep.
Se installerede pakker
Der findes ingen universel kommando, da det hele afhænger af Linux-distributionen og den anvendte pakkehåndtering. Sandsynligvis kan en af følgende kommandoer hjælpe dig:
yum list installed
apt list --installed
zypper se —installed-only
pacman -Qqe
dpkg -l
rpm -qa
Se hvor meget plads en katalogstruktur optager
En af mulighederne for at bruge kommandoen du:
[user@testhost ~]$ du -h -d 1 test_dir/
8,0K test_dir/subdir
20K test_dir/
Man kan ændre parameterens værdi -d, for at få mere detaljeret information om katalogstrukturen. Man kan også bruge kommandoen i kombination med 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
Mulighed -h af kommandoen sort giver mulighed for at sortere størrelserne, der er angivet i læsevenlig form (f.eks. 1K, 2G), og optionen -r muliggør sortering af data i omvendt rækkefølge.
«Søg og erstat» i en fil, i flere filer i et katalog
Denne operation udføres med værktøjet sed (uden flaget g vil kun erstatte den første forekomst af «old-text» i linjen):
sed -i 's/old-text/new-text/g' input.txt
Man kan bruge det til flere filer på én gang:
[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
Udskriv en kolonne fra outputtet
At klare denne opgave vil hjælpe med awk. I dette eksempel udskrives den anden kolonne fra outputtet af kommandoen `ps ux`:
[user@testhost ~]$ ps ux | awk '{print $2}'
PID
11023
25870
25871
25908
25909
Det skal bemærkes, at awk besidder en meget rigere funktionalitet, så hvis man har brug for at arbejde med tekst i kommandolinjen, bør man læse mere om denne kommando.
Find IP-adressen ud fra værtsnavn
En af de følgende kommandoer kan hjælpe dig:
[user@testhost ~]$ host ya.ru
ya.ru har adresse 87.250.250.242
ya.ru har IPv6-adresse 2a02:6b8::2:242
ya.ru mail håndteres af 10 mx.yandex.ru.
[user@testhost ~]$ dig +short ya.ru
87.250.250.242
[user@testhost ~]$ nslookup ya.ru
Server: 8.8.8.8
Adresse: 8.8.8.8#53
Ikke-autoritative svar:
Navn: ya.ru
Adresse: 87.250.250.242
Netværksoplysninger
Kan bruges 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
Man kan også 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
Hvis du kun er interesseret i IPv4, kan du tilføje en option -4:
[user@testhost ~]$ ip -4 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
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
Se åbne porte
Dette gøres med værktøjet netstat. For eksempel, for at se alle TCP- og UDP-porte, der lytter, sammen med PID'en for den proces, der lytter på porten, og med numerisk repræsentation af porten, skal du bruge det med følgende optioner:
[user@testhost ~]$ netstat -lptnu
Systeminformation
Du kan få denne information ved hjælp af kommandoen 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
For at forstå i hvilken format output genereres, kan du referere til helpdenne kommando:
[user@testhost ~]$ uname --help
Brug: uname [NØGLE]…
Udskriver visse oplysninger om systemet. Hvis NØGLE ikke er angivet,
antages -s.
-a, --all udskriver alle oplysninger i følgende rækkefølge,
undtagen -p og -i, hvis de er ukendte:
-s, --kernel-name udskriver navnet på kernen
-n, --nodename udskriver maskinens navn i netværket
-r, --release udskriver versionsnummeret på operativsystemet
-v, --kernel-version udskriver versionen af kernen
-m, --machine udskriver maskinens hardwaretype
-p, --processor udskriver type af processor eller «ukendt»
-i, --hardware-platform udskriver typen af hardwareplatform eller «ukendt»
-o, --operating-system udskriver navnet på operativsystemet
--help viser denne hjælp og afslutter
--version viser versionoplysninger og afslutter
Oplysninger om hukommelse
For at forstå, hvor meget RAM der er optaget eller ledigt, kan man bruge kommandoen 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
Oplysninger om filsystemer (ledig plads på diskene)
Kommandoen df giver mulighed for at se, hvor meget plads der er ledig og optaget på de monterede filsystemer.
[user@testhost ~]$ df -hT
Filsystem Type Størrelse Bruges Ledig Brugt% Monteret på
/dev/vda1 ext4 79G 21G 55G 27%
/devtmpfs devtmpfs 2,0G 0 2,0G 0%
/tmpfs tmpfs 2,0G 0 2,0G 0%
/tmpfs tmpfs 2,0G 57M 1,9G 3%
/tmpfs tmpfs 2,0G 0 2,0G 0%
/tmpfs tmpfs 396M 0 396M 0%
Mulighed -T angiver, at filsystemtypen skal vises.
Oplysninger om opgaver og forskellige systemstatistikker
Dette gøres ved hjælp af kommandoen top. Den kan udskrive forskellige oplysninger: for eksempel top processer baseret på brug af RAM eller top processer baseret på brug af CPU-tid. Den udskriver også oplysninger om hukommelse, CPU, oppetid og LA (load average).
[user@testhost ~]$ top | head -10
top - 17:19:13 oppe i 154 dage, 6:59, 3 brugere, load average: 0.21, 0.21, 0.27
Tasks: 2169 total, 2 kørende, 2080 sovende, 0 stoppet, 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 anvendt, 43466912k fri, 16026020k buffere
Swap: 0k total, 0k anvendt, 0k fri, 31094516k cached
PID BRUGER PR NI VIRT RES SHR S %CPU %MEM TIME+ KOMMAND
25282 bruger 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
Dette værktøj har en række funktioner, så hvis du har brug for at bruge det ofte, er det bedst at sætte dig ind i dets dokumentation.
Dump af netværkstrafik
Til at opsnappe netværkstrafik på Linux bruges værktøjet tcpdump. For at dumpe trafik på port 12345 kan følgende kommando bruges:
[user@testhost ~]$ sudo tcpdump -i any -A port 12345
Mulighed -A indikerer, at vi ønsker at se output i ASCII (så dette er godt for tekstprotokoller), -i any angiver, at vi ikke er interesseret i netværksinterface, port — hvilken ports trafik der skal dumps. I stedet for port kan man bruge host, eller en kombination host og port (host A and port X). Og en nyttig mulighed kan være -n — ikke at konvertere adresser til værtnavne i output.
Hvad hvis trafikken er binær? Så vil muligheden hjælpe os -X — med at vise data i hex og ASCII:
[user@testhost ~]$ sudo tcpdump -i any -X port 12345
Det er vigtigt at bemærke, at IP-pakker vil blive outputtet i begge anvendelser, så i begyndelsen af hver af dem vil der være binære overskrifter for IP og TCP. Her er et eksempel på output for forespørgslen «123» sendt til serveren, der lytter på port 12345:
[user@testhost ~]$ sudo tcpdump -i any -X port 12345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 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 ..........
I stedet for output
Selvfølgelig er der mange flere interessante ting i Linux, som man kan læse om på Habré, StackOverflow og andre sider (som eksempel vil jeg nævne , som også findes i ). Systemadministratorer og DevOps bruger langt flere kommandoer og værktøjer til at konfigurere servere, men selv testere kan have brug for flere af de nævnte kommandoer. Det kan være nødvendigt at tjekke, om en snedig timeout fra klienten til serveren fungerer korrekt, eller hvordan serveren reagerer, når der ikke er ledig diskplads. Jeg nævner ikke engang Docker, som nu bruges aktivt af mange virksomheder. Det ville være interessant at dykke ned i nogle eksempler på brug af forskellige Linux-konsolværktøjer i testprocessen af tjenester i denne fortsættelse af vejledningen? Del også gerne dine top kommandoer i kommentarerne 🙂
Kilde: habr.com
