cu(Call Unix)是一个传统的Unix工具,用于通过串行线(RS-232)或电话线呼叫另一个Unix系统。它提供了一个简单的终端会话界面,允许用户登录远程系统、执行命令和传输文件。虽然现代网络环境中较少使用,但在特定场景(如串行控制台、调制解调器连接)中仍有价值。
在基于Debian/Ubuntu的系统上安装:
sudo apt-get update
sudo apt-get install uucp
在基于RHEL/CentOS的系统上安装:
sudo yum install uucp
# 或者
sudo dnf install uucp
在基于Arch Linux的系统上安装:
sudo pacman -S uucp
cu [选项] [系统|电话号码]
| 选项 | 说明 |
|---|---|
-l, --line=DEVICE |
指定串行线设备(如/dev/ttyS0) |
-s, --speed=SPEED |
设置波特率(如9600、115200) |
-e, --parity=even |
设置偶校验 |
-o, --parity=odd |
设置奇校验 |
--parity=none |
无校验(默认) |
-n, --nostop |
无停止位(通常为1或2位) |
-E, --escape=CHAR |
设置转义字符(默认~) |
-h, --halfduplex |
半双工模式(回声本地) |
-t, --maplf |
将LF映射为CR-LF |
-d, --debug |
调试模式,显示诊断信息 |
-v, --verbose |
详细输出模式 |
--help |
显示帮助信息 |
--version |
显示版本信息 |
| 参数 | 常见值 | 说明 |
|---|---|---|
| 波特率 | 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 | 数据传输速率(位/秒) |
| 数据位 | 5, 6, 7, 8 | 每个字符的数据位数,通常为8 |
| 停止位 | 1, 1.5, 2 | 字符结束标志,通常为1 |
| 校验位 | none, even, odd, mark, space | 错误检测位,通常为none |
| 流控制 | none, xon/xoff, rts/cts | 数据流控制机制 |
# 连接到/dev/ttyS0,波特率9600
cu -l /dev/ttyS0 -s 9600
# 连接到COM2端口
cu -l /dev/ttyS1 -s 115200
# 简化写法
cu ttyS0
# 通过调制解调器拨号
cu -l /dev/ttyS0 -s 115200 5551234
# 指定电话号码
cu 5551234
# 设置波特率、数据位、停止位、校验位
cu -l /dev/ttyS0 -s 19200 --parity=even
# 使用奇校验
cu -l /dev/ttyS1 -s 9600 -o
# 使用偶校验
cu -l /dev/ttyS0 -s 57600 -e
成功建立连接后,cu会进入交互模式。此时可以使用以下命令:
默认转义字符是~(波浪号)。在cu会话中,输入转义字符后可以执行特殊命令:
| 转义序列 | 说明 |
|---|---|
~. |
立即断开连接并退出 |
~!command |
在本地系统执行命令 |
~$command |
在本地执行命令并将输出发送到远程 |
~|command |
将本地命令的输出通过管道发送到远程 |
~+command |
从远程接收输入并作为本地命令执行 |
~%take file |
从远程接收文件到本地 |
~%put file |
从本地发送文件到远程 |
~%break |
发送中断信号 |
~? |
显示所有转义序列帮助 |
~~ |
发送一个波浪号字符 |
# 建立连接
cu -l /dev/ttyS0 -s 9600
# 连接成功后,在远程终端输入:
# ~!ls -la # 在本地执行ls命令
# ~!date # 在本地执行date命令
# ~$whoami # 在本地执行whoami并发送结果到远程
# ~. # 断开连接
cu支持简单的文件传输功能:
# 建立连接
cu -l /dev/ttyS0 -s 115200
# 在cu会话中,使用~%put发送文件
# ~%put localfile.txt
# 或者使用非交互模式
echo "~%put config.txt" | cu -l /dev/ttyS0 -s 9600
# 建立连接
cu -l /dev/ttyS0 -s 115200
# 在cu会话中,使用~%take接收文件
# ~%take remotefile.txt
# 文件将被保存到本地当前目录
# 将本地命令输出发送到远程
echo "~|ls -la" | cu -l /dev/ttyS0 -s 9600
# 从远程读取数据并作为本地命令输入
# 在cu会话中:~+cat file.txt
| 文件/目录 | 说明 |
|---|---|
/etc/uucp/ |
UUCP配置文件目录 |
/etc/uucp/Systems |
远程系统定义 |
/etc/uucp/Devices |
设备定义 |
/etc/uucp/Dialers |
拨号器定义 |
/etc/uucp/Dialcodes |
拨号码定义 |
/etc/uucp/Config |
UUCP配置 |
/var/spool/uucp/ |
UUCP工作目录和队列 |
/var/log/uucp/ |
UUCP日志目录 |
编辑/etc/uucp/Systems文件:
# 示例系统配置
remote_any Any ACU 19200 5551234 "" \r\n in:--in:--in: nuucp word: secret
remote_login Any ACU 9600 5555678 "" \r\n in:--in:--in: login: mylogin word: mypass
配置说明:
格式:系统名 时间表 设备 速度 电话号码 聊天脚本
字段说明:
- 系统名:远程系统名称
- 时间表:何时可连接(Any表示任何时候)
- 设备:设备类型(ACU表示自动呼叫单元/调制解调器)
- 速度:波特率
- 电话号码:要拨的号码
- 聊天脚本:登录脚本
# 连接Cisco路由器控制台
cu -l /dev/ttyS0 -s 9600
# 连接完成后,可执行路由器命令
# 输入~.断开连接
# 连接到串行设备进行调试
cu -l /dev/ttyUSB0 -s 115200
# 发送AT命令测试调制解调器
AT
ATZ
ATDT123456
# 查看设备响应
# ~.断开连接
# 连接到传统BBS系统
cu -l /dev/ttyS0 -s 2400 5551234
# 连接成功后,按照BBS提示操作
# 使用~!执行本地命令
# ~.断开连接
cu: /dev/ttyS0: Permission denied
解决方案:
# 使用sudo
sudo cu -l /dev/ttyS0 -s 9600
# 或更改设备权限
sudo chmod 666 /dev/ttyS0
# 或添加用户到dialout组
sudo usermod -aG dialout $USER
# 注销重新登录
cu: open (/dev/ttyS0): No such file or directory
cu: /dev/ttyS0: Device busy
解决方案:
# 检查设备文件
ls -l /dev/ttyS*
ls -l /dev/ttyUSB*
# 检查哪些进程在使用设备
sudo lsof /dev/ttyS0
# 加载串行端口模块
sudo modprobe serial
sudo modprobe 8250
# 尝试其他设备文件
cu -l /dev/ttyUSB0 -s 115200
# cu连接后无任何显示或响应
解决方案:
# 1. 检查物理连接
# 确保串行线正确连接
# 2. 检查串行参数
# 尝试不同波特率
cu -l /dev/ttyS0 -s 9600
cu -l /dev/ttyS0 -s 19200
cu -l /dev/ttyS0 -s 115200
# 3. 检查流控制
# 某些设备需要硬件流控制
# 可能需要使用stty设置
# 4. 使用调试模式
cu -l /dev/ttyS0 -s 9600 -d -v
# ~%put或~%take命令无效
解决方案:
# 1. 确保远程系统支持文件传输
# 2. 检查权限
# 3. 尝试ASCII模式传输
# 4. 使用其他传输方法(如ZMODEM)
| 命令 | 说明 |
|---|---|
tip |
另一个串行线连接工具 |
minicom |
全功能串行通信程序 |
screen |
终端多路复用器,支持串行连接 |
picocom |
简单的串行终端程序 |
uucp |
Unix到Unix文件复制 |
uux |
在远程系统执行命令 |
uustat |
显示UUCP状态 |
uuname |
列出已知的UUCP系统 |
kermit |
文件传输和终端仿真程序 |
sz/rz |
ZMODEM文件传输程序 |
对于现代网络环境,有以下更先进的替代方案:
# 通过网络连接远程系统
ssh user@remotehost
# 通过SSH执行命令
ssh user@remotehost "ls -la"
# 通过SSH传输文件
scp localfile user@remotehost:/path/
scp user@remotehost:/path/remotefile ./
# 使用screen连接串行端口
screen /dev/ttyS0 115200
# 使用tmux连接串行端口
tmux new-session "minicom -D /dev/ttyS0 -b 115200"
# 安装picocom
sudo apt-get install picocom
# 使用picocom
picocom -b 115200 /dev/ttyUSB0
# 按Ctrl+A Ctrl+Q退出
# 安装minicom
sudo apt-get install minicom
# 配置minicom
sudo minicom -s
# 在菜单中选择串行端口设置
# 保存为默认配置
# 启动minicom
minicom
#!/bin/bash
# auto_cu_connect.sh - 自动拨号连接脚本
DEVICE="/dev/ttyS0"
BAUD_RATE="115200"
PHONE_NUMBER="5551234"
MAX_ATTEMPTS=3
WAIT_TIME=10
echo "开始自动拨号连接..."
echo "设备: $DEVICE"
echo "波特率: $BAUD_RATE"
echo "电话号码: $PHONE_NUMBER"
echo ""
for attempt in $(seq 1 $MAX_ATTEMPTS); do
echo "尝试 $attempt/$MAX_ATTEMPTS ..."
# 尝试连接
timeout 30 cu -l "$DEVICE" -s "$BAUD_RATE" "$PHONE_NUMBER" << 'EOF'
~!echo "连接成功"
sleep 2
~.
EOF
if [ $? -eq 0 ]; then
echo "连接成功建立!"
break
else
echo "连接失败,等待${WAIT_TIME}秒后重试..."
sleep $WAIT_TIME
fi
done
if [ $attempt -eq $MAX_ATTEMPTS ]; then
echo "达到最大重试次数,连接失败"
exit 1
fi
#!/bin/bash
# cu_batch_commands.sh - 通过cu批量执行命令
DEVICE="/dev/ttyUSB0"
BAUD_RATE="9600"
COMMANDS_FILE="commands.txt"
OUTPUT_FILE="output.log"
# 检查命令文件
if [ ! -f "$COMMANDS_FILE" ]; then
echo "错误: 命令文件 $COMMANDS_FILE 不存在"
exit 1
fi
echo "开始通过cu执行批量命令..."
echo "设备: $DEVICE"
echo "波特率: $BAUD_RATE"
echo "输出文件: $OUTPUT_FILE"
echo ""
# 清空输出文件
> "$OUTPUT_FILE"
# 读取并执行每个命令
while IFS= read -r cmd; do
# 跳过空行和注释
[[ -z "$cmd" || "$cmd" =~ ^# ]] && continue
echo "执行命令: $cmd"
echo "=== 命令: $cmd ===" >> "$OUTPUT_FILE"
# 通过cu执行命令
{
echo "~!echo '执行: $cmd'"
echo "~!\$($cmd)"
sleep 1
echo "~."
} | timeout 30 cu -l "$DEVICE" -s "$BAUD_RATE" 2>/dev/null >> "$OUTPUT_FILE"
echo "---" >> "$OUTPUT_FILE"
echo ""
# 命令间等待
sleep 2
done < "$COMMANDS_FILE"
echo "批量命令执行完成"
echo "输出已保存到: $OUTPUT_FILE"
#!/bin/bash
# cu_session_logger.sh - 记录cu会话
DEVICE="/dev/ttyS0"
BAUD_RATE="115200"
LOG_FILE="cu_session_$(date +%Y%m%d_%H%M%S).log"
TIMESTAMP_FORMAT="%Y-%m-%d %H:%M:%S"
echo "开始记录cu会话..."
echo "设备: $DEVICE"
echo "波特率: $BAUD_RATE"
echo "日志文件: $LOG_FILE"
echo "按Ctrl+C停止记录"
echo ""
# 使用script命令记录会话
script -c "cu -l $DEVICE -s $BAUD_RATE -v" "$LOG_FILE"
echo ""
echo "会话记录已保存到: $LOG_FILE"
echo "可以使用以下命令查看:"
echo " less $LOG_FILE"
echo " cat $LOG_FILE"
cu是UUCP(Unix-to-Unix Copy)系统的一部分,UUCP是传统Unix系统之间进行文件传输、邮件和新闻传输的协议套件。虽然现代互联网已取代了大部分UUCP功能,但在某些嵌入式系统或特殊环境中仍有使用。
-E选项更改转义字符,如-E ^将转义字符改为^script命令记录整个cu会话| 用途 | 命令示例 |
|---|---|
| 基本串行连接 | cu -l /dev/ttyS0 -s 9600 |
| 调制解调器拨号 | cu -l /dev/ttyS0 -s 115200 5551234 |
| 指定奇校验 | cu -l /dev/ttyS0 -s 9600 -o |
| 指定偶校验 | cu -l /dev/ttyS0 -s 9600 -e |
| 调试模式 | cu -l /dev/ttyS0 -s 9600 -d -v |
| 更改转义字符 | cu -l /dev/ttyS0 -s 9600 -E ^ |
| 半双工模式 | cu -l /dev/ttyS0 -s 9600 -h |
| 发送本地文件 | ~%put filename(在cu会话中) |
| 接收远程文件 | ~%take filename(在cu会话中) |
| 执行本地命令 | ~!command(在cu会话中) |
| 断开连接 | ~.(在cu会话中) |