linux uux命令

命令简介

uux(Unix to Unix eXecute)是UUCP(Unix to Unix Copy)工具集的一部分,用于在远程系统上执行命令。它是早期Unix系统中实现网络通信和远程命令执行的重要工具,主要用于文件传输、邮件传递和远程命令执行。

注意:uux 是较老的Unix网络工具,现代Linux系统中通常使用SSH、SCP、rsync等工具进行远程操作。但在某些遗留系统或特定应用中可能还会遇到。

基本语法

# 基本格式
uux [选项] 命令字符串

# 常用格式
uux "远程系统!命令"
uux "系统1!命令1 | 系统2!命令2"
uux -p 文件名 "远程系统!rmail 用户"

命令字符串格式:

[系统!]命令 [参数] [< 输入文件] [> 输出文件] [| 管道]

UUCP系统简介

UUCP是什么?

UUCP(Unix to Unix Copy)是Unix系统之间进行文件传输、邮件传递和远程命令执行的协议套件,包含:

  • uucp - 文件复制
  • uux - 远程命令执行
  • uucico - 通信守护进程
  • uuxqt - 远程命令执行器
  • uuname - 列出已知系统
  • uustat - 查看UUCP状态
UUCP历史意义

UUCP是早期Unix网络的重要部分:

  • 20世纪70-80年代主要Unix网络协议
  • 建立了早期的Usenet新闻组网络
  • 通过拨号连接实现系统间通信
  • 是早期电子邮件和文件交换的基础
  • 在互联网普及前广泛使用

现代替代:SSH、SCP、rsync、SMTP等

常用选项

选项 描述
-a 用户名 指定发起请求的用户名
-b 命令执行失败时返回标准输入
-c 不将本地文件复制到spool目录
-C 强制将本地文件复制到spool目录
-g 等级 指定工作等级(A-Z, 0-9, a-z)
-j 输出作业ID
-n 不通知用户命令执行失败
-p 将标准输入作为命令输入
-r 只排队不立即执行
-x 调试等级 设置调试等级(1-9)
-z 成功时发送通知
--help 显示帮助信息
--version 显示版本信息

安装UUCP工具

现代Linux系统通常不预装UUCP工具,需要手动安装:

# 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

# 从源码编译
wget https://ftp.gnu.org/gnu/uucp/uucp-1.07.tar.gz
tar -xzvf uucp-1.07.tar.gz
cd uucp-1.07
./configure
make
sudo make install

# 验证安装
which uux
uux --version
# 输出示例:uux (GNU UUCP) 1.07

# 基本配置
# 创建必要目录
sudo mkdir -p /var/spool/uucp
sudo mkdir -p /var/spool/uucppublic
sudo chown -R uucp:uucp /var/spool/uucp
sudo chmod 755 /var/spool/uucp

# 配置文件
ls -la /etc/uucp/
# 主要配置文件:
# config - 主配置文件
# sys - 系统定义
# port - 端口定义
# dial - 拨号配置
# dialcode - 拨号码配置
# passwd - 密码文件

实际示例

示例1:基本远程命令执行

在远程系统上执行简单命令:

# 1. 配置系统
# 编辑/etc/uucp/sys文件,添加远程系统
sudo nano /etc/uucp/sys
# 添加:
# system remotehost
#   time any
#   phone 5551234
#   port serial1
#   speed 9600
#   chat login: mylogin ssword: mypass

# 2. 在远程系统上执行date命令
uux "remotehost!date"
# 输出:在远程系统执行date命令的结果

# 3. 获取远程系统信息
uux "remotehost!uname -a"
uux "remotehost!who"
uux "remotehost!uptime"

# 4. 执行带参数的命令
uux "remotehost!ls -la /tmp"

# 5. 查看作业ID
uux -j "remotehost!date"
# 输出:作业ID,如:remotehostNf0a1234

# 6. 检查作业状态
uustat -q
# 或
uustat -s remotehost

# 7. 删除作业
uustat -k 作业ID

# 8. 只排队不执行
uux -r "remotehost!date"
# 稍后由uucico处理

示例2:文件传输操作

使用uux进行文件传输:

# 1. 从远程系统获取文件
# 将远程文件传输到本地
uux "remotehost!cat /etc/passwd" > local_passwd.txt
# 或
uux "remotehost!uucp -r /etc/passwd remotehost!~/passwd"

# 2. 发送文件到远程系统
cat localfile.txt | uux -p "remotehost!cat > ~/localfile.txt"
# 或
uux "remotehost!cat > ~/remotefile.txt" < localfile.txt

# 3. 在远程系统间传输文件
uux "sys1!uucp file.txt sys2!~/received/"

# 4. 通过管道传输
cat data.txt | uux "remotehost!wc -l"
# 统计远程系统上数据行数

# 5. 使用tar传输目录
tar czf - /local/dir | uux -p "remotehost!tar xzf - -C /remote/dir"

# 6. 比较本地和远程文件
uux "remotehost!cat /etc/hosts" | diff - /etc/hosts

# 7. 从远程系统获取日志文件
uux "remotehost!tail -100 /var/log/messages" > remote_messages.log

# 8. 传输大文件(分块)
split -b 1m largefile.tar.gz largefile.part.
for part in largefile.part.*; do
    cat $part | uux -p "remotehost!cat >> ~/largefile.tar.gz"
done
# 在远程系统合并
uux "remotehost!cat ~/largefile.part.* > ~/largefile.tar.gz"

示例3:邮件和消息传递

使用uux发送邮件和消息:

# 1. 发送邮件到远程用户
# 传统UUCP邮件
echo "邮件内容" | uux -p "remotehost!rmail user@remotehost"

# 2. 发送文件作为邮件附件
cat document.txt | uux -p "remotehost!rmail -s '文档' user@remotehost"

# 3. 发送系统通知
echo "系统备份完成 $(date)" | uux -p "remotehost!wall"
# 在远程系统广播消息

# 4. 发送到多个用户
for user in user1 user2 user3; do
    echo "通知内容" | uux -p "remotehost!rmail $user"
done

# 5. 从文件发送邮件
uux "remotehost!rmail user@remotehost" < message.txt

# 6. 带主题的邮件
{
    echo "Subject: 测试邮件"
    echo ""
    echo "这是一封测试邮件"
} | uux -p "remotehost!rmail user@remotehost"

# 7. 检查远程邮件队列
uux "remotehost!mailq"

# 8. 通过UUCP发送Usenet新闻文章
# 配置news软件使用UUCP传输
# 在远程系统上执行rn命令读取新闻

示例4:管道和重定向

使用管道和重定向的复杂命令:

# 1. 简单的管道
# 在远程系统执行管道命令
uux "remotehost!ls -la | wc -l"
# 统计远程目录文件数

# 2. 多系统管道
# 在sys1上执行命令,结果传给sys2处理
uux "sys1!ps aux | sys2!grep httpd"

# 3. 输入输出重定向
# 从本地文件读取,远程处理,输出到本地
uux "remotehost!sort" < input.txt > sorted.txt

# 4. 复杂管道
# 本地数据 -> 远程排序 -> 远程去重 -> 本地保存
cat data.txt | uux -p "remotehost!sort | uniq" > result.txt

# 5. 错误处理
uux "remotehost!ls /nonexistent 2>&1" > error.log
# 捕获远程命令的错误输出

# 6. 条件执行
# 如果文件存在则显示内容
uux "remotehost!test -f /etc/hosts && cat /etc/hosts"

# 7. 命令替换
# 获取远程主机名并保存
hostname=$(uux "remotehost!hostname")
echo "远程主机名: $hostname"

# 8. 后台执行
# 在远程系统后台执行长时间任务
uux "remotehost!longtask.sh > /tmp/longtask.log 2>&1 &"

示例5:系统管理和监控

使用uux进行远程系统管理:

#!/bin/bash
# 文件名: remote-monitor.sh
# 使用uux进行远程系统监控

REMOTE_SYSTEM="server1"
LOG_FILE="/var/log/remote-monitor.log"
ALERT_EMAIL="admin@example.com"

# 记录日志
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}

# 检查远程系统状态
check_remote_status() {
    log_message "检查远程系统 $REMOTE_SYSTEM 状态..."

    # 检查是否在线
    if uux "$REMOTE_SYSTEM!echo test" 2>/dev/null; then
        log_message "远程系统在线"
        return 0
    else
        log_message "远程系统离线"
        return 1
    fi
}

# 获取远程系统信息
get_remote_info() {
    log_message "获取远程系统信息..."

    # 主机名
    hostname=$(uux "$REMOTE_SYSTEM!hostname" 2>/dev/null)
    log_message "主机名: $hostname"

    # 系统信息
    uux "$REMOTE_SYSTEM!uname -a" >> $LOG_FILE 2>/dev/null

    # 系统负载
    uux "$REMOTE_SYSTEM!uptime" >> $LOG_FILE 2>/dev/null

    # 磁盘使用
    uux "$REMOTE_SYSTEM!df -h" >> $LOG_FILE 2>/dev/null

    # 内存使用
    uux "$REMOTE_SYSTEM!free -h" >> $LOG_FILE 2>/dev/null

    # 进程数
    process_count=$(uux "$REMOTE_SYSTEM!ps aux | wc -l" 2>/dev/null)
    log_message "进程数: $process_count"

    # 登录用户
    uux "$REMOTE_SYSTEM!who" >> $LOG_FILE 2>/dev/null
}

# 检查远程服务状态
check_remote_services() {
    log_message "检查远程服务状态..."

    # HTTP服务
    if uux "$REMOTE_SYSTEM!systemctl is-active httpd" 2>/dev/null | grep -q active; then
        log_message "HTTP服务: 运行中"
    else
        log_message "HTTP服务: 停止"
        echo "HTTP服务停止" | uux -p "$REMOTE_SYSTEM!wall" 2>/dev/null
    fi

    # SSH服务
    if uux "$REMOTE_SYSTEM!systemctl is-active sshd" 2>/dev/null | grep -q active; then
        log_message "SSH服务: 运行中"
    else
        log_message "SSH服务: 停止"
    fi

    # 数据库服务
    if uux "$REMOTE_SYSTEM!systemctl is-active mysqld" 2>/dev/null | grep -q active; then
        log_message "MySQL服务: 运行中"
    else
        log_message "MySQL服务: 停止"
    fi
}

# 备份远程重要文件
backup_remote_files() {
    log_message "备份远程重要文件..."

    # 备份配置文件
    uux "$REMOTE_SYSTEM!tar czf - /etc/passwd /etc/group /etc/hosts" > /backup/etc-config-$(date +%Y%m%d).tar.gz 2>/dev/null

    # 备份日志文件
    uux "$REMOTE_SYSTEM!tail -1000 /var/log/messages" > /backup/messages-$(date +%Y%m%d).log 2>/dev/null

    # 检查备份大小
    backup_size=$(ls -lh /backup/*$(date +%Y%m%d)* 2>/dev/null | awk '{sum += $5} END {print sum}')
    log_message "备份大小: $backup_size"
}

# 检查远程安全性
check_remote_security() {
    log_message "检查远程安全性..."

    # 检查失败登录
    failed_logins=$(uux "$REMOTE_SYSTEM!grep 'Failed password' /var/log/secure | wc -l" 2>/dev/null)
    log_message "失败登录尝试: $failed_logins"

    if [ "$failed_logins" -gt 10 ]; then
        log_message "警告: 过多的失败登录尝试"
        echo "发现 $failed_logins 次失败登录尝试" | uux -p "$REMOTE_SYSTEM!rmail $ALERT_EMAIL" 2>/dev/null
    fi

    # 检查root登录
    root_logins=$(uux "$REMOTE_SYSTEM!last | grep root | wc -l" 2>/dev/null)
    log_message "Root登录次数: $root_logins"
}

# 主函数
main() {
    log_message "=== 开始远程系统监控 ==="

    if check_remote_status; then
        get_remote_info
        check_remote_services
        backup_remote_files
        check_remote_security
    else
        log_message "远程系统不可达,跳过检查"
        echo "远程系统 $REMOTE_SYSTEM 不可达" | mail -s "系统监控警报" $ALERT_EMAIL
    fi

    log_message "=== 监控完成 ==="
}

# 执行主函数
main

示例6:故障排查和调试

uux故障排查和调试:

# 1. 检查UUCP服务状态
# 查看uucico进程
ps aux | grep uucico
# 查看uuxqt进程
ps aux | grep uuxqt

# 2. 查看UUCP日志
ls -la /var/log/uucp/
# 主要日志文件:
# Debug - 调试日志
# Log - 常规日志
# Stats - 统计信息
# 查看最新日志
tail -f /var/log/uucp/Debug
tail -f /var/log/uucp/Log

# 3. 测试基本连接
# 简单测试
uux "echo test"
# 应该返回本地echo结果

# 4. 使用调试模式
uux -x 9 "remotehost!date"
# 等级1-9,数字越大越详细

# 5. 检查配置
# 查看系统配置
cat /etc/uucp/sys
# 查看端口配置
cat /etc/uucp/port
# 查看拨号配置
cat /etc/uucp/dial

# 6. 检查权限
ls -la /var/spool/uucp/
# 确保uucp用户可以读写
sudo chown -R uucp:uucp /var/spool/uucp
sudo chmod 755 /var/spool/uucp

# 7. 手动测试通信
# 启动uucico手动模式
sudo uucico -i -s remotehost
# 或调试模式
sudo uucico -i -s remotehost -x 9

# 8. 检查作业队列
uustat -a
# 显示所有作业
uustat -s remotehost
# 显示特定系统作业
uustat -k ALL
# 删除所有作业

# 9. 测试文件传输
# 创建测试文件
echo "test" > /tmp/test.txt
# 尝试传输
uux "remotehost!cat > /tmp/received.txt" < /tmp/test.txt

# 10. 检查网络连接
# 如果是TCP连接
telnet remotehost 540
# UUCP常用端口540
# 如果是串行连接
stty -F /dev/ttyS0
cu -l /dev/ttyS0 -s 9600

# 11. 查看系统日志
dmesg | grep uucp
journalctl | grep uucp
grep uucp /var/log/syslog
grep uucp /var/log/messages

# 12. 常见错误解决
# 错误: 权限被拒绝
# 解决: 检查/var/spool/uucp权限
# 错误: 未知系统
# 解决: 检查/etc/uucp/sys配置
# 错误: 连接超时
# 解决: 检查网络/串行连接
# 错误: 登录失败
# 解决: 检查密码配置

# 13. 性能调优
# 调整spool目录大小
# 编辑/etc/uucp/config
sudo nano /etc/uucp/config
# 修改:
# max-aux-items = 50
# max-uuxqt-procs = 5
# 重启服务
sudo systemctl restart uucp

# 14. 安全性检查
# 检查允许的命令
cat /etc/uucp/permissions
# 限制远程可执行命令
# 配置命令别名和安全路径

现代替代工具

ssh (安全Shell)

加密的远程登录和命令执行工具。

# 远程执行命令
ssh user@remotehost "命令"
# 示例:
ssh user@server "date"
ssh user@server "ls -la"
ssh user@server "tar czf - /data" > backup.tar.gz
scp

安全的文件复制工具。

# 复制文件到远程
scp file.txt user@remotehost:/path/
# 从远程复制文件
scp user@remotehost:/path/file.txt .
# 递归复制目录
scp -r dir/ user@remotehost:/path/
rsync

高效的文件同步工具。

# 同步文件
rsync -avz local/ user@remotehost:/remote/path/
# 从远程同步
rsync -avz user@remotehost:/remote/path/ local/
# 通过ssh
rsync -avz -e ssh local/ remote:/path/
curl / wget

HTTP/FTP文件传输工具。

# 下载文件
wget http://example.com/file.txt
curl -O http://example.com/file.txt
# 上传文件
curl -T file.txt ftp://example.com/
# POST数据
curl -X POST -d @data.json http://api.example.com/

安全性考虑

UUCP安全风险
  • 明文传输:密码和命令以明文传输
  • 弱认证:简单的登录/密码认证
  • 权限过大:可能允许任意命令执行
  • 端口暴露:默认使用固定端口
  • 协议老化:缺少现代加密和认证
  • 错误配置:可能导致系统暴露
安全最佳实践
  • 使用SSH替代UUCP
  • 如果必须使用,限制允许的命令
  • 配置严格的权限控制
  • 使用防火墙限制访问
  • 定期更新和打补丁
  • 监控日志中的异常活动
  • 使用VPN或加密隧道
  • 定期审计配置

常见问题

配置步骤:

  1. 安装UUCP:确保uucp软件包已安装
  2. 创建配置文件:编辑/etc/uucp/目录下的配置文件
  3. 配置系统:在/etc/uucp/sys中添加远程系统
  4. 配置端口:在/etc/uucp/port中定义连接端口
  5. 配置拨号:在/etc/uucp/dial中定义拨号序列
  6. 设置权限:配置/etc/uucp/permissions文件
  7. 启动服务:启动uucico和uuxqt服务
  8. 测试连接:使用uuname和uux测试
# 示例配置
# /etc/uucp/sys
system remotesys
  time any
  phone 555-1234
  port serial0
  speed 9600
  chat login: mylogin ssword: mypass

# /etc/uucp/port
port serial0
  type direct
  device /dev/ttyS0
  speed 9600

# /etc/uucp/dial
dial standard
  chat "" ATZ OK ATDT\T CONNECT

# /etc/uucp/permissions
MACHINE=remotesys \
  COMMANDS=rmail:date:ls \
  READ=/var/spool/uucppublic \
  WRITE=/var/spool/uucppublic \
  SENDFILES=yes \
  REQUEST=yes

# 重启服务
sudo systemctl restart uucp
# 测试
uuname
uux "remotesys!date"

迁移步骤:

UUCP功能 SSH替代方案 示例命令
uux "host!command" ssh user@host "command" ssh user@server "date"
uucp file host!path scp file user@host:path scp data.txt user@server:/tmp/
管道传输 SSH管道 cat file | ssh user@host "cat > remote.txt"
邮件传输 SMTP/SSH隧道 sendmail 或 msmtp
远程监控 SSH + 监控工具 ssh user@host "df -h; free -m"
批处理作业 cron + SSH ssh user@host "at now + 1 hour"

迁移脚本示例:

#!/bin/bash
# 迁移脚本:将uux命令转换为ssh命令

# 原uux命令
# uux "remotehost!date"
# 转换为:
ssh user@remotehost "date"

# 原uux管道
# cat file.txt | uux "remotehost!wc -l"
# 转换为:
cat file.txt | ssh user@remotehost "wc -l"

# 原uux文件传输
# uux "remotehost!cat > ~/file.txt" < local.txt
# 转换为:
scp local.txt user@remotehost:~/file.txt
# 或
cat local.txt | ssh user@remotehost "cat > ~/file.txt"

# 配置SSH密钥认证
ssh-keygen -t rsa
ssh-copy-id user@remotehost
# 无需密码连接

# 批量迁移脚本
for host in host1 host2 host3; do
    # 替换uux为ssh
    sed -i "s/uux \".*!\(.*\)\"/ssh user@$host \"\1\"/g" scripts/*
done

故障排查步骤:

  1. 检查服务状态:
    ps aux | grep uucico
    ps aux | grep uuxqt
    systemctl status uucp
  2. 检查日志:
    tail -f /var/log/uucp/Debug
    tail -f /var/log/uucp/Log
    grep uucp /var/log/syslog
  3. 检查配置:
    # 检查系统配置
    grep -v "^#" /etc/uucp/sys
    # 检查权限
    cat /etc/uucp/permissions
    # 检查spool目录权限
    ls -la /var/spool/uucp/
  4. 手动测试:
    # 简单测试
    uux "date"
    # 应该能执行
    # 带调试
    uux -x 9 "date"
    # 测试远程
    uuname
    # 列出已知系统
    # 手动启动uucico
    uucico -i -s remotehost -x 9
  5. 检查网络连接:
    # 如果是TCP
    telnet remotehost 540
    # 如果是串行
    stty -F /dev/ttyS0
    # 检查设备是否存在
    ls -la /dev/ttyS*
  6. 检查作业队列:
    uustat -a
    # 查看所有作业状态
    uustat -k ALL
    # 清除所有作业后重试
  7. 常见错误解决:
    • "permission denied":检查/var/spool/uucp权限
    • "unknown system":检查/etc/uucp/sys配置
    • "login failed":检查密码和聊天脚本
    • "timeout":检查网络连接和远程服务
    • "can't open device":检查串行设备权限

安全增强措施:

  1. 使用VPN:在UUCP通信前建立VPN隧道
    # 使用OpenVPN等建立加密隧道
    # 然后在隧道内使用UUCP
  2. 限制允许的命令:在permissions文件中严格限制
    # /etc/uucp/permissions
    MACHINE=remote \
      COMMANDS=date:uptime:who \
      VALIDATE=yes \
      REQUEST=no \
      SENDFILES=no
  3. 使用一次性密码:替代固定密码
    # 配置PAM使用OTP
    # 或使用S/Key一次性密码系统
  4. 防火墙限制:只允许特定IP访问
    # iptables规则
    iptables -A INPUT -p tcp --dport 540 -s trusted_ip -j ACCEPT
    iptables -A INPUT -p tcp --dport 540 -j DROP
  5. 使用加密工具:在传输前加密数据
    # 使用gpg加密
    gpg -e -r recipient file.txt
    uux "remote!gpg -d > file.txt" < file.txt.gpg
  6. 定期审计:监控日志和活动
    # 审计脚本
    grep -i "failed\|denied\|error" /var/log/uucp/Log
    # 监控异常活动
    watch -n 60 'uustat -a | wc -l'
  7. 更新和打补丁:保持UUCP软件最新
    # 定期更新
    apt-get update && apt-get upgrade uucp
    # 或
    yum update uucp
  8. 考虑迁移:计划迁移到SSH等现代协议
    # 制定迁移计划
    # 1. 并行运行UUCP和SSH
    # 2. 逐步迁移功能
    # 3. 最终关闭UUCP