菜鸟科技网

Linux write命令如何实现实时消息交互?

write 是一个用于在 Linux/Unix 系统中进行实时文本通信的命令行工具,它的主要功能是向另一个登录到同一台主机的用户发送消息。

Linux write命令如何实现实时消息交互?-图1
(图片来源网络,侵删)

基本概念

write 命令的工作原理非常直接:

  1. 你(发送方)运行 write 命令,指定接收方的用户名。
  2. 系统会检查该用户是否已登录,以及是否允许接收消息。
  3. 如果一切正常,接收方的终端会立即显示你输入的消息,直到你结束输入。
  4. 接收方可以使用 write 命令回复你,从而实现双向的实时对话。

重要前提: 发送方和接收方必须登录到同一台物理或虚拟主机上。write 命令不能通过网络发送消息给另一台机器上的用户(除非使用 write user@hostname 这种不常见的用法,但通常有更好的工具如 talkmesg)。


语法

write user [ttyname]

参数说明:

  • user: 必需参数,你要发送消息的用户的登录名。
  • ttyname: 可选参数,如果该用户登录了多个终端(会话),你需要指定具体的终端设备名,pts/0tty1,如果不指定,write 会默认发送到该用户的当前活动终端。

使用示例

示例 1:基本用法

假设你的用户名是 alice,你想给登录在同一台主机上的用户 bob 发送消息。

Linux write命令如何实现实时消息交互?-图2
(图片来源网络,侵删)
  1. alice 的终端输入:

    write bob

    输入此命令后,你的终端会进入输入模式,光标会移到新行的开头。

  2. 输入消息:

    Hi Bob, this is Alice. Are you busy?
    (按 Enter 换行)
    I have a quick question about the project.
    (按 Ctrl + D 结束输入)
    • Ctrl + D 是文件结束符(EOF),用它来告诉 write 命令你的消息已经输入完毕。
  3. bob 的终端查看: bob 的终端屏幕上会立刻显示出类似下面的内容(可能会根据终端设置有所不同):

    Linux write命令如何实现实时消息交互?-图3
    (图片来源网络,侵删)
    Message from alice on pts/1 at 10:30 ...
    Hi Bob, this is Alice. Are you busy?
    I have a quick question about the project.

    bob 现在可以立即用 write alice 回复你。


示例 2:指定终端

bob 同时开了两个 SSH 会话,分别在 pts/0pts/1 上,你想只给他 pts/1 的会话发送消息:

# 在 alice 的终端
write bob pts/1

这样,消息就只会显示在 bobpts/1 终端上。


示例 3:与不在线的用户通信

如果你尝试给一个没有登录的用户发送消息,系统会提示你:

write non_existent_user
write: non_existent_user has messages disabled

或者

write non_existent_user
write: non_existent_user: pts/0

(然后没有响应,因为用户没在线)


相关命令和概念

理解 write 命令,必须了解与之相关的两个命令:mesgtalk

mesg 命令

write 的功能是否生效,取决于接收方是否允许接收消息。mesg 命令就是用来控制这个权限的。

  • mesg y (yes): 允许其他用户用 write 给你发消息。这是默认状态
  • mesg n (no): 禁止其他用户用 write 给你发消息。

如何检查当前状态? 使用 mesg 命令不带任何参数:

$ mesg
is y
# 或者
$ mesg
is n

is y,表示允许;is n 表示禁止。

实用技巧: 如果你不希望被别人打扰,可以在自己的终端执行:

mesg n

这样,任何试图用 write 给你发消息的人都会收到 "messages disabled" 的错误提示。

talk 命令

write 是一种半双工通信(你一句,我一句),而 talk 是一种全双工通信工具,它会把屏幕分成上下两个区域,你可以在自己的区域输入,对方的输入会实时显示在他的区域,实现类似即时聊天的效果。

talk 的用法和 write 类似,但体验更好:

talk bob

talk 会尝试与对方建立连接,如果成功,双方屏幕都会被分割,开始实时对话。


注意事项和最佳实践

  1. 礼貌性:在发送消息前,最好先用 write 命令本身打个招呼,或者先用 whow 命令看看对方是否在线,直接发长篇大论可能会吓到对方。

    # 先打个招呼
    write bob
    Bob, are you there? (^D to end)
    # 或者先检查
    w
    # 查看输出,确认 bob 确实在线
  2. 打扰问题write 会直接在对方的终端上输出内容,非常具有“侵入性”,可能会打断对方正在执行的命令或编辑的文件,只在必要时使用,并遵循“先打招呼”的原则。

  3. 现代替代品

    • 对于现代 Linux/Unix 系统,writetalk 使用得已经越来越少。
    • 即时通讯工具:如 Slack、Microsoft Teams、Discord 等是团队协作和即时通信的首选。
    • 系统内消息wall (write all) 命令可以向所有在线用户广播消息(通常由 root 用于系统维护通知)。
    • 终端多路复用器tmuxscreen 允许你在一个终端窗口内创建多个会话,并可以在会话间聊天,是开发者非常喜爱的工具。

总结表格

命令 功能 示例 备注
write 向同一主机的指定用户发送单行或多行消息。 write bob 半双工,直接在对方终端显示。
mesg 控制是否接收 write 发来的消息。 mesg n y 允许,n 禁止,默认为 y
talk 与同一主机的用户进行全双工实时对话。 talk bob 屏幕分割,体验类似聊天软件。
wall 向所有登录用户广播消息。 wall System will reboot at 2 AM 需要root权限,通常用于系统通知。
w / who 查看当前在线的用户及其终端信息。 w 在使用 write 前先检查对方是否在线。

希望这份详细的解释能帮助你完全理解 write 命令!

分享:
扫描分享到社交APP
上一篇
下一篇