Перейти к содержанию

Надёжные Bash-сценарии на НАЙС.ОС

Bash удобен для автоматизации диагностики, обслуживания и периодических операций. Для производственного сценария важнее проверяемость и предсказуемость, чем число сокращённых команд.

Простой сценарий диагностики

Создайте собственный файл check-niceos.sh:

#!/usr/bin/env bash
set -Eeuo pipefail

printf 'OS: '
. /etc/os-release
printf '%s %s\n' "${NAME:-unknown}" "${VERSION_ID:-unknown}"
printf 'Kernel: '
uname -r
printf '\nInterfaces:\n'
ip -br link
printf '\nRoutes:\n'
ip -4 route
printf '\nFailed units:\n'
systemctl --failed --no-pager

Проверьте синтаксис и выполните:

bash -n check-niceos.sh
bash check-niceos.sh

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

Что делает set -Eeuo pipefail

  • -e завершает сценарий при некоторых необработанных ошибках (не во всех конструкциях Bash).
  • -E сохраняет ERR-trap в функциях и подкомандах, если trap установлен.
  • -u считает обращение к неопределённой переменной ошибкой.
  • pipefail возвращает ошибку, если часть конвейера завершилась неуспешно.

Эти параметры не заменяют обработку ошибок, особенно в if, &&, ||, конвейерах и подстановках команд. Проверяйте критические этапы явно.

Правила оформления

  1. Цитируйте значения переменных: "$file", "$interface".
  2. Применяйте mktemp для временных файлов и чистите их через trap.
  3. Не храните пароли в аргументах команд и в shell history.
  4. Проверяйте зависимость через command -v, прежде чем запускать необязательный инструмент.
  5. Для редактирования firewall/сети сначала считывайте текущую конфигурацию, готовьте откат и журналируйте изменения.
  6. Для systemd-службы лучше написать собственный unit, чем оставлять долгоживущий процесс внутри SSH-сеанса.

Сценарий и права root

Не запускайте весь сценарий с полномочиями root, если только несколько его шагов требуют прав администратора. Сводите объём привилегий к минимуму и проверяйте пути файлов, которые создаёт или удаляет скрипт.

Для автоматизации в НАЙС.ОС удобны systemd service/timer (см. руководство systemd).