Linux命令-talk(终端实时对话)
talk 命令允许两个登录在同一台或多台主机上的用户通过终端进行实时文字对话。每个用户的终端被分为上下两半:上半部分显示自己输入的内容,下半部分显示对方输入的内容。
快速参考
bash
talk 用户[@主机] [终端]
talk需要远程主机上运行talkd(或in.talkd)守护进程,且目标用户必须已登录。由于其安全性和可用性限制,talk已被write、即时通讯工具和协作平台取代。
基本用法
bash
# 与同一主机的用户对话
talk john
# 与远程主机的用户对话
talk john@remote.example.com
# 指定目标用户的终端
talk john tty2
talk john pts/3
# 查看当前在线用户(用于确定对话目标)
who
w
finger
工作流程
bash
# === 发起方 ===
# 1. 确认对方在线
who | grep john
# 2. 发起对话请求
talk john@server
# 对方终端会收到如下提示:
# Message from Talk_Daemon@server at 10:30 ...
# talk: connection requested by alice@server
# 3. 等待对方应答
# 4. 连接建立后开始对话
# 输入内容即时传输
# 按 Ctrl+C 或输入 Ctrl+D 结束
# === 接收方 ===
# 1. 收到通知后
talk alice
# 2. 连接建立,开始双向对话
talkd 服务配置
bash
# 检查 talkd 是否安装
which talkd
dpkg -l | grep talkd # Debian/Ubuntu
rpm -qa | grep talk # RHEL/CentOS
# 安装 talkd
sudo apt-get install talkd # Debian/Ubuntu
sudo yum install talk # RHEL/CentOS
# 检查 talkd 是否运行
sudo netstat -tulpn | grep talkd
sudo ss -tulpn | grep 518
# talkd 默认使用端口 517/518(UDP)
# /etc/services 中的定义
grep talk /etc/services
# talk 517/udp
# ntalk 518/udp
# 启用 talkd(/etc/inetd.conf 或 xinetd)
# xinetd 配置
cat /etc/xinetd.d/talk 2>/dev/null
cat /etc/xinetd.d/ntalk 2>/dev/null
# 重启服务
sudo systemctl restart xinetd
允许/拒绝消息
bash
# mesg 控制是否接收 talk 请求
mesg # 查看当前状态
mesg y # 允许接收消息(默认)
mesg n # 拒绝接收消息
# .bashrc 中设置拒绝
echo "mesg n" >> ~/.bashrc
# 检查是否可以与某人对话
mesg
# is y -> 可以接收
# is n -> 对方无法通过 talk 联系你
局限性与安全考量
bash
# 局限性:
# 1. 对方必须在线且使用终端登录(SSH/TTY)
# 2. 需要网络可达且 talkd 服务运行
# 3. 无认证机制,任何知道用户名的人都可以发起对话
# 4. 没有日志记录(默认不保存对话内容)
# 5. GUI 桌面环境通常不支持
# 安全风险:
# - talkd 历史上存在多个安全漏洞
# - 不加密传输内容
# - 可被用于社会工程攻击
# 现代替代方案:
# - write: 单向消息
echo "请查看邮件" | write john pts/3
# - SSH 共享终端
ssh -t user@host tmux attach -t shared_session
# - wall: 全局广播
wall "系统将在10分钟后重启"
# - 即时通讯工具
# Slack, Teams, IRC, Matrix, etc.
使用脚本模拟通知
bash
#!/bin/bash
# 终端消息通知脚本(替代 talk)
# 用法: ./notify.sh username message
USER="$1"
MSG="${2:-你有新消息}"
# 查找用户的所有终端
TTYS=$(who | awk -v u="$USER" '$1==u{print $2}')
if [ -z "$TTYS" ]; then
echo "用户 $USER 当前不在线"
exit 1
fi
# 发送消息到所有终端
for tty in $TTYS; do
echo "$MSG" | write "$USER" "$tty" 2>/dev/null && \
echo "消息已发送到 $USER ($tty)"
done
talk 与现代工具对比
| 工具 | 类型 | 加密 | 多人 | 审计 |
|---|---|---|---|---|
talk |
双向终端对话 | 否 | 否 | 否 |
write |
单向消息 | 否 | 否 | 否 |
wall |
广播 | 否 | 是 | 否 |
tmux 共享会话 |
共享终端 | 是(SSH) | 是 | 是 |
| SSH + IRC | 聊天室 | 是(IRC+SSL) | 是 | 是 |
| Slack/Teams | 现代协作 | 是 | 是 | 是 |
talk是早期 Unix 系统的网络社交工具,体现了分时多用户系统的设计哲学。在现代环境中,它的功能已完全被 SSH 共享终端、即时通讯工具和协作平台取代,了解它更多是为了理解 Unix 历史和文化。