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

Клиенты это обычные пользователи, которые заходят по 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 кстати можно спамить определенным группам пользователей.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Ну все, ответственность с себя сняли. В 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]*, но чет не проканало, заорала как потерпевшая. Ну это всё костыли, в общем неважно.

Ладно, хорошо тебе провести остаток выходного, увидимся завтра.