Linux: даведка па часта ўжываемым камандам

Linux: даведка па часта ўжываемым камандам

Вырашыў сабраць у адным мейсцы ўсе натакі ды вытрымкі па выкарыстоўвываемым камандам, што патрэбные не тое каб часта, але час ад часу ўсё ж трэ прыпамінаць як там гэта... ну тое самае... паглядзець каб колькі важыць... ай, галава дзіравая. Калі ёсьць свае якія цікавыя кейсы выкарыстаньня - вэлкам у каментары, я ў любым выпадку па меры зьяўленьня чаго цікавага буду пашыраць гэты пост.

Бясьпека і сэртыфікаты

Паглядзець час заканчэньня TLS-сэртыфікату для дамену

echo | openssl s_client -connect vitaly.varonich.online:443 \
  -servername vitaly.varonich.online 2>/dev/null \
  | openssl x509 -noout -dates -issuer

Павінна вывесьці нешта кшталту:

notBefore=Mar  1 10:12:44 2026 GMT
notAfter=May 30 10:12:43 2026 GMT
issuer=C=US, O=Let's Encrypt, CN=R12

Тлумачэньні:

  • echo | — адпраўляем пусты ўваход, каб адразу закрыць злучэньне пасьля handshake
  • openssl s_client -connect host:port — усталёўваем TLS-злучэньне
  • -servername — патрэбна для SNI (калі на IP некалькі дамэнаў)
  • 2>/dev/null — хаваем дыягнастычны шум
  • openssl x509 -noout -dates -issuer — парсім сэртыфікат і выводзім даты і выдаўца

Калі выкарыстоўваецца: Для аўтаматычнага альбо ручнога маніторынгу тэрміну дзеяньня сэртыфікату на сэрверы.

Капіяваць SSH-ключ на мэтавы хост

ssh-copy-id -i ~/.ssh/host-target/id_rsa_usr_1 usr1@host-target
  • -i — шлях да канкрэтнага публічнага ключа (калі не ўдакладніць — бярэ ~/.ssh/id_rsa.pub)

Пасьля выкананьня можна заходзіць без пароля: ssh usr1@host-target (пасля карэктнай наладкі канфігаў кліенту ssh, вядома)

Сеціва і парты

Прагледзець адчыненыя парты на хасьце

Сьціслы варыянт — усе праслухоўваемыя TCP/UDP парты хасту:

ss -tuln
Netid             State              Recv-Q             Send-Q                         Local Address:Port                         Peer Address:Port            Process
udp               UNCONN             0                  0                              127.0.0.53%lo:53                                0.0.0.0:*
tcp               LISTEN             0                  4096                                 0.0.0.0:443                               0.0.0.0:*
tcp               LISTEN             0                  4096                           127.0.0.53%lo:53                                0.0.0.0:*
tcp               LISTEN             0                  4096                                 0.0.0.0:80                                0.0.0.0:*
tcp               LISTEN             0                  4096                                 0.0.0.0:22                                0.0.0.0:*
tcp               LISTEN             0                  4096                                    [::]:443                                  [::]:*
tcp               LISTEN             0                  4096                                    [::]:80                                   [::]:*
tcp               LISTEN             0                  4096                                    [::]:22                                   [::]:*

Падрабязна — зь PID і назвай прыкладаньня:

ss -tulnp
Netid        State         Recv-Q         Send-Q                 Local Address:Port                 Peer Address:Port        Process
udp          UNCONN        0              0                      127.0.0.53%lo:53                        0.0.0.0:*            users:(("systemd-resolve",pid=683909,fd=13))
tcp          LISTEN        0              4096                         0.0.0.0:443                       0.0.0.0:*            users:(("docker-proxy",pid=2431073,fd=7))
tcp          LISTEN        0              4096                   127.0.0.53%lo:53                        0.0.0.0:*            users:(("systemd-resolve",pid=683909,fd=14))
tcp          LISTEN        0              4096                         0.0.0.0:80                        0.0.0.0:*            users:(("docker-proxy",pid=2431058,fd=7))
tcp          LISTEN        0              4096                         0.0.0.0:22                        0.0.0.0:*            users:(("sshd",pid=723672,fd=3))
tcp          LISTEN        0              4096                            [::]:443                          [::]:*            users:(("docker-proxy",pid=2431081,fd=7))
tcp          LISTEN        0              4096                            [::]:80                           [::]:*            users:(("docker-proxy",pid=2431065,fd=7))
tcp          LISTEN        0              4096                            [::]:22                           [::]:*            users:(("sshd",pid=723672,fd=4))

Старэйшы аналаг (можа не быць па змаўчаньні, але часта сустракаецца ў гайдах і дасяжны для старых дыстрыбутываў):

netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp6       0      0 :::443                  :::*                    LISTEN
tcp6       0      0 :::80                   :::*                    LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
udp        0      0 127.0.0.53:53           0.0.0.0:*
udp        0      0 0.0.0.0:4789            0.0.0.0:*

Праглядзець, які працэс займае канкрэтны порт:

lsof -i :443
COMMAND       PID USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
docker-pr 2431073 root    7u  IPv4 377473391      0t0  TCP *:https (LISTEN)
docker-pr 2431081 root    7u  IPv6 377473392      0t0  TCP *:https (LISTEN)

Усе злучэньні зь назвамі працэсаў:

lsof -i -n
COMMAND       PID            USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
systemd-r  683909 systemd-resolve   13u  IPv4 705590561      0t0  UDP 127.0.0.53:domain
systemd-r  683909 systemd-resolve   14u  IPv4 705590562      0t0  TCP 127.0.0.53:domain (LISTEN)
sshd       723672            root    3u  IPv4 705721049      0t0  TCP *:ssh (LISTEN)
sshd       723672            root    4u  IPv6 705721051      0t0  TCP *:ssh (LISTEN)
sshd      1452344            root    4u  IPv4 943398107      0t0  TCP 99.22.77.101:ssh->200.50.10.11:4971 (ESTABLISHED)
docker-pr 2431058            root    7u  IPv4 377468898      0t0  TCP *:http (LISTEN)
docker-pr 2431065            root    7u  IPv6 377468899      0t0  TCP *:http (LISTEN)
docker-pr 2431073            root    7u  IPv4 377473391      0t0  TCP *:https (LISTEN)
docker-pr 2431081            root    7u  IPv6 377473392      0t0  TCP *:https (LISTEN)
docker-pr 2444347            root    7u  IPv4 377557226      0t0  TCP *:ssh (LISTEN)
docker-pr 2444353            root    7u  IPv6 377557227      0t0  TCP *:ssh (LISTEN)

Параметры ss/netstat:

  • -t — TCP
  • -u — UDP
  • -l — толькі listening (чакае злучэньняў)
  • -n — не разрашаць назвы (хутчэй)
  • -p — паказваць PID і назву працэсу

Праверыць злучэньне на канкрэтным порце

nc -vz wikijs_db 5432
  • -v — verbose (выводзіць дэталі)
  • -z — толькі праверка, без адпраўкі даных
  • Замест nc можна: curl -v telnet://host:port або timeout 3 bash -c "cat < /dev/null > /dev/tcp/host/port"

Калі выкарыстоўваецца: Праверка дасяжнасьці кантэйнеру і яго партоў паміж сэрвісамі, запушчанымі на розных нодах (часам можа перашкаджаць firewall), альбо ці адказвае на патрэбным порце іньшы хост.

Сканаваньне партоў (nmap)

Па-дэфолту адсутнічае, пад ubuntu трэба выканаць:

sudo apt install nmap

Усе парты аднаго хаста:

nmap -p 1-65535 192.168.1.10
Starting Nmap 7.94SVN ( https://nmap.org ) at 2026-05-31 22:09 UTC
Nmap scan report for static.192.168.1.10.clients.host.com (192.168.1.10)
Host is up (0.00079s latency).
Not shown: 496 closed tcp ports (reset)
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds

Хуткая праверка стандартных партоў:

nmap 192.168.1.10
Starting Nmap 7.94SVN ( https://nmap.org ) at 2026-05-31 21:01 UTC
Nmap scan report for static.192.168.1.10.clients.host.com (192.168.1.10)
Host is up (0.00061s latency).
Not shown: 496 closed tcp ports (reset)
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds

Вызначыць OS і вэрсіі сэрвісаў:

nmap -A 192.168.1.10
Starting Nmap 7.94SVN ( https://nmap.org ) at 2026-05-31 22:12 UTC
Nmap scan report for static.10.20.30.40.clients.host.com (10.20.30.40)
Host is up (0.00038s latency).
Not shown: 996 closed tcp ports (reset)
PORT    STATE SERVICE  VERSION
22/tcp  open  ssh      OpenSSH 9.6 (protocol 2.0)
80/tcp  open  http     Golang net/http server (Go-IPFS json-rpc or InfluxDB API)
|_http-title: Did not follow redirect to https://static.10.20.30.40.clients.example.com/
| ssh-hostkey:
|   256 3a:c2:71:f4:09:4e:d8:5b:22:a1:84:3c:ff:7e:91:b2 (ECDSA)
|_  256 b1:4d:82:a9:f5:c3:16:74:e2:9f:5a:b7:2d:08:51:3f (ED25519)
443/tcp open  ssl/http Golang net/http server (Go-IPFS json-rpc or InfluxDB API)
| ssl-cert: Subject: commonName=TRAEFIK DEFAULT CERT
| Subject Alternative Name: DNS:a3f7c209e1b84cad915e2f7bd44eac18.3c82d1fa47bc0ee91a25d4f6b8ca71b3.traefik.default
| Not valid before: 2026-04-15T08:23:11
|_Not valid after:  2027-04-15T08:23:11
|_http-title: Site doesn't have a title (text/plain; charset=utf-8).
|_ssl-date: TLS randomness does not represent time
Device type: general purpose
Running: Linux 5.X
OS CPE: cpe:/o:linux:linux_kernel:5
OS details: Linux 5.0 - 5.4
Network Distance: 4 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 8080/tcp)
HOP RTT     ADDRESS
1   0.21 ms core1.dc2.ams1.example-dc.com (198.51.100.1)
2   0.44 ms transit2.ams1.example-dc.com (198.51.100.21)
3   0.37 ms edge1.dc2.ams1.example-dc.com (198.51.100.2)
4   0.29 ms static.10.20.30.40.clients.example.com (203.0.113.60)

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 15.75 seconds

Файлавая сыстэма і дыскі

Прагледзець вольнае месца на дысках

df -h
  • -h — human-readable (GB, MB замест байтаў)
  • -T — дадаць тып файлавай сыстэмы (ext4, tmpfs і г.д.)

Падлічыць памер тэчак ды файлаў у бягучай пазіцыі з сартыроўкай

du -sh ./* | sort -h
  • du -sh — сума па кожнай тэчцы/файле (-s — summary, -h — human-readable)
  • sort -h — сартыроўка па памеры ва ўспрымальным фармаце (10M, 1G і г.д.)

Калі выкарыстоўваецца: Знайсьці хто зьеў месца на дыску (вядома ж /var/lib/docker/volumes, што тут гадаць 😅 ).

Топ-20 найбуйнейшых тэчак рэкурсіўна:

du -h --max-depth=5 /var/local | sort -rh | head -20
4.0K	/var/local

Стварыць тэчку любой укладзенасьці

mkdir -p /a/b/c/f/g/d/s/r/t/
  • -p — стварае ўсё дрэва, не кідае памылку калі тэчка ўжо існуе

Падмантыраваць раздзел у памяці (tmpfs)

sudo mount -t tmpfs -o size=3G tmpfs /run/volume/app-cache
  • -t tmpfs — тып файлавай сыстэмы ў RAM
  • -o size=3G — максымальны памер (не рэзэрвуецца адразу)
  • Усё ў /run/volume/app-cache будзе ў аператыўнай памяці і зьнікне пасьля перазагрузкі

Калі выкарыстоўваецца: хуткі файлавы кэш, файлавы буфер, зьмяньшэньне аперацый I/O дыску.

Дадаць swap-файл

sudo dd if=/dev/zero of=/swapfile bs=1M count=1000 oflag=direct
sudo mkswap /swapfile
sudo chmod 0600 /swapfile
sudo swapon /swapfile
 
echo "/swapfile swap swap defaults 0 0" | sudo tee -a /etc/fstab
  • dd ... count=1000 — стварае файл 1000 МБ (=~1 ГБ)
  • oflag=direct — мінае кэш, пішацца адразу на дыск (хутчэй для вялікіх файлаў)
  • chmod 0600 — абавязкова, інакш swapon адмовіць
  • Радок у fstab — аўтаматычна актывуе пры загрузцы

Правы доступу

Рэкурсіўна зьмяніць правы для файлаў і дырэкторый

Для тэчак часьцей за ўсё патрэбна выставіць маску 0755 (rwxr-xr-x) падчас выпраўленья пасля прамога капіяваньня зь win-падобных аперацыйных сістэм:

find . -type d -print0 | xargs -0 chmod 0755

Па-аналёгіі для файлаў маска 0644 (rw-r--r--):

find . -type f -print0 | xargs -0 chmod 0644
  • -type d / -type f — фільтр па тыпе
  • -print0 + xargs -0 — бясьпечная перадача назваў (апрацоўвае прасторы ў назвах)
  • Гэта стандартны набор для web-файлаў: тэчкі павінны мець x-біт (безь яго няма магчымасьці у тэчку ўвайсьці і прагледзець лістынг укладзеных файлаў), файлы — не

Альтэрнатыва праз chmod з -R (прасьцей, але без разьдзяленьня файл/тэчка):

chmod -R u=rwX,go=rX .
  • X — устанаўлівае x толькі калі ўжо ёсьць x ці гэта тэчка

Працэсы

Забіць працэсы па патэрне

pkill -f 'PATTERN'
  • -f — шукае ў поўнай радку каманды (не толькі ў назьве)
  • -9 — SIGKILL (прымусова, без магчымасьці перахопу): pkill -9 -f 'myapp'
  • pgrep -f 'PATTERN' — спачатку знайсьці (без забіваньня)
pgrep -fl 'gunicorn'

pkill -f 'gunicorn'

Паглядзець шлях да выконваемага файлу

$ command -v tar
/usr/bin/tar

Альтэрнатыўна:

$ which tar
/usr/bin/tar
$ type tar
tar is /usr/bin/tar
  • command -v — POSIX-стандартны спосаб, працуе ў любым sh
  • which — шырока ўжываецца, але тэхнічна не POSIX

Вывесьці ўсе файлы ў тэчцы зь зьмесьцівам

for f in *; do [ -f "$f" ] && echo "=== $f ===" && cat "$f" && echo; done

Хутка зірнуць на зьмест канфігурацый, сэкрэтаў, `.env`-файлаў у тэчцы.

$ cat *.html
<html>
    File1
</html><html>
    File2
</html><html>
    File3
</html

Адразу ўсе html файлы

$ tail -n +1 *.html
==> a.html <==
<html>
    File1
</html>
==> b.html <==
<html>
    File2
</html>
==> c.html <==
<html>
    File3
</html>

Разам зь назвамі файлаў і празь раздзяляльнік

Замяніць тэкст у файле на месцы

$ cat aa.txt
one
two
three
123
456

$ sed -i 's/123/321/g' aa.txt
$ cat aa.txt
one
two
three
321
456

Базава, сама проста і хутка

$ cat aa.txt
one
two
three
321
456

$ sed 's/one/eno/g' aa.txt
eno
two
three
321
456

$ cat aa.txt
one
two
three
321
456

Толькі паглядзець вынік працы, зыходны файл не зьмяняецца

find . -type f -name "*.txt" -exec sed -i 's/two/TWO!/g' {} +

Рэкурсіўна па ўсім файлам, пачынаючы зь бягучай тэчкі

Логі і сыстэма

Пачысьціць сыстэмныя логі (journald)

$ journalctl --disk-usage
Archived and active journals take up 1.4G in the file system.

Колькі зараз займаюць сістэмныя логі

journalctl --vacuum-time=2d

Пакінуць логі за апошнія два дні

journalctl --vacuum-size=500M

Пакінуць не болей за 500 мегабайтаў логаў

--vacuum-time= - суфіксы часу. Прымае суфіксы: s (секунды, па змаўчаньні), m (хвіліны), h (гадзіны), days, weeks, months, years. Важкая акалічнасьць: d і days — гэта розныя рэчы у кантэксьце systemd.time. Форма 2d можа не спрацаваць на старэйшых версіях systemd — бясьпечней пісаць 2days. Пры гэтымh працуе і зьяўляецца больш пажаданым, чымсьці hours. Гэты аргумент больш прадказальны з пункту гледжання ратацыі: дакладна вядома логі за які перыяд застануцца. Аднак памер моцна залежыць ад актыўнасьці сыстэмы.

journalctl --vacuum-time=30s     # 30 секунд (практычна — выдаліць усё)
journalctl --vacuum-time=2h      # 2 гадзіны
journalctl --vacuum-time=2d      # 2 дні (скарочаная форма days)
journalctl --vacuum-time=2days   # тое самае
journalctl --vacuum-time=2weeks  # 2 тыдні
journalctl --vacuum-time=3months # 3 месяцы
journalctl --vacuum-time=1years  # год

--vacuum-size= - суфіксы памеру Прымае суфіксы K, M, G і T - да базы 1024 (г.зн. бінарныя кілабайты/мегабайты). Ніжняга рэгістру (k, m, g) тут няма - толькі вялікія літары. Выкарыстоўваць аргумент прасьцей для аперацыйных задач: "хачу каб логі займалі не больш за X". Аднак ёсьць важны нюанс з дакументацыі: vacuum апрацоўвае толькі архіўныя файлы журнала, а не актыўны файл, у які зараз ідзе запіс. Таму --disk-usage можа паказваць больш, чым вынік vacuum.

journalctl --vacuum-size=100K    # 100 КіБ
journalctl --vacuum-size=500M    # 500 МіБ
journalctl --vacuum-size=1G      # 1 ГіБ
journalctl --vacuum-size=2T      # 2 ТіБ

На практыцы зручней камбінаваць абодва аргументы ў адной камандзе:

journalctl --vacuum-time=14d --vacuum-size=1G

Спрацуе тое абмежаваньне, якое адсячэ больш. Яшчэ ёсьць трэці варыянт - --vacuum-files=N — пакідае толькі N апошніх архіўных файлаў. Карысна для сыстэм зь больш-меньш аднастайнай нагрузкай.

А каб ачастка улічвала актуальны на дадзены момант аб'ём логаў - варта перад ачысткай зрабіць ратацыю:

journalctl --rotate && journalctl --vacuum-time=7d

--rotate прымусова архівуе бягучы актыўны файл, пасьля чаго vacuum ужо зможа яго апрацаваць.

Глядзець логі ў рэальным часе

tail -f /var/log/app.log

Сочыць за зьменамі ў адным файле

tail -f /var/log/nginx/access.log /var/log/nginx/error.log

Выводзіць новыя запісы зь некалькі файлаў адначасова

tail -f /var/log/app.log | grep -i error

Сочыць за файлам зь дадатковай фільтрацыяй па памылкам без уліку рэгістру

RabbitMQ

Сьпіс чэргаў

rabbitmqadmin list queues -u admin_user -p admin_password

Дэфолтны фармат вываду

rabbitmqadmin list queues name messages consumers memory \
  -u admin_user -p admin_password

Задаць палі для адлюстраваньня

Ачыстка чаргі

rabbitmqadmin purge queue name=queue_name \
  --vhost=my_vhost \
  -u my_admin_on_vhost \
  -p admin_password

! Усе паведамленьні ў чарзе будуць выдаленыя, адмена немагчымая.

Gitea

Генерацыя access token для карыстальніка

gitea admin user generate-access-token \
  --username git-user \
  --token-name new-app-token \
  --scopes \
    read:activitypub,read:admin,read:misc,\
    read:notification,read:organization,read:package,\
    read:issue,write:repository,read:user
  • --scopes — перыметр доступу (принцып мінімальных прывілеяў)

Токен паказваецца аднойчы — адразу захоўваць у бясьпечным месцы

Звычайна запускаю знутры кантэйнеру сэрвісу.

Каб было пад рукой

Каманда Параметр Значэньне
ss -tuln TCP+UDP, listening
du -sh summary, human-readable
find -print0 | xargs -0 бяспечная перадача назваў
grep -rn рэкурсіўна + нумары радкоў
tar -czf / -xzf стварыць / распакаваць gz
sed -i 's/a/b/g' замена знутры файла
journalctl --vacuum-time=Nd ачысьціць логі старэй за N дзён

Афіцыйная дакументацыя

GNU/Linux coreutils (man7.org)

Асноўная онлайн-бібліятэка man-старонак для Linux. Для любой стандартнай каманды можна адкрыць старонку непасрэдна па шаблоне https://man7.org/linux/man-pages/man1/COMMAND.1.html

Каманда Спасылка
ss man7.org/linux/man-pages/man8/ss.8.html
netstat man7.org/linux/man-pages/man8/netstat.8.html
nc (netcat) man7.org/linux/man-pages/man1/ncat.1.html
find man7.org/linux/man-pages/man1/find.1.html
xargs man7.org/linux/man-pages/man1/xargs.1.html
grep man7.org/linux/man-pages/man1/grep.1.html
sed man7.org/linux/man-pages/man1/sed.1.html
tar man7.org/linux/man-pages/man1/tar.1.html
df man7.org/linux/man-pages/man1/df.1.html
du man7.org/linux/man-pages/man1/du.1.html
mount man7.org/linux/man-pages/man8/mount.8.html
dd man7.org/linux/man-pages/man1/dd.1.html
chmod man7.org/linux/man-pages/man1/chmod.1.html
mkdir man7.org/linux/man-pages/man1/mkdir.1.html
pkill / pgrep man7.org/linux/man-pages/man1/pkill.1.html
lsof man7.org/linux/man-pages/man8/lsof.8.html
tail man7.org/linux/man-pages/man1/tail.1.html
journalctl man7.org/linux/man-pages/man1/journalctl.1.html
ssh-copy-id man7.org/linux/man-pages/man1/ssh-copy-id.1.html
nohup man7.org/linux/man-pages/man1/nohup.1.html

Альтэрнатыва: man COMMAND у тэрмінале - для ўсіх гэтых утылітаў man-старонкі ёсьць у дэфолтнай інсталяцыі сыстэмы (паўнавартаснай, хаця часам і ў кантэйнерах пакідаюць).

OpenSSL

Nmap

RabbitMQ

Gitea

Замест заключэньня

Артыкул не зьяўляецца паўнавартасным гайдам ці дакументацыяй, хутчэй уяўляе сабой аб'яднаньне крупін досьведу, які я ў той ці іньшы час вырашыў захаваць на будучыню. І гэта было недарэмна і раз пораз аказваецца карысным. Усё гэта будзе папаўняцца падчас далейшага назапашваньня досьведу і навучаньню чаму новаму. Проста таму, што знайсьці гэта тут будзе хутчэй, чым успамінаць дзе ўласна можа ляжаць тая самая каманда, зь дапамогай якой некалі атрымалася зручней наладзіць новы сэрвер ці знайсьці памылку.

Заставайцеся на сувязі, пакідайце каментары, калі знайшлася памылка ці ўдакладненье, альбо калі хочацца падзяліцца ўласнымі прыкладамі. Усім мір.