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 |— адпраўляем пусты ўваход, каб адразу закрыць злучэньне пасьля handshakeopenssl 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/fstabdd ... 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/tarcommand -v— POSIX-стандартны спосаб, працуе ў любым shwhich— шырока ўжываецца, але тэхнічна не 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
Альтэрнатыва:
man COMMANDу тэрмінале - для ўсіх гэтых утылітаўman-старонкі ёсьць у дэфолтнай інсталяцыі сыстэмы (паўнавартаснай, хаця часам і ў кантэйнерах пакідаюць).
OpenSSL
openssl s_client— docs.openssl.org/3.5/man1/openssl-s_clientopenssl x509— docs.openssl.org/3.5/man1/openssl-x509- Усе саб-каманды — docs.openssl.org/3.5/man1/openssl
Nmap
- Man page анлайн цалкам — nmap.org/book/man.html
- Параметры — nmap.org/book/man-briefoptions.html
- Уся дакументацыя — nmap.org/docs.html
RabbitMQ
rabbitmqadmin(v2) — rabbitmq.com/docs/management-cli- CLI — rabbitmq.com/docs/cli
- Management plugin — rabbitmq.com/docs/management
Gitea
gitea adminCLI — docs.gitea.com/administration/command-line- API і токены — docs.gitea.com/development/api-usage
- Скоўпы токенаў (OAuth2) — docs.gitea.com/development/oauth2-provider
Замест заключэньня
Артыкул не зьяўляецца паўнавартасным гайдам ці дакументацыяй, хутчэй уяўляе сабой аб'яднаньне крупін досьведу, які я ў той ці іньшы час вырашыў захаваць на будучыню. І гэта было недарэмна і раз пораз аказваецца карысным. Усё гэта будзе папаўняцца падчас далейшага назапашваньня досьведу і навучаньню чаму новаму. Проста таму, што знайсьці гэта тут будзе хутчэй, чым успамінаць дзе ўласна можа ляжаць тая самая каманда, зь дапамогай якой некалі атрымалася зручней наладзіць новы сэрвер ці знайсьці памылку.
Заставайцеся на сувязі, пакідайце каментары, калі знайшлася памылка ці ўдакладненье, альбо калі хочацца падзяліцца ўласнымі прыкладамі. Усім мір.