Skip to content

Latest commit

 

History

History
456 lines (337 loc) · 22.7 KB

File metadata and controls

456 lines (337 loc) · 22.7 KB

Работа в консоли

Чёрный экран, мигающий курсор, никаких кнопок — для человека, привыкшего к Windows, командная строка выглядит как шаг назад. Зачем набирать текст, если можно кликнуть мышкой?

У графического интерфейса есть очевидные плюсы: он привычен, нагляден, подсказывает возможные действия — не нужно ничего запоминать, всё перед глазами. Но когда люди пробуют всерьёз поработать в консоли, многие с удивлением обнаруживают, что текстовый интерфейс по-своему удобен — а для ряда задач попросту быстрее. Вот почему.

Почему текст, а не кнопки

Комбинируемость

Одна из ключевых идей командной строки Unix — принцип маленьких инструментов. Каждая утилита делает что-то одно: grep ищет текст, sort сортирует строки, wc считает их количество. По отдельности каждая не слишком впечатляет. Но их можно соединять в цепочки — передавать вывод одной команды на вход другой через символ | (он называется «пайп», от английского pipe — труба).

Например, вы хотите узнать, с каких IP-адресов чаще всего заходят на ваш сайт:

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

Выглядит пугающе. Но никто не пишет такое целиком, в одно движение. Администратор строит эту команду как домик из кубиков, добавляя по одному элементу и проверяя результат на каждом шаге.

Ход мысли примерно такой: «Мне нужны IP-адреса — это первое поле в каждой строке лога. Вытащу-ка их... Хорошо, вижу список. Теперь посчитать, сколько раз встречается каждый. Отлично. Отсортировать по убыванию... И взять двадцатку самых частых».

Каждый шаг — одна простая утилита. awk вытаскивает нужное поле, sort сортирует, uniq -c считает повторения, head -20 обрезает вывод. Пайп | просто передаёт результат на вход следующей. Вы собираете решение по частям, как конструктор, — и на каждом этапе видите, что получается.

Мы подробно разберём каждую из этих утилит в главе 5. Пока достаточно понять принцип: не нужно держать в голове всю команду целиком — нужно уметь думать «шагами».

Эта комбинируемость — огромная сила консоли. Но у неё есть и обратная сторона. Когда задача усложняется, однострочники превращаются в нечитаемые конструкции с вложенными кавычками и подстановками, которые через неделю не разберёт даже автор. Умение почувствовать момент, когда пора перестать изощряться в bash и написать нормальный скрипт на Python — отдельный и важный навык. Мы ещё вернёмся к этому позже.

Автоматизируемость

Команду можно записать, повторить, вставить в скрипт. То, что вы сделали руками на одном сервере, скрипт воспроизведёт на десяти — одинаково и без ошибок. Эту же команду можно положить в систему контроля версий, запустить по расписанию, передать коллеге. Текст — универсальный формат, с которым удобно работать и людям, и программам.

С графическим интерфейсом так не получится: попробуйте описать коллеге последовательность из двадцати кликов по меню.

Минимальные требования к каналу связи

У консоли есть ещё одно преимущество, о котором редко пишут в учебниках, — она почти ничего не требует от канала связи. SSH-сессия — это буквально килобайты трафика. Вы передаёте нажатия клавиш в одну сторону и получаете текст в другую. Всё.

Это звучит как мелочь — до тех пор, пока вам не приходится чинить сервер из зала ожидания аэропорта с полумёртвым Wi-Fi или из купе поезда, где мобильный интернет пропадает каждые три минуты. SSH-сессия будет работать даже там, где соединение с удалённым рабочим столом давно бы разорвалось.

Больше того: подключиться к серверу по SSH можно даже с телефона, установив приложение-терминал. Это неудобно — набирать команды на экранной клавиатуре не пожелаешь и врагу. Но когда коллеги просят срочно посмотреть, что случилось с сервером, а вы в дороге с одним телефоном в кармане — этот вариант серьёзно выручит.

Почему серверы без графической оболочки

Серверы, как правило, устанавливают без графического интерфейса. Не из аскетизма — причины практические.

Большинство серверных программ в Linux управляются из командной строки. Графические интерфейсы к ним существуют, но это отдельные проекты, которые разрабатываются независимо от самой программы. GUI может отставать от текущей версии, не поддерживать часть настроек, реализовывать логику по-своему. По сути, вам приходится учить не одну вещь, а две: саму программу и её графическую обёртку — со своими особенностями, ограничениями и багами. А когда что-то идёт не так, всё равно приходится открывать консоль и разбираться через конфиги и логи.

Кроме того, консоль автоматизируется (скрипты, контроль версий, повторяемость), а SSH работает там, где графический интерфейс давно бы отвалился.


Всё это звучит убедительно, но пока абстрактно. Давайте перейдём к конкретике — приёмам, благодаря которым работа в консоли становится быстрой и приятной.

Tab: автодополнение

Это самый важный приём в командной строке. Вместо того чтобы вводить длинные имена файлов и команд целиком, вы нажимаете клавишу Tab — и оболочка дописывает за вас.

Попробуйте. Введите начало команды и нажмите Tab:

hos Tab

Оболочка дополнит до hostname.

Это работает и для путей к файлам. Введите:

cd /ho Tab

Оболочка дополнит до cd /home/. Если в /home/ один каталог — дополнит и его:

cd /home/stu Tab

Получится cd /home/student/.

Двойной Tab: список вариантов

Если совпадений несколько, одно нажатие Tab не сработает. Нажмите Tab дважды — оболочка покажет все варианты:

ls /u Tab Tab
usr/  udev/

Допишите ещё одну букву, чтобы убрать неоднозначность, и снова нажмите Tab:

ls /us Tab

Получится ls /usr/.

Совет. Привыкайте нажимать Tab после каждых 2–3 букв. Это не лень — это нормальная практика. Автодополнение не только экономит время, но и защищает от опечаток: если Tab не дополняет — значит, вы ввели что-то не то.

Стрелки: история команд

Оболочка запоминает все команды, которые вы вводили. Нажмите стрелку вверх — появится предыдущая команда. Ещё раз вверх — команда перед ней. Стрелка вниз — обратно к более новым командам.

Это полезно, когда нужно повторить или слегка изменить предыдущую команду. Вместо того чтобы набирать заново:

docker compose -f docker-compose.yml up -d

— просто нажмите стрелку вверх, найдите нужную команду и нажмите Enter.

Поиск по истории: Ctrl+R

Стрелки удобны для последних 3–5 команд. Если нужно найти команду, которую вы вводили час назад — используйте Ctrl+R.

Нажмите Ctrl+R — появится приглашение:

(reverse-i-search)`':

Начните вводить часть команды — например, docker:

(reverse-i-search)`docker': docker compose up -d

Оболочка покажет последнюю команду, содержащую docker. Нажмите Ctrl+R ещё раз, чтобы перейти к более ранним совпадениям. Когда нашли нужную команду — нажмите Enter, чтобы выполнить, или стрелку вправо, чтобы отредактировать перед выполнением.

Чтобы выйти из поиска без выполнения — нажмите Ctrl+C.

Команда history

Чтобы увидеть всю историю команд:

history

Оболочка покажет пронумерованный список:

  1  whoami
  2  hostname
  3  pwd
  4  ls /
  5  cd /tmp
  6  cd

Чтобы посмотреть последние 10 команд:

history 10

Горячие клавиши

В командной строке есть набор сочетаний клавиш, которые ускоряют работу. Вот самые важные — выучите их в первую очередь:

Сочетание Действие
Ctrl+C Прервать выполнение текущей команды
Ctrl+D Завершить сеанс (аналог команды exit)
Ctrl+L Очистить экран (аналог команды clear)
Ctrl+A Перейти в начало строки
Ctrl+E Перейти в конец строки
Ctrl+W Удалить слово перед курсором
Ctrl+U Удалить всё от курсора до начала строки
Ctrl+K Удалить всё от курсора до конца строки

Ctrl+C: ваш аварийный выход

Ctrl+C — самое важное сочетание. Запомните его первым.

Если команда работает слишком долго, если вы случайно запустили что-то не то, если экран заполнился непонятным текстом — нажмите Ctrl+C. Это безопасно: команда прерывается, и вы возвращаетесь к обычному приглашению $.

ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=5.42 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=118 time=5.31 ms
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss

Команда ping работает бесконечно, пока вы не остановите её. ^C в выводе — это и есть ваше нажатие Ctrl+C.

Ctrl+D: мягкий выход

Ctrl+D означает «конец ввода». Если вы находитесь в командной строке, Ctrl+D завершает сеанс — как команда exit. Если вы внутри какой-то программы (например, python3 или mariadb) — Ctrl+D выходит из неё.

Ctrl+L: быстрая очистка экрана

Когда экран заполнен выводом предыдущих команд и хочется начать с чистого листа — нажмите Ctrl+L. Это аналог команды clear, только быстрее — не нужно ничего набирать.

Копирование и вставка

В обычном приложении Ctrl+C — это «копировать». Но в терминале Ctrl+C — это «прервать команду». Поэтому для копирования и вставки используются другие сочетания.

Терминалов существует много: Windows Terminal, GNOME Terminal, Konsole, xterm и другие. Почти во всех работает одна и та же схема:

Действие Сочетание клавиш
Копировать Ctrl+Shift+C
Вставить Ctrl+Shift+V

Во многих терминалах также работает вставка правым кликом мыши.

Два буфера обмена в Linux

В Linux есть особенность, к которой быстро привыкаешь и без которой потом сложно жить: два независимых буфера обмена.

Основной буфер — работает через Ctrl+Shift+C / Ctrl+Shift+V, как описано выше. Это аналог обычного буфера обмена в Windows.

Буфер выделения (selection buffer) — работает автоматически. Вы выделяете текст мышью — он тут же попадает в буфер. Чтобы вставить — нажимаете среднюю кнопку мыши (колёсико). Никаких дополнительных клавиш.

Два буфера работают независимо. Вы можете скопировать одну строку через Ctrl+Shift+C, выделить мышью другую, и вставить любую из них: Ctrl+Shift+V вставит первую, средняя кнопка мыши — вторую.

На практике буфер выделения используется чаще: увидели нужную строку в логе — выделили мышью, перешли в другое окно — нажали среднюю кнопку. Два движения вместо четырёх.

Примечание. Буфер выделения — это особенность оконной системы X11 в Linux. Он работает, если вы подключаетесь с Linux-машины или используете терминал с поддержкой X11. В Windows Terminal буфер выделения недоступен, но основной буфер работает как обычно.

Перемещение по строке

Набрали длинную команду и заметили ошибку в начале? Не нужно стирать всё. Используйте клавиши:

  • Стрелки влево/вправо — перемещение по одному символу.
  • Ctrl+A — прыжок в начало строки.
  • Ctrl+E — прыжок в конец строки.
  • Ctrl+стрелка влево/вправо — перемещение по словам (работает в большинстве терминалов).

Это работает точно так же, как перемещение курсора в текстовом редакторе, только вместо мыши вы используете клавиатуру.

Ошибки — это нормально

Новички часто боятся ввести «не ту команду» и что-то сломать. Это понятный страх, но на практике сломать что-то серьёзное одной командой сложно — особенно если вы работаете от обычного пользователя, а не от root.

Вот что произойдёт, если вы ошибётесь:

Опечатка в имени команды:

hotsname
-bash: hotsname: command not found

Оболочка просто скажет, что такой команды нет. Ничего не сломается.

Несуществующий файл:

cat /etc/nofile
cat: /etc/nofile: No such file or directory

Ничего страшного — файл не найден, команда завершилась.

Нет прав доступа:

cat /etc/shadow
cat: /etc/shadow: Permission denied

Система не даст вам прочитать файл, к которому у вас нет доступа. Никакого вреда.

Правило. В Linux обычный пользователь не может повредить систему. Самое серьёзное, что может случиться — вы удалите или испортите собственные файлы в домашнем каталоге. Но даже это легко исправить на учебном сервере. Ломайте, экспериментируйте, пробуйте — так учатся все.

Многозадачность: несколько окон

Опытные администраторы часто работают с несколькими сеансами одновременно: в одном окне редактируют конфиг, в другом смотрят логи, в третьем перезапускают сервис.

Самый простой способ — открыть несколько вкладок в терминале. В большинстве терминалов:

  • Ctrl+Shift+T — новая вкладка.
  • Ctrl+Tab или Ctrl+Page Down — переключение между вкладками.

В каждой вкладке откройте отдельное SSH-соединение с сервером. Теперь вы можете одновременно следить за логами и вводить команды:

Вкладка 1:  nano /etc/nginx/conf.d/default.conf
Вкладка 2:  sudo systemctl restart nginx
Вкладка 3:  tail -f /var/log/nginx/error.log

Примечание. Позже, в главе 9, мы познакомимся с программой tmux, которая позволяет делить один экран на несколько панелей прямо на сервере — без открытия дополнительных вкладок.

Итоги

В этой главе вы узнали приёмы, которые делают работу в консоли удобной:

  • Tab — автодополнение команд и путей. Нажимайте после каждых 2–3 букв.
  • Стрелки вверх/вниз — история команд. Не набирайте одно и то же дважды.
  • Ctrl+R — поиск по истории. Находит команду по фрагменту.
  • Ctrl+C — аварийный выход. Прерывает любую команду.
  • Ctrl+L — очистка экрана. Быстрее, чем clear.
  • Ctrl+A / Ctrl+E — прыжок в начало и конец строки.
  • Копирование/вставка — через Ctrl+Shift+C/V, а в Linux ещё и через выделение мышью + среднюю кнопку (два независимых буфера обмена).

Эти приёмы кажутся мелочью, но именно из них складывается ощущение «мне тут удобно». Попробуйте использовать их с самого начала — и вы быстро поймёте, почему администраторы предпочитают консоль.