26 команд Linux, які повинен знати кожен сисадмін

 11630

Linux пропонує безліч різних команд та утиліт, які допоможуть вам швидко та ефективно виконувати завдання системного адміністрування.

Робота системного адміністратора складається з виконання наступних завдань: встановлення і запуск програмного забезпечення, контроль доступу користувачів до системи, забезпечення доступності необхідних ресурсів, резервне копіювання важливих даних (а також відновлення їх із резерву) тощо.

У цій статті ми розглянемо команди в Linux, які найчастіше використовуються системними адміністраторами.


Команда uname

Команда uname з параметром -a застосовується для виведення системної інформації: найменування ядра, його версії, імені хосту, типу процесора та інформації про апаратну платформу.

diego@debian:~$ uname -a
Linux debian 5.10.0-5-amd64 #1 SMP Debian 5.10.24-1 (2021-03-19) x86_64 GNU/Linux

Розглянемо вищенаведений рядок детально:

назва ядра: Linux
ім'я хосту: debian
номер релізу ядра: 5.10.0-5-amd64
номер версії ядра: #1 SMP Debian 5.10.24-1 (2021-03-19)
архітектура: x86_64
операційна система: GNU/Linux


Команда who

Команда who виводить список користувачів, що ввійшли в систему.

diego@debian:~$ who
diego    tty7         2021-04-03 09:21 (:0)


Команда w

Команда w відображає користувачів та їх процеси. Спочатку виводиться заголовок, що містить поточний час, тривалість безвідмовної роботи системи (uptime), кількість користувачів, які увійшли до системи, та середні значення завантаження системи.

Далі ми бачимо імена користувачів, термінал, що використовується, віддалену IP-адресу, з якої користувачі увійшли до системи, час їх входу, час простою, JCPU (час, використаний усіма процесами, закріпленими за терміналом), PCPU (час, використаний процесом з поля WHAT) та програму, яку вони запустили.


Команда ls

Команда ls відображає вміст каталогу. Крім того, ця команда допомагає перевірити встановлені для файлів/каталогів дозволи. У наступному прикладі показано невдалу (через відсутність необхідних прав) спробу запуску програми acode_app. Виконавши після цього команду ls -l, ми бачимо, що в наборі прав -rw-r--r-- відсутній дозвіл на виконання — символ x:

$ ./acode_app
bash: ./acode_app: Відмовлено в доступі
$ ls -l acode_app
-rw-r--r-- 1 diego diego   180 мар 29 14:51  acode_app


Команда tar

Команда tar дозволяє заархівувати кілька файлів до одного архіву.

Розглянемо приклад. Створимо каталог ravesli_docs, та помістимо в нього три файли: a.txt, b.txt та c.txt:

diego@debian:~$ mkdir ravesli_docs; touch ravesli_docs/{a.txt,b.txt,c.txt}

Тепер за допомогою команди tar -cvf створимо архів ravesli.tar, який містить усі файли з каталогу ravesli_docs:

Переглянувши за допомогою команди ls вміст поточного каталогу, можна помітити каталог ravesli_docs та тільки що створений нами архів ravesli.tar:

diego@debian:~$ ls
ravesli.tar  ravesli_docs

Для розпакування архіву застосовується команда tar -xvf:

Також ми можемо здійснити gzip-стиснення для архіву (для цього додаємо параметр -z):

Для розпакування стисненого архіву застосовується комбінація параметрів -z та -x:


Команда rsync

Команда rsync дозволяє синхронізувати файли та каталоги між двома розташуваннями. Вона може застосовуватися як для локального, так і для віддаленого копіювання. Ефективність та швидкість її роботи полягає в тому, що вона пересилає тільки ті дані, які відрізняються між вмістом вихідних та кінцевих файлів. Команда rsync широко використовується для резервного копіювання даних, а також як модернізована команда копіювання.

Нижче наведено приклад копіювання всіх файлів з каталогу ravesli_docs до каталогу backups за допомогою команди rsync:


Команда find

Команда find використовується для пошуку файлів на основі їхнього імені, дозволів, ідентифікатора користувача, ідентифікатора групи, розміру, типу файлу, а також інших критеріїв. Це одна з найчастіше використовуваних команд у Linux.

Наприклад, якщо ми хочемо знайти в поточному каталозі файл з відомим нам ім’ям, то після команди find . -name необхідно вказати ім’я файлу:

diego@debian:~$ find . -name a.txt
./ravesli_docs/a.txt
./backups/a.txt

Для пошуку каталогів використовується параметр -type d:

diego@debian:~$ find . -type d
.
./ravesli_docs
./.pki
./.pki/nssdb
./Шаблони
./Документи
./.cache
./.cache/QtProject
./.cache/QtProject/QtCreator
./.cache/QtProject/QtCreator/qmlcache
./.cache/fontconfig
./.cache/systemsettings
./.cache/systemsettings/qmlcache
./.cache/systemsettings/attica
[…]

За пошук файлів за розміром відповідає параметр -size. Наприклад, якщо в поточному каталозі ми хочемо знайти всі файли, розмір яких становить понад 10 МБ, то необхідно виконати команду find . -size +10M:

diego@debian:~$ find . -size +10M
./.cache/icon-cache.kcache
./.cache/appstream/system/ru_RU.cache
./.cache/plasma_theme_default_v5.78.0.kcache
./.mozilla/firefox/am73pqpn.default-esr/storage/permanent/chrome/idb/3870112724rsegmnoittet-es.sqlite


Команда locate

Команда locate використовує базу даних для пошуку файлів і, в деяких випадках, може бути набагато швидшою за команду find. Наприклад, для пошуку файлу apache2.conf необхідно зробити наступне:

diego@debian:~$ locate apache2.conf
/etc/apache2/apache2.conf
/usr/share/doc/apache2/examples/apache2/apache2.conf
/var/lib/dpkg/info/apache2.conffiles

Якщо нам потрібно знайти лише кількість файлів, що відповідають шаблону пошуку, то додаємо параметр -c:

diego@debian:~$ locate -c apache2.conf
3

Іноді може знадобитися оновити базу даних, до якої звертається locate. Для цього необхідно ввести команду updatedb (її запуск здійснюється від імені суперкористувача):

diego@debian:~$ sudo updatedb


Команда systemctl

Команда systemctl використовується для керування системними службами.

Наприклад, запуск служби веб-сервера apache2 виконується наступним чином:

diego@debian:~$ sudo systemctl start apache2.service

Примітка: Можна не писати частину .service.

Зупинка служби виконується аналогічним чином, тільки start змінюється на stop:

diego@debian:~$ sudo systemctl stop apache2

Для перегляду стану служби використовується команда systemctl status. У наступному прикладі ми знову запускаємо apache2, щоб подивитися на вивід команди systemctl status:


Команда journalctl

Команда journalctl використовується для перегляду логів, зібраних systemd. systemd “збирає” логи у бінарному форматі. Щоб їх переглянути, використовується команда sudo journalctl:

Як правило, кориснішим є реверсивний перегляд логів (тобто спочатку нові, а потім уже старі логи). Щоб вивести логи у зворотному порядку, використовуйте параметр -r:

Для перегляду логів, що стосуються якоїсь конкретної служби, наприклад, apache2, використовуйте параметр -u:


Команда kill

Команда kill використовується для примусового завершення процесу.

Щоб переглянути всі сигнали, які ви можете надіслати процесу, додайте до команди параметр -l:

Два сигнали, що найчастіше використовуються — це SIGTERM та SIGKILL.

   Сигнал SIGTERM дозволяє процесу завершити свою роботу самостійно ДО його примусового завершення і тому належить до так званої категорії “soft kill” (м’яке завершення).

   Сигнал SIGKILL призводить до негайного завершення процесу.

Також можна вказувати числові значення сигналів замість їх назв, наприклад, -9 замість SIGKILL та -15 замість SIGTERM.

Нижче наведено список усіх процесів веб-сервера apache2:

Щоб убити процес apache2 з ідентифікатором 2409, необхідно ввести наступну команду:

diego@debian:~$ sudo kill -9 2409

Ще раз переглянемо список процесів apache2. Як бачите, тепер залишилося лише три процеси:


Команда killall

Команда killall застосовується у тому випадку, якщо ви хочете вбити керуючий (батьківський) та всі дочірні процеси. Щоб убити всі екземпляри процесу apache2 у вищенаведеному прикладі, виконайте наступне:

diego@debian:~$ sudo killall apache2


Команда curl

Команда curl дозволяє взаємодіяти із зовнішніми ресурсами за допомогою URL-адрес. Часто ця команда застосовується для визначення того, чи може ваша програма зв’язатися з іншою службою, наприклад, базою даних, або для перевірки працездатності вашої служби.

Уявіть, що у нас є база даних MongoDB, яка не може зв’язатися із зовнішнім додатком, повертаючи при цьому повідомлення про помилку HTTP 500:

$ curl -I -s myapplication:5000
HTTP/1.0 500 INTERNAL SERVER ERROR

Параметр -I виводить інформацію про заголовок HTTP-запиту, а параметр -s відповідає за тихий (silent) режим, у якому пропускається тіло HTTP-відповіді від сервера. При цьому перевірка підключення до бази даних з локального хосту проходить успішно:

$ curl -I -s database:27017
HTTP/1.0 200 OK

То в чому ж може бути проблема? Для початку необхідно перевірити, чи можемо ми з хосту, на якому встановлено нашу програму, звернутися до інших ресурсів, крім бази даних:

$ curl -I -s https://acode.com.ua
HTTP/1.1 200 OK

Начебто все гаразд. Тепер спробуємо зв’язатися із базою даних. Оскільки для підключення до бази даних наша програма використовує ім’я хосту бази даних, то спочатку спробуємо виконати наступну команду:

$ curl database:27017
curl: (6) Couldn't resolve host 'database'

Отриманий результат означає, що задана URL-адреса недоступна або хост не має належним чином налаштованого DNS-сервера, який можна використовувати для зіставлення імені та IP-адреси.


Команда tail

Команда tail відображає останню частину (хвіст) файлу. Наприклад, шукаючи помилки у роботі програми зазвичай переглядають вміст log-файлів — файлів із хронологічним записом всіх подій, що відбуваються на сервері. Такі файли можуть містити тисячі записів і зазвичай немає потреби переглядати весь їх вміст, щоб виявити помилку (error). Натомість можна перевірити останні записи, застосувавши команду tail та дізнатися, що відбувається в log-файлі під час виконання запиту до HTTP-сервера Apache:

Завдяки параметру -f (від англ. follow” — слідувати), рядки log-файлу виводяться згідно з хронологічною послідовністю їх запису в log-файл. Тепер уявімо іншу ситуацію: у нас є скрипт, що працює у фоновому режимі, та кожні декілька секунд звертається до певного зовнішнього ресурсу, і в log-файл записуються поточні запити. Замість того, щоб у режимі реального часу стежити за всім вмістом log-файлу, ми можемо використати команду tail -n, яка виведе 100 останніх рядків:

$ tail -n 100 /var/log/httpd/access_log


Команда cat

Команда cat використовується для виводу в термінал вмісту файлів. Ми можемо використовувати її, наприклад, для перегляду файлу з прізвищами колег по роботі:

$ cat робота_колеги.txt

Коваль А. А.
Кравченко Б. Б.
Ткачук С. С.


Команда grep

Команда grep здійснює пошук у текстових файлах за заданим шаблоном та відображає всі рядки, в яких заданий шаблон присутній. Дуже часто команда grep застосовується як фільтр інформації, що надходить від іншої команди (наприклад, для пошуку всередині log-файлу певних процесів).

Припустимо, що ми захотіли подивитися, чи запустився наш сервер Apache Tomcat, і виконали команду cat tomcat.log. Та кількість інформації, яка в цей момент рине в термінал, може вас “приголомшити”. Натомість ми перенаправимо всі ці дані в команду grep, яка здійснить відбір тільки тих рядків, які будуть вказувати на запуск сервера:

$ cat tomcat.log | grep org.apache.catalina.startup.Catalina.start

01-Jul-2017 18:03:47.542 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 681 ms


Команда top

Команда top виводить та оновлює відсортовану інформацію про поточний процес (або процеси). Використовуйте її, щоб визначити, які процеси зараз запущені та скільки пам’яті й ресурсів вони споживають. Зазвичай буває так, що ви запускаєте програму, і вона за хвилину “вмирає”. Перевіривши відповідний log-файл, ви помічаєте запис, який вказує на помилку пам’яті:

$ tail myapp.log
Traceback (most recent call last):
MemoryError

Чи дійсно програмі не вистачило пам’яті? Щоб підтвердити цей здогад, використовуємо команду top і дивимося, скільки ресурсів процесора та пам’яті споживається програмою. В результаті бачимо, що основне навантаження на процесор і пам’ять створює процес python3.

Натиснувши клавішу C, ми побачимо повну команду, яка запустила програму.

Виявляється, це дійсно наша програма (memeater.py). Коли в неї закінчиться пам’ять, система вб’є процес, видавши помилку “out-of-memory” (OOM).


Команда netstat

Команда netstat відображає інформацію про стан мережі. Вона показує використовувані мережеві порти та вхідні з’єднання до них. Однак варто зауважити, що команда netstat не входить до базового постачання Linux; утиліта встановлюється разом із пакетом net-tools.

Припустимо, що ми проводимо локальні експерименти з програмою, яка приймає вхідні з’єднання від інших програм. Може статися так, що ми отримаємо повідомлення про помилку типу “Необхідний порт (або адреса) вже зайнятий”. Застосувавши команду netstat з параметрами протоколу, процесу та порту, ми побачимо, що HTTP-сервер Apache вже використовує 80 порт на вказаному нижче хості:


Команда ip

Команда ip використовується для відображення та налаштування мережевих інтерфейсів. Також ця команда використовується для виведення та зміни IP-адрес, маршрутів та сусідніх об’єктів.

Наприклад, давайте виведемо інформацію про всі мережеві інтерфейси:

diego@debian:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0d:3a:9b:88:d6 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.4/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20d:3aff:fe9b:88d6/64 scope link
valid_lft forever preferred_lft forever


Команда lsof

Команда lsof відображає інформацію про те, які файли використовуються тим чи іншим процесом. У Linux практично будь-яка взаємодія із системою розглядається як взаємодія із файлом. Якщо наша програма записує дані у файл або відкриває мережеве з’єднання, то команда lsof виведе відповідну інформацію щодо цієї взаємодії. Подібно до команди netstat, ми можемо використовувати команду lsof для перевірки відкритих мережевих портів. Наприклад, якщо ми хочемо дізнатися, чи зайнятий у нашій системі 80 порт, то, застосувавши команду lsof, ми отримаємо інформацію про те, який саме процес зараз його використовує.

Нижче ми бачимо, що процес apache2 прослуховує порт 80. Ми також можемо використати команду lsof для запиту інформації по ідентифікатору процесу, щоб дізнатися, де знаходиться відповідний процесу двійковий файл:

Ім’я файлу у списку відкритих файлів допомагає точно визначити походження процесу, зокрема ми тепер знаємо, що це веб-сервер Apache.


Команда df

Команда df використовується для отримання інформації про доступний вільний простір. При запуску програми може з’явитися повідомлення про відсутність вільного місця на диску. Застосувавши команду df, ми зможемо з’ясувати, чи це дійсно так:

Параметр -h відображає інформацію у зручному форматі. За замовчуванням команда df надає результати для всього, що знаходиться в кореневому каталозі, але ви також можете обмежити результати видачі, додавши в команду шлях до заданого каталогу (наприклад, df -h /home).


Команда du

Команда du використовується для отримання інформації про те, які файли (та в якому обсязі) використовують дискове місце в заданому каталозі. Наприклад, якщо ми хочемо дізнатися, який log-файл займає найбільше місця в каталозі /var/log, ми можемо використати команду du з параметром –s (для відображення зайнятого місця) і параметром -h (зручний для перегляду формат):

На вищенаведеному скріні бачимо, що найбільшим у каталозі /var/log є каталог /var/log/apt. Використання команди du у поєднанні з командою df допоможе нам швидко визначити, що та в яких обсягах використовує дисковий простір на нашому комп’ютері.


Команда id

Команда id використовується для отримання інформації щодо поточного користувача. У наступному прикладі я спробував встановити аналізатор мережевого трафіку Wireshark, на що система відреагувала повідомленням, що я не можу виконати цю команду, оскільки не маю прав суперкористувача (root). Після цього, щоб перевірити свого користувача та групу, я виконав команду id та побачив, що працював під обліковим записом звичайного користувача diego у групі diego:

Для виправлення ситуації необхідно зробити вхід під обліковим записом суперкористувача (root) або застосувати команду sudo.


Команда chmod

Команда chmod використовується для керування дозволами на заданий файл/каталог.

Наприклад, при першому запуску бінарного файлу програми (або скрипта) на нашому комп’ютері може з’явитися повідомлення про помилку типу “Відмовлено в доступі”. Виконавши за допомогою вже знайомої нам команди ls перевірку встановлених дозволів, ми бачимо наступну картину:

У скрипта не має прав на виконання (символ x у наборі дозволів). У такій ситуації нам допоможе команда chmod, яка додає (або прибирає) необхідні дозволи, що забезпечують користувачеві можливість запускати скрипт (або двійковий файл):

Після цього, при повторній спробі виконати скрипт ravesli.sh, ми більше не отримаємо помилку.


Команда sestatus

Зазвичай, SELinux (модуль безпеки Linux) застосовується там, де процесам, запущеним на хості, потрібно забезпечити найменші привілеї, запобігаючи тим самим доступу потенційно шкідливих процесів до важливих файлів у системі. Однак у деяких ситуаціях програма, якій потрібно отримати доступ до певного файлу, може повернути помилку. Щоб перевірити, чи SELinux не блокує нашу програму, використаємо команди tail та grep для пошуку повідомлення типу “denied” в log-файлі /var/log/audit.

Перевірка того, чи увімкнений сам модуль SELinux, здійснюється за допомогою команди sestatus:

$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28

Вивід вказує на те, що на хості модуль SELinux увімкнено.


Команда history

Команда history відображає історію команд, які були введені з моменту початку сесії. Наприклад, якщо зараз застосувати команду history, то вона покаже різні команди, з якими ми експериментували вище:

diego@debian:~$ history
1 clear
2 uname -a
3 who
[…]

Але що робити, якщо нам потрібно виконати попередню команду, але ми не хочемо наново вручну її набирати? Відповідь — використовуйте символ ! перед номером команди для її повторного виконання:

[…]
570 sudo firewall-cmd --get-active-zones --list-all
571 sudo man firewall-cmd
572 sudo firewall-cmd --get-default-zones
573 sudo firewall-cmd --get-default-zone
574 clear
575 history
576 uname
577 uname -a
578 clear
579 history
diego@debian:~$ !577
uname -a
Linux debian 5.10.0-5-amd64 #1 SMP Debian 5.10.24-1 (2021-03-19) x86_64 GNU/Linux
diego@debian:~$

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (9 оцінок, середня: 5,00 з 5)
Завантаження...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *