Как отлаживать bash-script-ы по шагам
Мне всегда хотелось иметь возможность отлаживать bash-scripts так же, как и любой другой код, т.е. по шагам, и bash такую возможность предусмотрел, но о ней не все знают. Несмотря на довольно большой опыт использования Linux, я дошёл до неё только недавно.
Волшебная строчка, которую нужно добавить после
Процесс отладки
Запускаем скрипт, перед выполнением каждой команды выводится то, что будет исполняться, затем интерпретатор начинает ожидать нажатия клавиши <ENTER>.
Если понимаем, что что-то пошло не так, нажимаем
Ингредиенты
команда trap, которая умеет перехватывать разные сигналы и в нашем случае она перехватывает сигнал DEBUG, посылаемый перед выполнением команды
команда read, которая умеет ожидать ввода чего-нибудь с клавиатуры (в данном случае нам нужно только либо ENTER либо
переменная окружения $BASH_COMMAND, валидная внутри обработчика команды trap.
Мне всегда хотелось иметь возможность отлаживать bash-scripts так же, как и любой другой код, т.е. по шагам, и bash такую возможность предусмотрел, но о ней не все знают. Несмотря на довольно большой опыт использования Linux, я дошёл до неё только недавно.
Волшебная строчка, которую нужно добавить после
#!/bin/bash
, чтоб скрипт можно было отлаживать по шагам#!/bin/bash
trap 'echo "# $BASH_COMMAND";read' DEBUG
echo line1
echo line2
echo line3
Процесс отладки
Запускаем скрипт, перед выполнением каждой команды выводится то, что будет исполняться, затем интерпретатор начинает ожидать нажатия клавиши <ENTER>.
Если понимаем, что что-то пошло не так, нажимаем
Ctrl+C
и выходим из отладки.Ингредиенты
команда trap, которая умеет перехватывать разные сигналы и в нашем случае она перехватывает сигнал DEBUG, посылаемый перед выполнением команды
команда read, которая умеет ожидать ввода чего-нибудь с клавиатуры (в данном случае нам нужно только либо ENTER либо
Ctrl+C
переменная окружения $BASH_COMMAND, валидная внутри обработчика команды trap.
# Online Bash Shell.
# Code, Compile, Run and Debug Bash script online.
# Write your code in this editor and press "Run" button to execute it.
trap 'echo "# $BASH_COMMAND";read' DEBUG
echo line1
echo line2
echo line3
echo "Hello World";
❤2
Bashtop
Линуксовый менеджер ресурсов, который показывает статистику по загруженности процессора, оперативной памяти, жесткого диска и сети
https://github.com/aristocratos/bashtop
Линуксовый менеджер ресурсов, который показывает статистику по загруженности процессора, оперативной памяти, жесткого диска и сети
https://github.com/aristocratos/bashtop
👍1
Регулярное выражение
Регулярное выражение - это шаблон, сопоставляемый с искомой строкой слева направо. Термин «Регулярное выражение» сложно произносить каждый раз, поэтому, обычно, вы будете сталкиваться с сокращениями "регэкспы" или "регулярки". Регулярные выражения используются для замен текста внутри строк, валидации форм, извлечений подстрок по определенным шаблонам и множества других вещей.
https://github.com/zevilz/learn-regex/blob/master/translations/README-ru.md
Регулярное выражение - это шаблон, сопоставляемый с искомой строкой слева направо. Термин «Регулярное выражение» сложно произносить каждый раз, поэтому, обычно, вы будете сталкиваться с сокращениями "регэкспы" или "регулярки". Регулярные выражения используются для замен текста внутри строк, валидации форм, извлечений подстрок по определенным шаблонам и множества других вещей.
https://github.com/zevilz/learn-regex/blob/master/translations/README-ru.md
Примеры скриптов для Mikrotik
Проверка изменения IP-адреса интерфейса для Mikrotik
Иногда провайдер выдает динамические IP-адреса. Этот скрипт проверит, не изменился ли динамический IP-адрес.
Netmask
Этот скрипт полезен, если вам нужен ip-адрес без netmask (например, чтобы использовать его в брандмауэре), а "/ip address get [id] address" возвращает ip-адрес и netmask.
Резолвим имя хоста
Многие пользователи спрашивают, как использовать dns-имена вместо IP-адресов для серверов radius, правил брандмауэра и т. д.
Вот пример того, как резовлить IP-адрес сервера RADIUS.
Допустим, у нас настроен сервер radius:
А вот скрипт, который резовлит ip-адрес, сравнит ip с настроенным и заменит, если они не равны:
Добавьте этот скрипт в планировщик, чтобы он выполнялся, например, каждые 5 минут
Проверка изменения IP-адреса интерфейса для Mikrotik
Иногда провайдер выдает динамические IP-адреса. Этот скрипт проверит, не изменился ли динамический IP-адрес.
:global currentIP;
:local newIP [/ip address get [find interface="ether1"] address];
:if ($newIP != $currentIP) do={
:put "ip address $currentIP changed to $newIP";
:set currentIP $newIP;
}
Netmask
Этот скрипт полезен, если вам нужен ip-адрес без netmask (например, чтобы использовать его в брандмауэре), а "/ip address get [id] address" возвращает ip-адрес и netmask.
:global ipaddress 10.1.101.1/24
:for i from=( [:len $ipaddress] - 1) to=0 do={
:if ( [:pick $ipaddress $i] = "/") do={
:put [:pick $ipaddress 0 $i]
}
}
Резолвим имя хоста
Многие пользователи спрашивают, как использовать dns-имена вместо IP-адресов для серверов radius, правил брандмауэра и т. д.
Вот пример того, как резовлить IP-адрес сервера RADIUS.
Допустим, у нас настроен сервер radius:
/radius
add address=3.4.5.6 comment=myRad
А вот скрипт, который резовлит ip-адрес, сравнит ip с настроенным и заменит, если они не равны:
/system script add name="resolver" source= {
:local resolvedIP [:resolve "server.example.com"];
:local radiusID [/radius find comment="myRad"];
:local currentIP [/radius get $radiusID address];
:if ($resolvedIP != $currentIP) do={
/radius set $radiusID address=$resolvedIP;
/log info "radius ip updated";
}
}
Добавьте этот скрипт в планировщик, чтобы он выполнялся, например, каждые 5 минут
/system scheduler add name=resolveRadiusIP on-event="resolver" interval=5m
Хорошая статья, описывающая различные методы усиления защиты машины с Linux. (
Linux не является безопасной операционной системой. Однако есть шаги, которые можно предпринять для ее улучшения. Цель этого руководства - объяснить, как максимально усилить Linux для обеспечения безопасности и конфиденциальности. Руководство не зависит от дистрибутива и не привязано к какому-либо конкретному.
https://madaidans-insecurities.github.io/guides/linux-hardening.html
Eng ver
)Linux не является безопасной операционной системой. Однако есть шаги, которые можно предпринять для ее улучшения. Цель этого руководства - объяснить, как максимально усилить Linux для обеспечения безопасности и конфиденциальности. Руководство не зависит от дистрибутива и не привязано к какому-либо конкретному.
https://madaidans-insecurities.github.io/guides/linux-hardening.html
Как провести Тех. обслуживание сервера с уведомлением пользователей?
Для начала создаем пустой файл
Переходим к уведомлениям, возможно кто-то в данный момент работает в терминале.
Воспользуемся утилитой wall.
Wall — утилита командной строки, которая отображает сообщение на терминалах всех вошедших в систему пользователей.
Запускаем команду:
Все кто подключен к серверу, получают сообщение:
И неважно что делает человек и где находится, сообщение появится у него на экране. Через wall можно спамить определенным группам пользователей.
В указанное время запускаем ассасина:
Выгнали всех с сервера, кроме root’а и проводим технические работы, удаляем /etc/nologin.
Wall можно заменить например на такое:
Но тут сообщение уйдет конкретному пользователю user. Конечно, если по какой-то причине, в системе отсутствует wall, можно и через цикл выгрести всех юзеров и через echo отправить им уведомление.
write - утилита, позволяющая отправить сообщение другому пользователю, который имеет сессию в этой же системе.
Или так:
Для начала создаем пустой файл
/etc/nologin
. Включаем возможность заходить под root
. Теперь только root
сможет авторизоваться по ssh
. Переходим к уведомлениям, возможно кто-то в данный момент работает в терминале.
Воспользуемся утилитой wall.
Wall — утилита командной строки, которая отображает сообщение на терминалах всех вошедших в систему пользователей.
Запускаем команду:
wall "... текст сообщения ..."
Все кто подключен к серверу, получают сообщение:
... текст сообщения ...
И неважно что делает человек и где находится, сообщение появится у него на экране. Через wall можно спамить определенным группам пользователей.
В указанное время запускаем ассасина:
pkill -9 -u `who | awk '{print $1}'| grep -v root|head -1
Выгнали всех с сервера, кроме root’а и проводим технические работы, удаляем /etc/nologin.
Wall можно заменить например на такое:
echo "какой-то текст" | write user
Но тут сообщение уйдет конкретному пользователю user. Конечно, если по какой-то причине, в системе отсутствует wall, можно и через цикл выгрести всех юзеров и через echo отправить им уведомление.
write - утилита, позволяющая отправить сообщение другому пользователю, который имеет сессию в этой же системе.
Или так:
echo "какой-то текст" > /dev/pts/1
❤2👍2
Полезные команды Linux. Другие полезные команды
#
Создать псевдоним hh для команды history
#
Вывод комманд, так или иначе относящихся к ключевым словам. Полезно, когда вы знаете что делает программа, но не помните команду
#
Изменить системную оболочку пользователя
#
Шифрует файл file1 с помощью GNU Privacy Guard
#
Дешифрует файл file1 с помощью GNU Privacy Guard
#
Список библиотек, используемых программой ssh
#
Ввывод страниц руководства по работе с программой, в данном случае, ping
#
Создаёт загрузочный флоппи-диск
#
Рекурсивно загружает содержимое сайта www.example.com
#
Загрузить файл www.example.com/file.iso с возможностью остановки и докачки
#
Включить закачку в определенное время
#
Вывести описание действий указанной программы
#
Вывести список залогиненных пользователей, время последней загрузки системы и прочую полезную информацию
#
alias hh='history'
Создать псевдоним hh для команды history
#
apropos ...keyword
Вывод комманд, так или иначе относящихся к ключевым словам. Полезно, когда вы знаете что делает программа, но не помните команду
#
chsh
Изменить системную оболочку пользователя
#
gpg -c file1
Шифрует файл file1 с помощью GNU Privacy Guard
#
gpg file1.gpg
Дешифрует файл file1 с помощью GNU Privacy Guard
#
ldd /usr/bin/ssh
Список библиотек, используемых программой ssh
#
man ping
Ввывод страниц руководства по работе с программой, в данном случае, ping
#
mkbootdisk --device /dev/fd0 `uname -r`
Создаёт загрузочный флоппи-диск
#
wget -r www.example.com
Рекурсивно загружает содержимое сайта www.example.com
#
wget -c www.example.com/file.iso
Загрузить файл www.example.com/file.iso с возможностью остановки и докачки
#
echo 'wget -c www.example.com/files.iso' | at 09:00
Включить закачку в определенное время
#
whatis ...keyword
Вывести описание действий указанной программы
#
who -a
Вывести список залогиненных пользователей, время последней загрузки системы и прочую полезную информацию
👍1
Как определить DNS в контейнерах Docker
Когда вы развертываете контейнер в сети, если он не может найти DNS-сервер, определенный в файле /etc/resolv.conf, по умолчанию он будет использовать DNS, настроенный для хоста.
Это может быть хорошо и удобно для определенных ситуаций.
Но что если (возможно, по соображениям безопасности) вы не хотите, чтобы ваши контейнеры использовали тот же DNS, что и хосты.
https://telegra.ph/Kak-opredelit-DNS-v-kontejnerah-Docker-09-26
Когда вы развертываете контейнер в сети, если он не может найти DNS-сервер, определенный в файле /etc/resolv.conf, по умолчанию он будет использовать DNS, настроенный для хоста.
Это может быть хорошо и удобно для определенных ситуаций.
Но что если (возможно, по соображениям безопасности) вы не хотите, чтобы ваши контейнеры использовали тот же DNS, что и хосты.
https://telegra.ph/Kak-opredelit-DNS-v-kontejnerah-Docker-09-26
❤1
💡 Консольный калькулятор Linux
Надо что-то вычислить, а под рукой только консоль? Воспользуйтесь встроенным калькулятором - командой
Пользоваться ею просто. Например, сложение:
Надо что-то вычислить, а под рукой только консоль? Воспользуйтесь встроенным калькулятором - командой
expr
.Пользоваться ею просто. Например, сложение:
expr 2 + 2
Вычитание:expr 12 - 2
Знаки умножения и деления нужно дополнительно экранировать:expr 5 \* 4
expr 36 \/ 4
Можно использовать скобки, но их также нужно экранировать и отделить пробелами от знаков операций и операндов:expr 12 - \( 2 + 2 \)
Чтобы узнать больше возможностей команды запустите ее с ключом —help
👍2❤1
Голый Линукс — запуск ядра-одиночки
Итак, Linux - не операционная система, а только ядро для неё. Всё остальное приходит от проекта GNU (и других). И вот интересно - на что годится ядро само по себе?
Эта статья - очень "начального" уровня. Устроим маленький эксперимент - создадим чистую виртуальную машину и попробуем запустить ядро Linux "без всего". Или почти "без", т.к. нам понадобится загрузчик ОС - и какая-нибудь "пользовательская программа" (её мы сотворим сами). Конечно, продвинутые пользователи Linux такой "эксперимент" могут провести просто отредактировав параметры запуска при включении - но наш рассказ всё же для тех кто почти (или совсем) не в теме :)
Бонусом чуть-чуть коснёмся системных вызовов и пару слов скажем о других ядрах.
https://habr.com/ru/articles/855804/
Итак, Linux - не операционная система, а только ядро для неё. Всё остальное приходит от проекта GNU (и других). И вот интересно - на что годится ядро само по себе?
Эта статья - очень "начального" уровня. Устроим маленький эксперимент - создадим чистую виртуальную машину и попробуем запустить ядро Linux "без всего". Или почти "без", т.к. нам понадобится загрузчик ОС - и какая-нибудь "пользовательская программа" (её мы сотворим сами). Конечно, продвинутые пользователи Linux такой "эксперимент" могут провести просто отредактировав параметры запуска при включении - но наш рассказ всё же для тех кто почти (или совсем) не в теме :)
Бонусом чуть-чуть коснёмся системных вызовов и пару слов скажем о других ядрах.
https://habr.com/ru/articles/855804/
👍4❤1
Работа с пользователями в командной строке Windows (net user)
Вот справка по замечательной программе net, точнее по её работе с пользователями: net user. Иногда, например нужно активировать учётную запись гостя или администратора в Windows 10 на клиентском ПК. Тогда короткая и удобная для запоминания Windows net user Гость /active:yes может быть удобнее других способов.
https://telegra.ph/Rabota-s-polzovatelyami-v-komandnoj-stroke-Windows-net-user-09-26
Вот справка по замечательной программе net, точнее по её работе с пользователями: net user. Иногда, например нужно активировать учётную запись гостя или администратора в Windows 10 на клиентском ПК. Тогда короткая и удобная для запоминания Windows net user Гость /active:yes может быть удобнее других способов.
https://telegra.ph/Rabota-s-polzovatelyami-v-komandnoj-stroke-Windows-net-user-09-26
Частые ошибки программирования на Bash
Качество скриптов, используемых для автоматизации и оптимизации работы системы, является залогом ее стабильности и долголетия, а также сохраняет время и нервы администратора этой системы. Несмотря на кажущуюся примитивность bash как языка программирования, он полон подводных камней и хитрых течений, способных значительно подпортить настроение как разработчику, так и администратору.
Большинство имеющихся руководств посвящено тому, как надо писать. Я же расскажу о том, как писать НЕ надо :-)
Данный текст является вольным переводом вики-страницы «Bash pitfalls» по состоянию на 13 декабря 2008 года. В силу викиобразности исходника, этот перевод может отличаться от оригинала. Поскольку объем текста слишком велик для публикации целиком, он будет публиковаться частями.
1. for i in
Одна из наиболее часто встречающихся ошибок в bash-скриптах — это циклы типа такого:
Это не сработает, если в названии одного из файлов присутствуют пробелы, т.к. результат подстановки команды ls *.mp3 подвергается разбиению на слова. Предположим, что у нас в текущей директории есть файл 01 - Don't Eat the Yellow Snow.mp3. Цикл for пройдётся по каждому слову из названия файла и $i примет значения: "01", "-", "Don't", "Eat", "the", "Yellow", "Snow.mp3".
Заключить всю команду в кавычки тоже не получится:
https://habr.com/ru/articles/47706/
Качество скриптов, используемых для автоматизации и оптимизации работы системы, является залогом ее стабильности и долголетия, а также сохраняет время и нервы администратора этой системы. Несмотря на кажущуюся примитивность bash как языка программирования, он полон подводных камней и хитрых течений, способных значительно подпортить настроение как разработчику, так и администратору.
Большинство имеющихся руководств посвящено тому, как надо писать. Я же расскажу о том, как писать НЕ надо :-)
Данный текст является вольным переводом вики-страницы «Bash pitfalls» по состоянию на 13 декабря 2008 года. В силу викиобразности исходника, этот перевод может отличаться от оригинала. Поскольку объем текста слишком велик для публикации целиком, он будет публиковаться частями.
1. for i in
ls *.mp3
Одна из наиболее часто встречающихся ошибок в bash-скриптах — это циклы типа такого:
for i in `ls *.mp3`; do # Неверно!
some command $i # Неверно!
done
Это не сработает, если в названии одного из файлов присутствуют пробелы, т.к. результат подстановки команды ls *.mp3 подвергается разбиению на слова. Предположим, что у нас в текущей директории есть файл 01 - Don't Eat the Yellow Snow.mp3. Цикл for пройдётся по каждому слову из названия файла и $i примет значения: "01", "-", "Don't", "Eat", "the", "Yellow", "Snow.mp3".
Заключить всю команду в кавычки тоже не получится:
for i in "`ls *.mp3`"; do # Неверно!
...
https://habr.com/ru/articles/47706/
❤2
GoAccess - это реал тайм анализатор веб логов и интерактивная программа просмотра с открытым исходным кодом, который запускается в терминале в системах * nix или через ваш браузер.
Demo
https://rt.goaccess.io/?20210208192039
Github
https://github.com/allinurl/goaccess
Demo
https://rt.goaccess.io/?20210208192039
Github
https://github.com/allinurl/goaccess
👍2
Сетевые политики на защите рабочих нагрузок в кластере Kubernetes
В кластере Kubernetes нам доступен любой сервис в любом пространстве имён, то есть по умолчанию pod открыт для любого трафика.
Мы можем определить сетевую политику для пространства имён или pod’а, чтобы защитить рабочие нагрузки в кластере. Например, разделить рабочие нагрузки в мультитенантном кластере по проектам, командам или организациям.
Rus https://habr.com/ru/company/southbridge/blog/718262/
Eng https://medium.com/geekculture/network-policy-to-secure-workloads-on-kubernetes-cluster-99017698c748
В кластере Kubernetes нам доступен любой сервис в любом пространстве имён, то есть по умолчанию pod открыт для любого трафика.
Мы можем определить сетевую политику для пространства имён или pod’а, чтобы защитить рабочие нагрузки в кластере. Например, разделить рабочие нагрузки в мультитенантном кластере по проектам, командам или организациям.
Rus https://habr.com/ru/company/southbridge/blog/718262/
Eng https://medium.com/geekculture/network-policy-to-secure-workloads-on-kubernetes-cluster-99017698c748
👍2