talk 是一个简单的实时通信程序,它将终端屏幕分割成两个部分,每个用户都可以在自己的部分输入文本,并实时看到对方的输入。这是早期Unix系统中用户之间通信的常用方式。
talk 命令起源于1970年代的Unix系统,是早期网络通信的经典工具之一。虽然现在有更多现代通信方式,但talk仍然是了解Unix历史和终端通信的好工具。
# 安装talk客户端
sudo apt install talk
# 安装talk服务器(用于远程通信)
sudo apt install talkd
# 安装ntalk(改进版本)
sudo apt install ntalk
# CentOS/RHEL 7/8
sudo yum install talk
# Fedora
sudo dnf install talk
# 启用talk服务(如果需要远程通信)
sudo systemctl start ntalk
sudo systemctl enable ntalk
# 基本语法
talk 用户名 [终端]
# 与远程用户通信
talk 用户名@主机名 [终端]
参数说明:
用户名 - 要通信的用户的登录名主机名 - 远程主机的主机名或IP地址终端 - 用户登录的终端设备(可选)| 选项 | 说明 |
|---|---|
-v 或 --version |
显示版本信息 |
-h 或 --help |
显示帮助信息 |
-t 或 --tty |
指定用户的终端设备 |
-p 或 --port |
指定通信端口(默认为517/518) |
-d 或 --debug |
启用调试模式 |
# 用户A:发起与用户B的对话
talk alice
# 用户B的终端会显示:
# Message from Talk_Daemon@localhost at 10:30 ...
# talk: connection requested by bob@localhost.
# talk: respond with: talk bob@localhost
# 用户B:接受对话请求
talk bob
# 用户A在主机server1上,想与server2上的用户B通信
talk bob@server2
# 或者使用IP地址
talk bob@192.168.1.100
# 用户B接受请求
talk alice@server1
# 查看用户的登录终端
who
# 输出示例:
# alice tty1 2023-10-01 09:30
# bob pts/0 2023-10-01 09:35
# 指定终端设备进行通信
talk bob pts/0
# ntalk用法与talk类似
ntalk alice
# 查看ntalk版本
ntalk --version
# ntalk支持更多选项
ntalk -d alice # 调试模式
[Talk] 与 alice@localhost 的对话
--------------------------------------------------------------------
[你的输入区域]
在这里输入你的消息...
每行输入后按回车发送
--------------------------------------------------------------------
[alice的输入区域]
这是alice发送的消息...
她可以看到你的输入...
--------------------------------------------------------------------
按 Ctrl+C 退出对话
屏幕布局说明:
| 命令/快捷键 | 功能 |
|---|---|
| Ctrl + C | 退出对话 |
| Ctrl + L | 刷新屏幕 |
| Ctrl + Z | 挂起talk会话 |
:q 或 :quit |
退出对话(某些版本) |
| Ctrl + ] | 清除屏幕(某些版本) |
| Delete 或 Backspace | 删除字符 |
| Ctrl + W | 删除单词 |
| Ctrl + U | 删除整行 |
# 传统inetd配置示例
talk dgram udp wait root /usr/sbin/tcpd /usr/sbin/in.talkd
ntalk dgram udp wait root /usr/sbin/tcpd /usr/sbin/in.ntalkd
# xinetd配置(/etc/xinetd.d/talk)
service talk
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.talkd
disable = no
}
# 开放talk使用的端口(通常517和518)
# iptables示例
sudo iptables -A INPUT -p udp --dport 517 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 518 -j ACCEPT
# firewalld示例
sudo firewall-cmd --add-port=517/udp --permanent
sudo firewall-cmd --add-port=518/udp --permanent
sudo firewall-cmd --reload
可能原因: talk服务未运行或防火墙阻止
解决方案:
# 检查talk服务状态
sudo systemctl status ntalk
# 启动talk服务
sudo systemctl start ntalk
sudo systemctl enable ntalk
# 检查端口是否监听
sudo netstat -anp | grep :517
sudo netstat -anp | grep :518
# 检查防火墙设置
sudo iptables -L -n | grep 517
sudo iptables -L -n | grep 518
可能原因: 目标用户未登录或登录终端未知
解决方案:
# 检查用户是否登录
who
w
# 查看用户的登录终端
finger username
# 使用mesg命令检查用户是否允许消息
mesg
# 如果返回"is n",用户禁用了消息
# 用户可以运行 mesg y 来启用
# 尝试指定终端
talk username tty1
可能原因: 网络问题或远程主机配置错误
解决方案:
# 测试网络连通性
ping remote-host
# 测试端口连通性
telnet remote-host 517
nc -z remote-host 517
# 检查远程主机的talk服务
ssh remote-host "systemctl status ntalk"
# 检查远程主机的防火墙
ssh remote-host "sudo iptables -L -n | grep 517"
# 使用verbose模式调试
talk -v username@remote-host
单向消息发送工具,可以向指定用户的终端发送消息。
write username
# 输入消息后按 Ctrl+D 发送
mesg 命令控制是否允许其他用户向你的终端发送消息。
mesg y # 允许消息
mesg n # 禁止消息
mesg # 查看当前状态
向所有登录用户广播消息。
wall "系统将在5分钟后重启"
ssh + screen/tmux通过SSH连接到远程主机,使用screen或tmux进行协作。
# 使用tmux进行协作
tmux new -s shared-session
# 其他人加入会话
tmux attach -t shared-session
如Slack、Mattermost、Rocket.Chat等,提供更丰富的功能。
mesg n 可以防止其他用户发送消息系统管理员之间快速协调服务器维护任务。
开发团队成员在终端环境中快速交流。
教师和学生之间进行实时的问答和交流。
write单向消息发送
mesg消息接收控制
wall广播消息
who查看登录用户