В Linux команда write создаёт линию связи между двумя авторизованными пользователями через терминал, позволяя отправлять сообщения в режиме реального времени.
Содержание
Синтаксис
write <user> [<ttyname>]
Параметр user является обязательным и представляет имя пользователя принимающей стороны. Указание ttyname необходимо в случае нескольких открытых терминалов.
Использование команды write в Linux
Предварительная подготовка
Для команды write требуются как минимум два пользователя, вошедших в систему через сеанс pts (псевдо-терминал) или tty (телетайп).
Так как у меня второго пользователя нет, то я его создаю с именем ivan:
oleg@mobile:~$ sudo su
root@mobile:/home/oleg# adduser ivan
Добавляется пользователь «ivan» ...
Добавляется новая группа «ivan» (1001) ...
Добавляется новый пользователь «ivan» (1001) в группу «ivan» ...
Создаётся домашний каталог «/home/ivan» ...
Копирование файлов из «/etc/skel» ...
Новый пароль :
Повторите ввод нового пароля :
passwd: пароль успешно обновлён
Изменение информации о пользователе ivan
Введите новое значение или нажмите ENTER для выбора значения по умолчанию
Полное имя []:
Номер комнаты []:
Рабочий телефон []:
Домашний телефон []:
Другое []:
Данная информация корректна? [Y/n] y
root@mobile:/home/oleg#
Добавляю пользователя ivan в группу sudo:
root@mobile:/home/oleg# usermod -aG sudo ivan
root@mobile:/home/oleg#
Проверяю доступность разрешений sudo, переключившись командой su на учётную запись пользователя ivan:
oleg@mobile:~$ sudo su ivan
ivan@mobile:/home/oleg$ cd
ivan@mobile:~$
Теперь пользователь ivan, используя sudo, сможет запускать команды с привилегиями суперпользователя:
ivan@mobile:~$ sudo ls -l /root
итого 4
drwxr-xr-x 3 root root 4096 авг 17 2021 snap
ivan@mobile:~$
Конечно при работе в реальной многопользовательской среде подобная предварительная подготовка не требуется.
Разрешение на запись
Для связи с другим пользователем oleg получает разрешение на запись с помощью mesg y:
oleg@mobile:~$ mesg y
oleg@mobile:~$
Пользователь ivan также получает разрешение на запись:
ivan@mobile:~$ mesg y
ivan@mobile:~$
Вход в терминальный сеанс
При работе на одном компьютере с двумя разными пользователями каждый пользователь запускает команду в своём терминальном сеансе и указывает своё имя пользователя.
Команда предлагает ввести sudo и пароль пользователя для продолжения.
Пользователь oleg входит в терминальный сеанс:
oleg@mobile:~$ sudo login oleg
Пароль:
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.15.0-58-generic x86_64)
...
oleg@mobile:~$
То же самое выполняет и пользователь ivan:
ivan@mobile:~$ sudo login ivan
Пароль:
...
ivan@mobile:~$
Чтобы проверить, кто вошёл в систему, используется команда w в любом терминале:
oleg@mobile:~$ w
17:51:14 up 14 min, 3 users, load average: 0,28, 0,39, 0,50
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
oleg :0 :0 17:38 ?xdm? 1:33 0.00s /usr/lib/gdm3/gdm-x-session --run-script env GNOME_SHELL_SESSION_M
oleg pts/0 - 17:47 1.00s 0.12s 0.00s w
ivan pts/2 - 17:49 2:05 0.14s 0.05s -bash
oleg@mobile:~$
Вывод показывает, что пользователи oleg и ivan вошли в систему через консоль pts. Кроме этого пользователь oleg предварительно вошёл в систему через локальный дисплей (GUI). Он же выполнил команду login для обоих пользователей.
Создание сообщения
Чтобы написать сообщение другому пользователю с помощью команды write выполняются следующие действия:
Запускаем утилиту и указываем пользователя:
oleg@mobile:~$ write ivan
Команда ожидает входное сообщение. На принимающей стороне пользователь получает подтверждение о соединении со следующей информацией:
ivan@mobile:~$
Message from oleg@mobile on pts/0 at 17:56 ...
Пользователь oleg набирает текст сообщения и нажимает Enter для перехода на новую строку:
oleg@mobile:~$
Message from oleg@mobile on pts/0 at 18:03 ...
write oleg
Hi, how are you?
write ivan
Would you like to drink some beer now?
Сообщение появляется на принимающей стороне в режиме реального времени и пользователь ivan отвечает:
ivan@mobile:~$
Message from oleg@mobile on pts/0 at 18:03 ...
write oleg
Hi, how are you?
write ivan
Would you like to drink some beer?
write oleg
Yes, of course. o
Пользователь oleg завершает работу, набрав oo и нажав CTRL + D:
oleg@mobile:~$ write ivan
Message from ivan@mobile on pts/2 at 18:03 ...
Hi, how are you?
write ivan
Would you like to drink some beer now?
write oleg
Yes, of course. o
write oo
oleg@mobile:~$
Пользователь ivan получает сообщение об окончании сеанса и бежит к Олегу:
ivan@mobile:~$ EOF
Message from oleg@mobile on pts/0 at 18:03 ...
write oleg
Hi, how are you?
write ivan
Would you like to drink some beer now?
write oleg
Yes, of course. o
write oo
EOF
Поскольку не существует надлежащего способа отличить, когда пользователь заканчивает сообщение, традиционный способ завершения оператора — это символ o. Чтобы сигнализировать об окончании разговора, напишите oo. Завершите работу, нажатием CTRL + D.
Сообщение с помощью команды echo
С использованием команды echo можно ввести сообщение и передать команду write:
oleg@mobile:~$ echo "Hello from oleg" | write ivan
Канал связи немедленно заканчивается для отправителя, а получатель принимает сообщение и ожидает завершения.
Сообщение из файла
Для отправки сообщения из текстового файла создаётся текстовый файл:
Содержимое файла отправляется с помощью команды следующим образом:
oleg@mobile:~$ echo "Hello from oleg" | write ivan < beer.txt
Сообщение на определённый терминал
Когда у пользователя открыто несколько терминальных сеансов, утилита выбирает терминал с наименьшим временем простоя.
Используйте эту утилиту для проверки имени tty и времени простоя.
Чтобы указать, на какой tty отправлять сообщения, запустите:
ivan@mobile:~$ write oleg pts/0
Сообщения поступят только на pts/0.
Заключение
Изучив в этой небольшой статье примеры использования команду write в Linux вы сможете использовать её в своей работе. Вы уже убедились в том, что это несложно.