Найти в Дзене
BASH DAYS | Linux Factory

Как правильно провести профилактические работы на сервере

Закрываем сессии клиентов, шлем в терминалы сообщение о работах. Разрешаем подключение по ssh только root пользователю.

Надо было тут провести экстренные технические работы на сервере. Сервер публичный и смотрит в интернет.

Клиенты это обычные пользователи, которые заходят по ssh и пытаются на практике изучать bash и linux. Короче студенты какого-то крупного ВУЗа, а сервер выступает подопытным стендом для всяких лабораторных работ.

Клиентов много(человек 800) предупредить о технических работах нет никакой возможности. А если бы и была, то 99% не увидят электронных писем с важной информацией и начнут писать в саппорт.

Задача вроде тривиальная, но нужно было предварительно завершить все сессии + не разрешать повторно подключить. Ну и естественно каким-то образом выслать уведомление всем тем, кого выкинули в моменте.

На самом деле тут все просто. Создаем пустой файл /etc/nologin. Теперь только root сможет авторизоваться по ssh. Да, предварительно нужно разрешить вообще заходить под root’ом.

Часть задачи решили. Теперь нужно уведомить бедолаг, которые в данный момент что-то делают в терминале. Пусть сохраняют свои поделки и отправляются на заслуженный отдых.

Для этого воспользуемся утилитой wall.

Wall — утилита командной строки, которая отображает сообщение на терминалах всех вошедших в систему пользователей.

Запускаем команду:

wall "Быстренько сохраняемся и прыгаем с сервера. В 10:15 сервер всё"

Все кто был подключен к серверу, получают сообщение:

Broadcast message from root@dev (pts/0) (Sun Dec 17 11:38:21 2023):
Быстренько сохраняемся и прыгаем с сервера. В 10:15 сервер всё.


И неважно что делает человек и где находится, сообщение появится у него на экране. Через wall кстати можно делать рассылки определенным группам пользователей.

Ну все, ответственность с себя сняли. В 10:15 запускаем ассасина:

pkill -9 -u `who | awk '{print $1}'| grep -v root|head -1

Вот так вот грубо мы выгнали всех с сервера, кроме root’а. Все, спокойно проводим технические работы, удаляем /etc/nologin и радуемся какие мы молодцы.

Wall можно заменить например на такое:

echo "Hello from BashDays" | write user

Но тут сообщение уйдет конкретному пользователю user. Конечно если по какой-то причине отсутствует wall в системе, можно и через цикл выбрать всех юзеров и через echo скормить им уведомление.

write - утилита, позволяющая отправить сообщение другому пользователю, который имеет сессию в этой же системе.

Ну либо так:

echo "Hello from BashDays" > /dev/pts/1

Пытался сделать так /dev/pts/[0-9]*, но чет не прошло, орет как потерпевшая. Ну это всё костыли, в общем неважно.

Конец, увидимся!

Рекомендую к прочтению: