Linux cu命令

cu(Call Unix)是一个传统的Unix工具,用于通过串行线(RS-232)或电话线呼叫另一个Unix系统。它提供了一个简单的终端会话界面,允许用户登录远程系统、执行命令和传输文件。虽然现代网络环境中较少使用,但在特定场景(如串行控制台、调制解调器连接)中仍有价值。

注意:cu命令是传统Unix工具,现代Linux发行版可能默认不安装。它通常包含在uucp(Unix-to-Unix Copy)软件包中。

安装cu命令

在基于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 数据流控制机制

基本使用示例

示例1:通过串行线连接另一系统

# 连接到/dev/ttyS0,波特率9600
cu -l /dev/ttyS0 -s 9600

# 连接到COM2端口
cu -l /dev/ttyS1 -s 115200

# 简化写法
cu ttyS0

示例2:通过调制解调器拨号连接

# 通过调制解调器拨号
cu -l /dev/ttyS0 -s 115200 5551234

# 指定电话号码
cu 5551234

示例3:使用特定串行参数

# 设置波特率、数据位、停止位、校验位
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 发送中断信号
~? 显示所有转义序列帮助
~~ 发送一个波浪号字符

示例4:在cu会话中执行本地命令

# 建立连接
cu -l /dev/ttyS0 -s 9600

# 连接成功后,在远程终端输入:
# ~!ls -la     # 在本地执行ls命令
# ~!date       # 在本地执行date命令
# ~$whoami     # 在本地执行whoami并发送结果到远程
# ~.           # 断开连接

文件传输

cu支持简单的文件传输功能:

示例5:发送文件到远程系统

# 建立连接
cu -l /dev/ttyS0 -s 115200

# 在cu会话中,使用~%put发送文件
# ~%put localfile.txt

# 或者使用非交互模式
echo "~%put config.txt" | cu -l /dev/ttyS0 -s 9600

示例6:从远程系统接收文件

# 建立连接
cu -l /dev/ttyS0 -s 115200

# 在cu会话中,使用~%take接收文件
# ~%take remotefile.txt

# 文件将被保存到本地当前目录

示例7:通过管道传输数据

# 将本地命令输出发送到远程
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日志目录

示例8:配置远程系统

编辑/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表示自动呼叫单元/调制解调器)
- 速度:波特率
- 电话号码:要拨的号码
- 聊天脚本:登录脚本

实际应用场景

场景1:通过串行线连接路由器/交换机

# 连接Cisco路由器控制台
cu -l /dev/ttyS0 -s 9600

# 连接完成后,可执行路由器命令
# 输入~.断开连接

场景2:调试串行设备

# 连接到串行设备进行调试
cu -l /dev/ttyUSB0 -s 115200

# 发送AT命令测试调制解调器
AT
ATZ
ATDT123456

# 查看设备响应
# ~.断开连接

场景3:通过调制解调器访问BBS

# 连接到传统BBS系统
cu -l /dev/ttyS0 -s 2400 5551234

# 连接成功后,按照BBS提示操作
# 使用~!执行本地命令
# ~.断开连接

故障排除

问题1:权限不足

cu: /dev/ttyS0: Permission denied

解决方案:

# 使用sudo
sudo cu -l /dev/ttyS0 -s 9600

# 或更改设备权限
sudo chmod 666 /dev/ttyS0
# 或添加用户到dialout组
sudo usermod -aG dialout $USER
# 注销重新登录

问题2:设备不存在或繁忙

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

问题3:连接无响应

# 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

问题4:文件传输失败

# ~%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(Secure Shell)

# 通过网络连接远程系统
ssh user@remotehost

# 通过SSH执行命令
ssh user@remotehost "ls -la"

# 通过SSH传输文件
scp localfile user@remotehost:/path/
scp user@remotehost:/path/remotefile ./

screen/tmux + 串行连接

# 使用screen连接串行端口
screen /dev/ttyS0 115200

# 使用tmux连接串行端口
tmux new-session "minicom -D /dev/ttyS0 -b 115200"

picocom(简单串行终端)

# 安装picocom
sudo apt-get install picocom

# 使用picocom
picocom -b 115200 /dev/ttyUSB0
# 按Ctrl+A Ctrl+Q退出

minicom(功能丰富的串行程序)

# 安装minicom
sudo apt-get install minicom

# 配置minicom
sudo minicom -s
# 在菜单中选择串行端口设置
# 保存为默认配置
# 启动minicom
minicom

安全注意事项

  1. cu连接通常不加密,敏感信息可能被窃听
  2. 调制解调器拨号可能产生电话费用
  3. 确保串行线连接是物理安全的
  4. 避免在公共网络环境中使用不安全的串行连接
  5. 考虑使用SSH over Serial或VPN隧道增加安全性

实用脚本示例

脚本1:自动拨号连接脚本

#!/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

脚本2:通过cu批量执行远程命令

#!/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"

脚本3:cu会话记录器

#!/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系统的关系

cu是UUCP(Unix-to-Unix Copy)系统的一部分,UUCP是传统Unix系统之间进行文件传输、邮件和新闻传输的协议套件。虽然现代互联网已取代了大部分UUCP功能,但在某些嵌入式系统或特殊环境中仍有使用。

cu高级技巧:
  1. 自定义转义字符:使用-E选项更改转义字符,如-E ^将转义字符改为^
  2. 自动登录脚本:结合expect脚本实现自动登录
  3. 会话记录:使用script命令记录整个cu会话
  4. 串行参数优化:根据设备特性调整波特率、数据位、停止位和校验位
  5. 与现代工具集成:将cu输出通过管道传递给现代分析工具

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会话中)