除了邮件和即时通讯软件,你是否知道在同一个 Linux 服务器上,用户之间还有一种更为“原始”的实时通信方式?这正是 write 命令的用武之地。今天,我们来深入探讨这个看似古老但仍在特定场景下极具价值的命令。
一、什么是 write?
简单来说,write 命令允许你将终端输入的内容,实时发送到另一位已登录用户的终端上,实现类似“单工”的即时通信。
根据 write 的 官方手册,其描述如下:
write - 向其他用户发送消息
write 命令允许你通过将你终端上的行复制到其他用户的终端,来与他们进行通信。
当你运行 write 命令时,你正在发送消息的用户会收到如下形式的消息:
Message from yourname@yourhost on yourtty at hh:mm ...
你输入的任何后续行都将被复制到指定用户的终端。如果对方想要回复,他们也必须运行 write 命令。
当你完成通信时,输入文件结束符或中断字符。对方会看到 EOF 消息,这表明对话已结束。
你可以使用 mesg(1) 命令阻止除超级用户之外的其他人向你发送消息。某些命令(例如 nroff(1) 和 pr(1))可能会自动禁止写入操作,以免它们生成的输出被覆盖。
如果你想发送消息的用户登录了多个终端,你可以通过将终端名称作为 write 命令的第二个操作数来指定要写入哪个终端。或者,你也可以让 write 命令选择其中一个终端,它会选择空闲时间最短的终端。这样,如果用户在工作场所登录,同时也从家里拨号登录,消息就会发送到合适的地方。
传统的向他人发送消息的协议是在一行末尾或单独一行上使用字符串 -o,表示轮到对方发言了。字符串“oo”表示此人认为对话已结束。
二、命令参数
先看看 write 命令的基本选项:
[root@master1 ~]# write -h
用法:
write [选项] <用户> [<tty名称>]
选项:
-V, --version 输出版本信息并退出
-h, --help 显示此帮助并退出
参数非常简单,主要就是指定目标用户和可选的 [tty名称]。
三、实用场景与示例
1. 基本用法:向指定用户发送消息
这是最直接的用法。输入的每一行都会实时显示在目标用户的终端上。按 Ctrl+D (发送 EOF) 或 Ctrl+C 来结束通信。
[root@master1 ~]# write root
Message from root@master1 on pts/0 at 20:10 ...
test message
test message
EOF
[root@master1 ~]#
2. 指定终端发送
如果用户同时登录了多个会话(例如,通过 SSH 开了多个窗口),你可以指定具体的终端进行通信。
# 先看看有哪些用户登录了,看到有root pts/0
[root@master1 ~]# who
root pts/0 2026-02-01 19:52
# 测试指定终端
[root@master1 ~]# write root pts/0
Message from root@master1 on pts/0 at 20:16 ...
test message 01
test message 01
^CEOF
3. 快速通知:发送简短提醒
结合 echo 命令,可以实现无需进入交互模式的快速消息发送,适合在脚本中通知其他用户完成某事或检查日志。
[root@master1 ~]# echo "Server is ready" | write root
Message from root@master1 on pts/0 at 20:19 ...
Server is ready
EOF
[root@master1 ~]#
4. 脚本自动化:定时发送消息
在脚本中使用 write 可以实现定时提醒功能,例如每小时检查备份状态并通知管理员。
#!/bin/bash
while true; do
echo "Backup check: $(date)" | write root
sleep 3600 # 每小时一次
done
5. 拒绝接收消息
如果你不想被打扰,可以使用 mesg 命令禁用其他用户对你终端的写入权限。这是系统管理和 运维 工作中保护当前任务输出不被干扰的一个小技巧。
[root@master1 ~]# mesg n
[root@master1 ~]# write root pts/0
write: you have write permission turned off
[root@master1 ~]# mesg y
[root@master1 ~]# write root pts/0
Message from root@master1 on pts/0 at 20:28 ...
6. 传统通信协议
在早期的多用户系统中,形成了一套非正式的对话礼仪。输入 -o 表示“我说完了,该你说了”(over to you),输入 oo 表示“对话结束”(over and out)。这在需要轮流发言的实时协作讨论中非常清晰。
# 确认登录用户
[root@master1 ~]# who
test1 pts/0 2026-02-01 20:56
root pts/1 2026-02-01 20:24
test2 pts/2 2026-02-01 20:58
root pts/3 2026-02-01 20:58
# 用户 test1 发起对话
[test1@master1 ~]$ write test2
Hi, are you there? -o
# 用户 test2 回复并结束对话
[test2@master1 ~]$ write test1
Yes! -o
Let‘s meet at 3pm. oo
四、补充信息
历史
write 命令首次出现在 AT&T UNIX 第 6 版中。
相关命令
mesg(1)、talk(1)、who(1)
报告错误
如需报告错误,请使用问题跟踪器:
https://github.com/karelzak/util-linux/issues
可用性
write 命令是 util-linux 软件包的一部分,可从 Linux 内核存档网站下载:
https://www.kernel.org/pub/linux/utils/util-linux/
五、总结
write 命令体现了 Unix/Linux 哲学中的“单一职责原则”,它只做一件事:在用户终端间传递消息。在图形界面和网络通信不那么发达的早期,它是系统管理员和开发者们协同工作的重要工具。即使在今天,在服务器运维、多用户调试或者一些自动化脚本中,它仍然是一个轻量级且高效的内部通知手段。
希望以上关于 write 命令的详细介绍和场景示例能帮助你更好地理解和使用这个经典的 Linux 工具。如果你对类似的系统级工具和 运维 技巧感兴趣,欢迎在 云栈社区 交流探讨。