Другое

Как отправить сообщение всем пользователям в Linux

Полное руководство по отправке сообщений всем пользователям в сети Linux. Локальные и сетевые инструменты, графические диалоги с кнопками да/нет, практические примеры реализации.

Как отправить сообщение всем пользователям в сети Linux?

Какие инструменты можно использовать для отображения сообщений на экране удаленных пользователей в Linux? Идеально было бы найти решение с графическим интерфейсом, которое позволяет задать вопрос с вариантами ответа “да/нет”.

В Linux существует несколько способов отправки сообщений всем пользователям в сети, включая как консольные инструменты, так и графические решения с поддержкой диалогов “да/нет”. Для сетевого взаимодействия наиболее эффективными являются SSH-основанные методы, а для графических интерфейсов - утилиты типа zenity и yad.

Содержание

Локальные инструменты для отправки сообщений

Базовые инструменты Linux позволяют отправлять сообщения прямо на консоли локальных пользователей:

Команда wall

Команда wall (write all) предназначена для отправки сообщений всем залогиненным пользователям на локальной системе:

bash
wall "Важное сообщение: система будет перезагружена через 10 минут"

Команда write

Для отправки сообщений конкретным пользователям:

bash
write username "Ваше персональное сообщение"

Команда talk

Интерактивный инструмент для реального времени общения:

bash
talk username

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

Сетевые и удаленные инструменты

Для отправки сообщений по сети Linux предлагает несколько подходов:

SSH-рассылка сообщений

Один из самых надежных способов отправки сообщений на удаленные Linux-машины:

bash
#!/bin/bash
MESSAGE="Срочное уведомление от администратора"
for HOST in server1 server2 server3; do
    ssh $HOST "wall '$MESSAGE'"
done

Использование wall через сеть

Если настроен доступ без пароля, можно отправлять сообщения всем сетевым пользователям:

bash
# Для пользователей на удаленных машинах
ssh user@remote-host "wall 'Ваше сообщение'"

Скрипт для массовой рассылки

bash
#!/bin/bash
# send_message_to_network.sh
MESSAGE=$1
HOSTS=("server1" "server2" "server3")

for HOST in "${HOSTS[@]}"; do
    echo "Отправка сообщения на $HOST..."
    ssh $HOST "wall '$MESSAGE'"
done

Графические инструменты для диалогов

Для создания графических диалогов с кнопками “да/нет” в Linux существует несколько мощных инструментов:

Zenity - Графические диалоговые окна

Zenity - популярная утилита для создания диалоговых окон в shell-скриптах:

bash
# Базовый вопрос "да/нет"
zenity --question --text "Вы уверены, что хотите продолжить?"

# Проверка ответа
if [ $? -eq 0 ]; then
    echo "Пользователь выбрал Да"
else
    echo "Пользователь выбрал Нет"
fi

Расширенные возможности Zenity

bash
# Вопрос с кастомными кнопками
zenity --question --text "Установить обновления?" --ok-label "Да" --cancel-label "Нет"

# Вопрос с иконкой
zenity --question --text "Система требует перезагрузки" --icon-name="warning"

Yad - Yet Another Dialog

Более мощная альтернатива Zenity с расширенными возможностями:

bash
# Базовый диалог "да/нет"
yad --question --title="Подтверждение" --text="Вы хотите удалить этот файл?"

# С прогресс-баром
yad --question --text="Обработка файлов..." --progress-text="Идет обработка"

Dialog - Классическая утилита

bash
# Диалог "да/нет" в консоли
dialog --yesno "Продолжить установку?" 8 40

# Обработка ответа
case $? in
    0) echo "Да";;
    1) echo "Нет";;
    255) echo "Отмена";;
esac

Комбинированные решения для сети

Полный скрипт для сетевых сообщений с GUI

bash
#!/bin/bash
# network_message_gui.sh

# Проверка, передано ли сообщение
if [ $# -eq 0 ]; then
    MESSAGE=$(zenity --entry --title="Сообщение для сети" --text="Введите сообщение для отправки:")
else
    MESSAGE="$1"
fi

# Подтверждение отправки
if zenity --question --text="Отправить сообщение '$MESSAGE' всем серверам?"; then
    HOSTS=("server1.example.com" "server2.example.com" "server3.example.com")
    
    for HOST in "${HOSTS[@]}"; do
        if ssh $HOST "wall '$MESSAGE'"; then
            zenity --info --text="Сообщение успешно отправлено на $HOST"
        else
            zenity --error --text="Ошибка при отправке на $HOST"
        fi
    done
    
    zenity --info --text="Рассылка завершена"
else
    zenity --info --text="Отправка отменена"
fi

Скрипт для межплатформенной рассылки

bash
#!/bin/bash
# cross_platform_message.sh

MESSAGE=$1

# Linux-сервера
for HOST in linux-server-1 linux-server-2; do
    ssh $HOST "wall '$MESSAGE'" &
done

# Windows-клиенты (если установлен smbclient)
if [ -x "$(command -v smbclient)" ]; then
    echo "$MESSAGE" | smbclient -M workstation-1 -U guest &
    echo "$MESSAGE" | smbclient -M workstation-2 -U guest &
fi

zenity --info --text="Сообщение отправлено в сеть"

Практические примеры реализации

Пример 1: Система уведомлений о перезагрузке

bash
#!/bin/bash
# reboot_notification.sh

MESSAGE="Система будет перезагружена через 5 минут. Сохраните все работы!"

# Локальные пользователи
wall "$MESSAGE"

# Удаленные серверы
SERVERS=("web-server" "db-server" "app-server")

for SERVER in "${SERVERS[@]}"; do
    ssh $SERVER "wall '$MESSAGE'" &
done

# Графическое подтверждение
zenity --info --text="Уведомления о перезагрузке отправлены"

Пример 2: Интерактивный опрос пользователей

bash
#!/bin/bash
# user_poll.sh

QUESTION="Нужно ли установить обновления безопасности?"

# Локальный опрос
if zenity --question --text="$QUESTION"; then
    LOCAL_ANSWER="Да"
else
    LOCAL_ANSWER="Нет"
fi

echo "Локальный пользователь ответил: $LOCAL_ANSWER"

# Сетевой опрос
ANSWERS_FILE="/tmp/user_answers.txt"
echo "Локальный: $LOCAL_ANSWER" > "$ANSWERS_FILE"

for HOST in server1 server2 server3; do
    ssh $HOST "
        if zenity --question --text='$QUESTION'; then
            echo '$HOST: Да' >> /tmp/answer
        else
            echo '$HOST: Нет' >> /tmp/answer
        fi
    " &
done

wait

# Собираем все ответы
for HOST in server1 server2 server3; do
    scp $HOST:/tmp/answer >> "$ANSWERS_FILE"
done

# Показываем результаты
zenity --text-info --filename="$ANSWERS_FILE" --title="Результаты опроса"

Пример 3: Мониторинг состояния сети с уведомлениями

bash
#!/bin/bash
# network_monitor.sh

while true; do
    # Проверка доступности серверов
    for HOST in server1 server2 server3; do
        if ! ping -c 1 $HOST > /dev/null 2>&1; then
            MESSAGE="ВНИМАНИЕ: Сервер $HOST недоступен!"
            
            # Локальное уведомление
            wall "$MESSAGE"
            
            # Отправка на другие серверы
            for OTHER in server1 server2 server3; do
                if [ "$OTHER" != "$HOST" ]; then
                    ssh $OTHER "wall '$MESSAGE'" &
                fi
            done
            
            # Графическое предупреждение
            zenity --warning --text="Обнаружена проблема с сервером $HOST"
        fi
    done
    
    sleep 300  # Проверка каждые 5 минут
done

Источники

  1. How to Send a Message to Logged Users in Linux Terminal
  2. Communicating with other users on the Linux command line
  3. Zenity: A Graphical Dialog Box Utility for Linux
  4. yad Command Linux: Complete Guide to Yet Another Dialog Tool
  5. How to send messages or chat in Linux
  6. Send a ‘net send like’ message from a Linux Host to ALL Linux and Windows computers
  7. dialog(1): dialog boxes from shell scripts
  8. Sending messages to another user

Заключение

  • Для локальных систем используйте wall, write и talk командные утилиты
  • Для сетевой рассылки применяйте SSH-скрипты с параллельной отправкой сообщений
  • Графические диалоги “да/нет” реализуются через zenity, yad или dialog
  • Комбинированные решения позволяют создавать интерактивные сетевые системы уведомлений
  • Наиболее эффективный подход - сочетание SSH для удаленных машин и GUI-инструментов для локального взаимодействия

Для решения вашей задачи с графическим интерфейсом и кнопками “да/нет” рекомендую использовать zenity в связке с SSH-рассылкой, что обеспечит как сетевое распространение сообщений, так и удобный пользовательский интерфейс для подтверждения действий.

Авторы
Проверено модерацией
Модерация