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