Жизнь Linux - это не только ls и grep. Конечно, вы, вероятно, использовали эти инструменты, чтобы быстро находить нужные вещи и решать простые проблемы, но это только начало. Большинство дистрибутивов Linux имеют множество встроенных инструментов, которые на первый взгляд легко упустить. Под поверхностью Linux есть некоторые из самых конкретных и кратких программ для выполнения всего, от базовых операций с текстом до сложной инженерии сетевого трафика.

Если вы потратите время на поиск в Google руководств или руководств по освоению Linux, вам будет представлен отличный материал, охватывающий основы. Изучение фундаментальных знаний о том, как перемещаться по командной строке с помощью cd и ls, является обязательным, но вы можете достичь гораздо большего, даже не прибегая к другому стороннему инструменту или языку.

Инженеры могут слишком быстро перейти на язык программирования высокого уровня, если они думают, что что-то не может быть достигнуто с помощью целевых программ и каналов. Конечно, в большинстве случаев переключение на такой язык, как Python, может быть проще и быстрее, но есть что сказать о достижении того же результата без него. Вы убираете огромную зависимость, язык программирования, и сразу получаете более широкий диапазон совместимости. Возможно, вы не сможете гарантировать, что конкретная языковая версия будет доступна в разных системах, с которыми вы взаимодействуете. Кроме того, вы также можете быть ограничены в том, что вы можете установить в этой системе. Научиться работать с собственными инструментами ОС, которые у вас есть, - это острый навык, который вам пригодится.

1. tc

Управление трафиком. Это набор инструментов для управления сетевым трафиком внутри Linux. То, чего вы можете достичь с помощью tc, одновременно впечатляет и вызывает тошноту. Это не для слабонервных, и настройка различных манипуляций с трафиком отнюдь не проста, но научитесь понимать это, и вы сможете использовать всю мощь управления трафиком прямо внутри Linux.

Страница руководства не совсем удобна для пользователя, но не беспокойтесь, потому что есть отличная разбивка с несколькими способами tc можно использовать, доступными в Debian Wiki.

Типичный пример использования tc - применение некоторой задержки пакетов к сетевому соединению. С tc вы можете управлять входящими и исходящими пакетами, чтобы применять такие вещи, как задержка, или даже полностью отбрасывать определенное их количество. Давайте рассмотрим относительно простой пример, в котором мы применяем задержку к нашему собственному сетевому подключению. Сначала давайте посмотрим, как выглядят наши запросы к Google:

pi@raspberry:~ $ 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=117 time=13.6 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=117 time=10.9 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=117 time=15.5 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=117 time=13.8 ms

Не слишком потрепанный. У нас хорошая задержка в 13,5 мс между нами и Google. Что, если бы мы хотели проверить, как приложение будет работать с еще большей задержкой? Нагрузочное тестирование приложений, вызывающее плохие условия в сети, является чрезвычайно распространенной и важной практикой. Если вы не знаете, как ваше приложение будет работать в неоптимальных сетевых условиях, то вы не знаете, как оно будет работать для всех.

Давайте вызовем задержку 100 мс с помощью tc:

sudo tc qdisc add dev eth0 root netem delay 100ms
pi@raspberry:~ $ 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=117 time=110 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=117 time=116 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=117 time=119 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=117 time=113 ms

Потрясающие! Теперь мы можем видеть нашу 100ms задержку поверх существующей задержки для Google. Не забудьте устранить нарушение после завершения тестирования:

sudo tc qdisc del dev eth0 root

2. хлыст

Вы всегда задавались вопросом, как эти симпатичные всплывающие сообщения терминала создавались во время установки? Конечно, с whiptail! Это удобная одноцелевая утилита для отображения диалоговых окон прямо внутри терминала. Возможно, вы заметили тот же стиль, который использовался при установке Ubuntu и других популярных установках из командной строки.

Whiptail широко доступен и входит в состав большинства дистрибутивов для быстрого и легкого использования. Эта утилита имеет широкий спектр различных дисплеев и входов, из которых вы можете выбирать:

  • Окна сообщений
  • Поля ввода текста
  • Поля ввода пароля
  • Да или нет выбора
  • Контрольные списки
  • … и более!

Давайте попробуем отобразить простое поле ввода «да» или «нет» в командной строке с помощью whiptail:

whiptail --yesno "would you like to continue?" 10 40

Использование whiptail с опцией --yesno невероятно просто и понятно. Вы передаете желаемый тип отображения, сообщение, а затем размер поля для рисования на экране. Ваш результат должен выглядеть примерно так:

Чтобы увидеть возвращаемое значение при нажатии кнопки «Да» или «Нет», вы можете отобразить результат последней команды запуска в консоли. Если вы просто наберете echo $?, то увидите либо 0 для «да», либо 1 для «нет». Это можно легко включить в сценарий оболочки, используя пример, подобный приведенному ниже:

#!/bin/bash
whiptail --yesno "would you like to continue?" 10 40
RESULT=$?
if [ $RESULT = 0 ]; then
  echo "you clicked yes"
else
  echo "you clicked no"
fi

3. измельчить

Когда вы в последний раз удаляли файл в Linux? Как ты сделал это? Вы использовали rm, а потом забыли об этом? Если в этом файле были какие-либо конфиденциальные данные, вы можете дважды подумать, прежде чем использовать rm для такого рода вещей. Вот тут-то и пригодится shred. Эта небольшая утилита на самом деле безопасно стирает файл, многократно записывая случайные данные поверх файла.

Используя rm для удаления файла, вы действительно удаляете только «ссылку» или ссылку на файл, о котором знает ОС. Конечно, файл исчезнет, ​​и вы больше не сможете его увидеть, но необработанные данные все еще существуют на жестком диске системы в течение определенного периода времени. Такие данные можно восстановить с помощью тщательной судебной экспертизы. Используя shred, вы можете быть уверены, что данные будут удалены в максимально возможной степени (разумеется, без сжигания компьютера).

Посетите wiki на shred, чтобы узнать больше о том, как это работает.

В следующий раз, когда вы захотите убедиться, что файл был безопасно удален, выполните следующую команду (флаг -u удаляет сам файл, а не просто перезаписывает его):

shred -u <file>

4. разделить

Просто, эффективно и даже более гибко, чем команда вашего высокоуровневого языка программирования с таким же названием. Разделите файл по любому количеству различных характеристик, от количества строк до длины в байтах. С split вы получаете больше гибкости, чем просто возможность разбивать строки или разрывы строк.

Давайте посмотрим, как можно разбить файл, содержащий четыре строки. Скажем, мы хотим разбить наш файл после определенного количества строк; 2 в данном случае. Мы будем использовать echo для создания нашего тестового файла, а затем split выполнит все остальное:

echo -e "line1\nline2\nline3\nline4" > test_file
split --lines 2 ./test_file test_file_split_
cat test_file_split_aa && cat test_file_split_ab

В этом случае мы создали два новых файла из исходного входного файла. Команда split позволяет вам применять префиксное имя к вновь созданным файлам, что мы и сделали с последним аргументом команды. Новые разделенные файлы содержат суффиксы aa и ab, чтобы все было понятно.

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

5. nl

Когда-нибудь смотрел файл журнала, наш другой простой текстовый вывод, и думал:

«Разве это не здорово с номерами строк?»

Нумерация строк упрощает чтение и упрощает запоминание вашего места или указание на конкретный раздел. В соответствии с «стилем Linux», существует специальная утилита именно для этого. Используя nl, вы можете буквально пронумеровать строки. Принятие текста на stdin дает тот же результат, но с номерами строк. Проверить это:

echo -e "one\ntwo\nthree"
one
two
three
echo -e "one\ntwo\nthree" | nl
     1 one
     2 two
     3 three

Вы даже можете внести небольшие изменения в поля нумерации и разделитель, если предпочитаете другой формат:

echo -e "one\ntwo\nthree" | nl -s ": " -w 1
1: one
2: two
3: three

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

cat <file> | nl

Если вам нравится использовать less для просмотра больших файлов, вы также можете просто передать аргумент -N при открытии файла, чтобы автоматически получить доступ к номерам строк. Это позволяет избежать накладных расходов, связанных с фактическими манипуляциями с необработанным файлом и применением номеров строк, поскольку less не загружает сразу весь файл.

6. стадо

Замки. Любите их или ненавидьте, в какой-то момент вам придется иметь дело с замками. Концепция блокировки довольно проста. Если вам нужно выполнить какую-либо операцию в каком-то состоянии, к которому другие процессы могут иметь доступ, тогда ваша операция должна «заблокировать» все другие действия до тех пор, пока она не будет завершена. В некоторых случаях это обрабатывается автоматически, в других вам необходимо установить простую систему блокировок, чтобы гарантировать отсутствие условий гонки.

Используя flock, вы можете создавать различные типы блокировок, которые могут быть получены во время параллельных операций. Сама блокировка - это просто файл в Linux. Давайте посмотрим, как мы можем использовать блокировку, чтобы предотвратить взаимодействие нескольких процессов с файлом:

LOCKFILE=/tmp/lockfile
already_locked() {
  echo "lock is already held, exiting"
  exit 1
}
exec 200>$LOCKFILE
flock -n 200 || already_locked 
echo "lock obtained, proceeding"
sleep 10
echo "releasing lock, done"

Если вы запустите этот сценарий оболочки, он попытается получить блокировку для файла /tmp/lockfile, назначив ему файловый дескриптор 200 и затем используя «неблокирующий» тип блокировки. Когда вы используете этот тип стиля блокировки, если блокировка уже была получена, все другие попытки получить ее будут терпеть неудачу, вместо того, чтобы ждать ее.

Попробуйте запустить сценарий (который будет спать 10 секунд) в одном окне, а затем в другом окне, попробуйте запустить второй его экземпляр. Вы заметите, что первый прогон получает блокировку, а второй не удается, потому что блокировка уже была получена. В этом примере вы можете заменить простую команду sleep на набор долго выполняющихся команд обработки данных или обновления файлов, которые вы хотите защитить.

Спасибо за внимание! Под поверхностью Linux скрывается море удивительных утилит, находящихся в вашем распоряжении. Узнать больше о том, как можно использовать возможности этих собственных программ, весело, и это заставляет вас критически относиться к цели и эффективности каждой отдельной программы. В следующий раз, когда вы захотите изучить то, что доступно, просто ls /usr/bin и начните изучение.