Сервер редко принадлежит одному человеку. На нем сидят коллеги по ssh, крутятся фоновые сессии, кто-то именно сейчас редактирует конфиг в vim. Если вы молча перезагрузите машину, вы потеряете чужую работу и доверие. Этот урок про то, как культурно сообщать людям важное: показывать баннер до входа, выводить приветствие после входа, рассылать срочные сообщения на все терминалы и корректно гасить систему с предупреждением и таймером, давая всем шанс сохраниться и выйти.

Как это работает
Есть три точки, где система может что-то сказать пользователю. Первая - текст ДО аутентификации. Его показывают программы, обслуживающие вход с терминала: agetty печатает содержимое /etc/issue над приглашением login на локальных консолях (tty), а sshd при сетевом входе может показать /etc/issue.net. Сюда пишут предупреждения вроде запрета несанкционированного доступа. Важно: для графического входа (GDM на Wayland) эти файлы не работают - там баннер настраивается отдельно в самом дисплейном менеджере.
Вторая точка - текст ПОСЛЕ успешного входа. Этим занимается PAM-модуль pam_motd: при логине он выводит /etc/motd (message of the day). Сам файл статичен, но в Debian и Ubuntu давно используют динамический motd - каталог /etc/update-motd.d/ с исполняемыми скриптами. pam_motd запускает их по порядку имен и склеивает вывод. Так на экран попадают свежие данные: загрузка, обновления, число пакетов к установке.
Третья точка - сообщения работающим пользователям прямо сейчас. Команда wall (write all) шлет текст на терминалы всех залогиненных. Она не спрашивает разрешения у получателя на системные сообщения, но обычный пользователь не достучится до тех, кто закрыл прием командой mesg n. От root доходит почти всегда.
Отдельная тема - остановка системы. В 2026 за shutdown, reboot и halt отвечает systemd: эти команды лишь просят systemd-logind перевести машину в нужное состояние. logind аккуратно завершает сессии, отправляет процессам SIGTERM, ждет, потом SIGKILL, размонтирует ФС. Перед этим он рассылает через wall предупреждение всем сессиям, чтобы люди успели среагировать. Принцип простой: дать таймер, объяснить причину, дать возможность отменить.
Команды и примеры
Баннер до входа и приветствие после. issue поддерживает спецсимволы agetty: \n - имя хоста, \l - номер tty, \d \t - дата и время.
Код: Выделить всё
# /etc/issue (локальная консоль, до логина)
Cyberlake node \n (\l) - доступ только для авторизованных лиц
Дата: \d \t
# /etc/issue.net (сетевой вход по ssh) - спецсимволы НЕ раскрываются
Authorized access only. All activity is logged.
Код: Выделить всё
Banner /etc/issue.net
# затем:
systemctl reload sshd # Debian/Ubuntu и RHEL/Fedora одинаково
Код: Выделить всё
echo "Плановое обслуживание в субботу 02:00-03:00 MSK" > /etc/motd
Код: Выделить всё
cat > /etc/update-motd.d/50-cyberlake <<'EOF'
#!/bin/sh
printf "Uptime:%s\n" "$(uptime -p)"
printf "Свободно на /: %s\n" "$(df -h / | awk 'NR==2{print $4}')"
EOF
chmod +x /etc/update-motd.d/50-cyberlake
run-parts /etc/update-motd.d/ # проверить вывод вручную
Рассылка всем сейчас:
Код: Выделить всё
wall "Перезагружаю шлюз через 5 минут, сохранитесь"
wall -g developers "Деплой через 10 минут" # только группе
echo "Текст из файла" | wall # из stdin
Код: Выделить всё
# через 10 минут, с причиной
shutdown -r +10 "Обновление ядра, перезагрузка в 23:40"
# к конкретному времени (формат ЧЧ:ММ)
shutdown -h 23:30 "Ночное обслуживание"
# отменить уже запланированное
shutdown -c
# разослать предупреждение, НО не выключать (только выгнать = заблокировать новые входы)
shutdown -k +5 "Технические работы, не входите"
Код: Выделить всё
systemctl reboot
systemctl poweroff
systemctl halt
Частые грабли
- Спецсимволы вроде \n работают в /etc/issue (его раскрывает agetty), но в /etc/issue.net их обычно не раскрывают - туда пишите готовый текст без escape-кодов.
- Поправили issue.net, а баннера нет - в sshd_config не задан Banner либо забыли reload sshd. Сама правка файла ничего не включает.
- Скрипт в /etc/update-motd.d/ не исполняемый (нет chmod +x) или с ошибкой в шебанге - молча пропускается, motd пустеет.
- Лишний вывод motd при ssh раздражает - дело в двойном источнике: статический /etc/motd плюс динамика. Чистите оба или отключайте PrintMotd в sshd, чтобы не дублировалось с pam_motd.
- shutdown без указания времени в старых скриптах подразумевает +1, а не now - можно нарваться на неожиданную минуту ожидания. Всегда указывайте время явно.
- Запланировали shutdown -r +30 и ушли - отменить можно только shutdown -c с той же машины; перезагрузка самого процесса не спасет, задание держит systemd.
- wall с дефисами и кавычками из буфера может притащить не-ASCII символы, которые на чужом терминале превратятся в кашу. Пишите простой текст.
- Допишите в /etc/issue строку с предупреждением и спецсимволами \n и \l. Откройте локальную консоль (Alt+F2) и убедитесь, что баннер виден до логина.
- Заполните /etc/issue.net, добавьте Banner /etc/issue.net в sshd_config, выполните systemctl reload sshd и зайдите по ssh - проверьте баннер.
- Создайте скрипт /etc/update-motd.d/60-test, выводящий uptime, сделайте его исполняемым и проверьте вывод через run-parts (или просто перелогиньтесь по ssh).
- Откройте вторую сессию под другим пользователем. Из первой выполните wall с любым сообщением и убедитесь, что оно пришло во вторую.
- Запланируйте shutdown -r +15 "тест" и проверьте, что предупреждение разослалось. Затем отмените его командой shutdown -c.
- Сравните поведение: systemctl reboot против shutdown -r +5 "причина" - отметьте, кто рассылает предупреждение, а кто нет.
- Какая программа выводит /etc/issue на локальной консоли и в какой момент относительно ввода логина?
- Чем /etc/issue отличается от /etc/issue.net по содержимому и по тому, кто его показывает?
- Какой PAM-модуль отвечает за вывод motd и как реализован динамический motd в Debian/Ubuntu и в RHEL?
- Как командой shutdown отменить ранее запланированную остановку и как заблокировать новые входы без выключения?
- Почему shutdown с текстом и таймером предпочтительнее systemctl poweroff на сервере с пользователями?
- Как отправить сообщение через wall только определенной группе и доходит ли оно до пользователей с mesg n?