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(Unix to Unix Copy)是Unix系统之间进行文件传输、邮件传递和远程命令执行的协议套件,包含:
uucp - 文件复制uux - 远程命令执行uucico - 通信守护进程uuxqt - 远程命令执行器uuname - 列出已知系统uustat - 查看UUCP状态UUCP是早期Unix网络的重要部分:
现代替代:SSH、SCP、rsync、SMTP等
现代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. 配置系统
# 编辑/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处理
使用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"
使用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命令读取新闻
使用管道和重定向的复杂命令:
# 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 &"
使用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
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 / wgetHTTP/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/
配置步骤:
# 示例配置
# /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
故障排查步骤:
ps aux | grep uucico
ps aux | grep uuxqt
systemctl status uucp
tail -f /var/log/uucp/Debug
tail -f /var/log/uucp/Log
grep uucp /var/log/syslog
# 检查系统配置
grep -v "^#" /etc/uucp/sys
# 检查权限
cat /etc/uucp/permissions
# 检查spool目录权限
ls -la /var/spool/uucp/
# 简单测试
uux "date"
# 应该能执行
# 带调试
uux -x 9 "date"
# 测试远程
uuname
# 列出已知系统
# 手动启动uucico
uucico -i -s remotehost -x 9
# 如果是TCP
telnet remotehost 540
# 如果是串行
stty -F /dev/ttyS0
# 检查设备是否存在
ls -la /dev/ttyS*
uustat -a
# 查看所有作业状态
uustat -k ALL
# 清除所有作业后重试
安全增强措施:
# 使用OpenVPN等建立加密隧道
# 然后在隧道内使用UUCP
# /etc/uucp/permissions
MACHINE=remote \
COMMANDS=date:uptime:who \
VALIDATE=yes \
REQUEST=no \
SENDFILES=no
# 配置PAM使用OTP
# 或使用S/Key一次性密码系统
# iptables规则
iptables -A INPUT -p tcp --dport 540 -s trusted_ip -j ACCEPT
iptables -A INPUT -p tcp --dport 540 -j DROP
# 使用gpg加密
gpg -e -r recipient file.txt
uux "remote!gpg -d > file.txt" < file.txt.gpg
# 审计脚本
grep -i "failed\|denied\|error" /var/log/uucp/Log
# 监控异常活动
watch -n 60 'uustat -a | wc -l'
# 定期更新
apt-get update && apt-get upgrade uucp
# 或
yum update uucp
# 制定迁移计划
# 1. 并行运行UUCP和SSH
# 2. 逐步迁移功能
# 3. 最终关闭UUCP