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



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



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



tags: #bash #linux #utils



💩 @bashdays