linux uulog命令

命令简介

uulog 是UUCP(Unix to Unix Copy)工具集的日志查看工具,用于显示和分析UUCP系统的日志文件。它可以帮助管理员监控文件传输、远程命令执行、系统间通信等活动,是UUCP系统管理和故障排查的重要工具。

注意:uulog 是较老的UUCP系统日志工具,现代Linux系统中通常使用journalctlrsyslog等工具进行日志管理。但在某些遗留系统或特定应用中可能还会遇到。

基本语法

# 基本格式
uulog [选项] [系统名]

# 常用格式
uulog -f                       # 持续监视日志
uulog -s remotesys            # 查看特定系统的日志
uulog -u username             # 查看特定用户的日志
uulog -x                      # 显示调试信息

UUCP日志系统简介

UUCP日志文件

UUCP系统使用多个日志文件记录不同活动:

  • /var/log/uucp/Log - 主日志文件
  • /var/log/uucp/Debug - 调试日志
  • /var/log/uucp/Stats - 统计信息
  • /var/log/uucp/Admin - 管理日志
  • /var/spool/uucp/.Log/* - 工作日志
  • /var/spool/uucp/.Admin/* - 管理日志
日志内容类型

UUCP日志记录的活动类型:

  • 连接建立和断开
  • 文件传输(发送/接收)
  • 远程命令执行
  • 权限检查和认证
  • 错误和警告信息
  • 统计信息(传输量、时间)
  • 调试和诊断信息

常用选项

选项 描述
-s 系统名 显示指定系统的日志
-u 用户名 显示指定用户的日志
-f 持续监视日志(类似tail -f)
-n 行数 显示指定行数的日志
-x 显示调试信息(详细模式)
-D 显示调试日志(/var/log/uucp/Debug)
-S 显示统计日志(/var/log/uucp/Stats)
-l 日志文件 指定要查看的日志文件
-t 时间 显示指定时间之后的日志
-r 反向显示(最新在前)
-v 详细模式,显示更多信息
-h 显示帮助信息
-V 显示版本信息

安装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

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

# 查看日志目录
ls -la /var/log/uucp/
# 如果没有目录,创建它
sudo mkdir -p /var/log/uucp
sudo chown -R uucp:uucp /var/log/uucp
sudo chmod 755 /var/log/uucp

# 创建示例日志文件(用于测试)
sudo mkdir -p /var/spool/uucp/.Log
sudo mkdir -p /var/spool/uucp/.Admin
echo "$(date) UUCICO started" | sudo tee -a /var/log/uucp/Log
echo "$(date) Connection to remotehost established" | sudo tee -a /var/spool/uucp/.Log/uucico/remotehost

实际示例

示例1:基本日志查看

查看UUCP系统的基本日志:

# 1. 查看主日志文件
uulog
# 或
cat /var/log/uucp/Log
# 输出示例:
# uucico[1234]: call to remotehost (00:30)
# uucico[1234]: login successful
# uucico[1234]: protocol i g
# uucico[1234]: conversation complete: 12 secs, 0.1 Kbytes sent, 0.5 Kbytes received

# 2. 查看最后20行日志
uulog -n 20
# 或
tail -20 /var/log/uucp/Log

# 3. 持续监视日志
uulog -f
# 类似 tail -f /var/log/uucp/Log
# 按Ctrl+C退出

# 4. 查看特定系统的日志
uulog -s remotehost
# 只显示与remotehost相关的日志

# 5. 查看多个系统的日志
uulog -s remotehost -s server1 -s server2
# 或
grep -E "(remotehost|server1|server2)" /var/log/uucp/Log

# 6. 查看今天的日志
uulog -t today
# 或
grep "$(date +'%b %d')" /var/log/uucp/Log

# 7. 查看最近1小时的日志
uulog -t "1 hour ago"
# 或
awk -v d1="$(date --date='1 hour ago' +'%b %d %H:%M:%S')" \
    -v d2="$(date +'%b %d %H:%M:%S')" \
    '$0 > d1 && $0 < d2' /var/log/uucp/Log

# 8. 反向显示日志(最新在前)
uulog -r
# 或
tac /var/log/uucp/Log | head -50

示例2:详细日志分析

使用详细模式分析UUCP日志:

# 1. 查看调试日志
uulog -D
# 或
cat /var/log/uucp/Debug
# 输出详细的调试信息,包括:
# - 连接建立过程
# - 协议协商
# - 数据包传输
# - 错误诊断

# 2. 查看统计日志
uulog -S
# 或
cat /var/log/uucp/Stats
# 输出统计信息,包括:
# - 传输字节数
# - 连接时间
# - 文件数量
# - 错误计数

# 3. 详细模式查看
uulog -v
# 显示更多字段和信息

# 4. 查看特定用户的日志
uulog -u username
# 只显示username用户的UUCP活动

# 5. 查看特定工作目录的日志
ls -la /var/spool/uucp/.Log/
# 查看工作日志目录
cat /var/spool/uucp/.Log/uucico/remotehost
# 查看特定系统的详细工作日志

# 6. 查看管理日志
cat /var/spool/uucp/.Admin/remotehost
# 查看管理相关的日志

# 7. 使用awk分析日志
# 统计每个系统的连接次数
uulog | awk '/call to/ {print $5}' | sort | uniq -c | sort -rn
# 输出示例:
# 15 remotehost
# 8 server1
# 3 server2

# 8. 查找失败的连接
uulog | grep -i "failed\|error\|denied\|reject"
# 或
uulog -v | grep -B2 -A2 "fail"

# 9. 查看传输量最大的连接
uulog | grep "Kbytes\|Mbytes" | sort -k10 -rn | head -10
# 按传输量排序

# 10. 生成每日报告
#!/bin/bash
# 生成UUCP每日活动报告
DATE=$(date +%Y-%m-%d)
REPORT_FILE="/var/log/uucp/report-$DATE.txt"

{
    echo "=== UUCP 每日活动报告 $DATE ==="
    echo ""

    echo "1. 连接统计:"
    uulog -t "yesterday" | grep -c "call to"
    echo "次连接"

    echo ""
    echo "2. 各系统连接次数:"
    uulog -t "yesterday" | awk '/call to/ {print $5}' | sort | uniq -c | sort -rn

    echo ""
    echo "3. 传输总量:"
    uulog -t "yesterday" | grep "Kbytes\|Mbytes" | awk '{sum += $9} END {print sum " Kbytes"}'

    echo ""
    echo "4. 失败连接:"
    uulog -t "yesterday" | grep -c "failed\|denied"
    echo "次失败"

    echo ""
    echo "5. 最近连接:"
    uulog -n 10
} > $REPORT_FILE

echo "报告已生成: $REPORT_FILE"

示例3:故障排查和监控

使用uulog进行UUCP故障排查:

# 1. 实时监控UUCP活动
# 持续监视所有UUCP日志
uulog -f &
# 后台运行
# 查看特定系统
uulog -f -s remotehost &
# 查看调试信息
uulog -f -D &

# 2. 检查连接问题
# 查看最近的连接尝试
uulog | tail -50 | grep -E "call to|connected|failed|timeout"
# 输出示例:
# uucico[5678]: call to remotehost (01:15)
# uucico[5678]: login failed
# uucico[5678]: call failed

# 3. 查看详细的错误信息
uulog -D | grep -B5 -A5 "ERROR\|FAIL\|DENIED"
# 或查看调试日志
tail -100 /var/log/uucp/Debug | grep -v "^#"

# 4. 检查权限问题
uulog | grep -i "permission\|access\|owner"
# 或
grep -r "permission denied" /var/spool/uucp/.Log/

# 5. 查看文件传输问题
uulog | grep -i "transfer\|send\|receive\|file"
# 或
grep -B3 -A3 "transfer" /var/spool/uucp/.Log/*

# 6. 监控特定用户的UUCP活动
# 创建监控脚本
cat > monitor-uucp-user.sh << 'EOF'
#!/bin/bash
USER=$1
LOG_FILE="/var/log/uucp/monitor-$USER.log"

echo "开始监控用户 $USER 的UUCP活动..."
echo "日志文件: $LOG_FILE"

while true; do
    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
    NEW_ACTIVITY=$(uulog -u $USER -t "5 minutes ago" 2>/dev/null)

    if [ -n "$NEW_ACTIVITY" ]; then
        echo "[$TIMESTAMP] 检测到新活动:" >> $LOG_FILE
        echo "$NEW_ACTIVITY" >> $LOG_FILE
        echo "---" >> $LOG_FILE
        echo "检测到 $USER 的UUCP活动,已记录到 $LOG_FILE"
    fi

    sleep 300  # 5分钟检查一次
done
EOF

chmod +x monitor-uucp-user.sh
# 使用:./monitor-uucp-user.sh username

# 7. 自动故障检测脚本
#!/bin/bash
# 自动检测UUCP问题
LOG_FILE="/var/log/uucp/health-check.log"
THRESHOLD=5  # 失败阈值

check_uucp_health() {
    echo "$(date) - 检查UUCP健康状况..." >> $LOG_FILE

    # 检查最近1小时的失败连接
    FAIL_COUNT=$(uulog -t "1 hour ago" | grep -c "failed\|denied\|timeout")

    if [ $FAIL_COUNT -ge $THRESHOLD ]; then
        echo "警告: 检测到 $FAIL_COUNT 次失败连接" >> $LOG_FILE
        echo "发送警报..." >> $LOG_FILE
        # 发送警报邮件
        echo "UUCP系统检测到 $FAIL_COUNT 次失败连接" | mail -s "UUCP警报" admin@example.com
    fi

    # 检查uucico进程
    if ! ps aux | grep -q "[u]ucico"; then
        echo "错误: uucico进程未运行" >> $LOG_FILE
        echo "尝试重启uucico..." >> $LOG_FILE
        systemctl restart uucp
    fi

    # 检查日志文件大小
    LOG_SIZE=$(du -m /var/log/uucp/Log | cut -f1)
    if [ $LOG_SIZE -gt 100 ]; then
        echo "警告: 日志文件过大 ($LOG_SIZE MB)" >> $LOG_FILE
        echo "轮转日志文件..." >> $LOG_FILE
        mv /var/log/uucp/Log /var/log/uucp/Log.old
        systemctl restart uucp
    fi
}

# 每小时检查一次
while true; do
    check_uucp_health
    sleep 3600
done

示例4:日志过滤和搜索

使用各种工具过滤和分析UUCP日志:

# 1. 使用grep过滤日志
# 查找特定模式的日志
uulog | grep "call to remotehost"
# 查找成功连接
uulog | grep "login successful\|conversation complete"
# 查找大文件传输
uulog | grep "Kbytes\|Mbytes" | grep -v "0.0 Kbytes"

# 2. 使用awk分析日志
# 提取时间戳和事件
uulog | awk '{print $1" "$2" "$3" "$4" "$5" "$6}'
# 统计每小时连接数
uulog | awk '/call to/ {print $3}' | cut -d: -f1 | sort | uniq -c
# 计算平均传输时间
uulog | awk '/secs/ {sum+=$8; count++} END {print "平均时间: " sum/count "秒"}'

# 3. 使用sed处理日志
# 删除调试信息
uulog | sed '/DEBUG/d'
# 提取特定时间范围的日志
uulog | sed -n '/Jan 10 10:00/,/Jan 10 11:00/p'

# 4. 使用cut提取字段
# 提取系统名
uulog | grep "call to" | cut -d' ' -f5
# 提取传输量
uulog | grep "Kbytes" | cut -d' ' -f9,11

# 5. 使用sort和uniq统计
# 统计最活跃的系统
uulog | grep "call to" | cut -d' ' -f5 | sort | uniq -c | sort -rn
# 统计最活跃的用户
uulog | grep "user" | cut -d' ' -f7 | sort | uniq -c | sort -rn

# 6. 使用find查找日志文件
# 查找所有UUCP日志文件
find /var/log -name "*uucp*" -type f
find /var/spool/uucp -name ".*" -type f
# 查找最近修改的日志
find /var/log/uucp -type f -mtime -1

# 7. 使用xargs批量处理
# 搜索所有日志文件中的特定内容
find /var/log/uucp -type f -name "*.log" | xargs grep -l "remotehost"
# 统计所有日志文件大小
find /var/log/uucp -type f -name "*.log" | xargs wc -l

# 8. 高级日志分析脚本
#!/bin/bash
# 高级UUCP日志分析
analyze_uucp_logs() {
    LOG_DIR="/var/log/uucp"
    OUTPUT="/tmp/uucp-analysis-$(date +%Y%m%d).txt"

    echo "=== UUCP日志分析报告 ===" > $OUTPUT
    echo "生成时间: $(date)" >> $OUTPUT
    echo "" >> $OUTPUT

    # 1. 总体统计
    echo "1. 总体统计:" >> $OUTPUT
    echo "日志文件数量: $(find $LOG_DIR -type f -name "*.log" | wc -l)" >> $OUTPUT
    echo "总日志行数: $(find $LOG_DIR -type f -name "*.log" -exec cat {} \; | wc -l)" >> $OUTPUT
    echo "" >> $OUTPUT

    # 2. 时间范围
    echo "2. 日志时间范围:" >> $OUTPUT
    find $LOG_DIR -type f -name "*.log" -exec head -1 {} \; | grep -o "^\w\+ \w\+ [0-9]\+" | head -1 | \
        xargs -I {} echo "最早: {}" >> $OUTPUT
    find $LOG_DIR -type f -name "*.log" -exec tail -1 {} \; | grep -o "^\w\+ \w\+ [0-9]\+" | tail -1 | \
        xargs -I {} echo "最近: {}" >> $OUTPUT
    echo "" >> $OUTPUT

    # 3. 最活跃系统
    echo "3. 最活跃系统 (前10):" >> $OUTPUT
    find $LOG_DIR -type f -name "*.log" -exec cat {} \; | \
        grep "call to" | awk '{print $5}' | sort | uniq -c | sort -rn | head -10 >> $OUTPUT
    echo "" >> $OUTPUT

    # 4. 错误统计
    echo "4. 错误统计:" >> $OUTPUT
    echo "总错误数: $(grep -i "fail\|error\|denied\|timeout" $LOG_DIR/*.log 2>/dev/null | wc -l)" >> $OUTPUT
    echo "按类型统计:" >> $OUTPUT
    grep -i "fail\|error\|denied\|timeout" $LOG_DIR/*.log 2>/dev/null | \
        awk '{for(i=1;i<=NF;i++) if(tolower($i)~/fail|error|denied|timeout/) {print $i; break}}' | \
        sort | uniq -c | sort -rn >> $OUTPUT
    echo "" >> $OUTPUT

    # 5. 传输统计
    echo "5. 传输统计:" >> $OUTPUT
    echo "总传输量: $(grep -h "Kbytes\|Mbytes" $LOG_DIR/*.log 2>/dev/null | \
        awk '{if($11=="Kbytes") sum+=$9; else if($11=="Mbytes") sum+=$9 * 1024} END {print sum " Kbytes"}')" >> $OUTPUT

    echo "报告已生成: $OUTPUT"
    cat $OUTPUT
}

analyze_uucp_logs

示例5:日志轮转和管理

管理UUCP日志文件:

# 1. 查看当前日志状态
# 查看日志目录结构
tree /var/log/uucp/
# 或
ls -laR /var/log/uucp/

# 查看日志文件大小
du -sh /var/log/uucp/
du -sh /var/spool/uucp/.Log/

# 查看最老的日志文件
find /var/log/uucp -type f -name "*.log" -exec ls -lt {} + | tail -5

# 2. 手动轮转日志
# 备份当前日志
mv /var/log/uucp/Log /var/log/uucp/Log.$(date +%Y%m%d)
mv /var/log/uucp/Debug /var/log/uucp/Debug.$(date +%Y%m%d)
mv /var/log/uucp/Stats /var/log/uucp/Stats.$(date +%Y%m%d)

# 创建新日志文件
touch /var/log/uucp/Log /var/log/uucp/Debug /var/log/uucp/Stats
chown uucp:uucp /var/log/uucp/*.log
chmod 644 /var/log/uucp/*.log

# 重启UUCP服务
systemctl restart uucp

# 3. 清理旧日志
# 删除30天前的日志
find /var/log/uucp -name "*.log.*" -mtime +30 -delete
find /var/spool/uucp/.Log -type f -mtime +30 -delete
find /var/spool/uucp/.Admin -type f -mtime +30 -delete

# 压缩旧日志
find /var/log/uucp -name "*.log.*" -mtime +7 -exec gzip {} \;

# 4. 配置logrotate自动管理
# 创建logrotate配置文件
cat > /etc/logrotate.d/uucp << 'EOF'
/var/log/uucp/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 644 uucp uucp
    sharedscripts
    postrotate
        systemctl reload uucp >/dev/null 2>&1 || true
    endscript
}

/var/spool/uucp/.Log/*/* {
    weekly
    missingok
    rotate 8
    compress
    delaycompress
    notifempty
    create 640 uucp uucp
}
EOF

# 测试logrotate配置
logrotate -d /etc/logrotate.d/uucp
# 手动执行轮转
logrotate -f /etc/logrotate.d/uucp

# 5. 日志归档脚本
#!/bin/bash
# UUCP日志归档脚本
BACKUP_DIR="/backup/uucp-logs"
DATE=$(date +%Y%m%d)
RETENTION_DAYS=90

# 创建备份目录
mkdir -p $BACKUP_DIR

# 归档当前日志
tar -czf $BACKUP_DIR/uucp-logs-$DATE.tar.gz \
    /var/log/uucp/ \
    /var/spool/uucp/.Log/ \
    /var/spool/uucp/.Admin/ 2>/dev/null

# 记录归档信息
echo "$(date) - 归档完成: $BACKUP_DIR/uucp-logs-$DATE.tar.gz" >> $BACKUP_DIR/archive.log

# 清理旧备份
find $BACKUP_DIR -name "uucp-logs-*.tar.gz" -mtime +$RETENTION_DAYS -delete
find $BACKUP_DIR -name "archive.log" -mtime +365 -delete

# 6. 监控日志增长
#!/bin/bash
# 监控UUCP日志增长
LOG_DIR="/var/log/uucp"
THRESHOLD_MB=100
CHECK_INTERVAL=3600  # 1小时

while true; do
    # 计算日志总大小
    SIZE_MB=$(du -sm $LOG_DIR | cut -f1)

    if [ $SIZE_MB -gt $THRESHOLD_MB ]; then
        echo "$(date) - 警告: UUCP日志大小 ${SIZE_MB}MB 超过阈值 ${THRESHOLD_MB}MB" | \
            tee -a /var/log/uucp-monitor.log

        # 发送警报
        echo "UUCP日志大小: ${SIZE_MB}MB" | mail -s "UUCP日志警报" admin@example.com

        # 自动轮转
        systemctl reload uucp
    fi

    sleep $CHECK_INTERVAL
done

# 7. 日志分析报告
#!/bin/bash
# 生成UUCP日志分析报告
REPORT_FILE="/var/log/uucp/report-$(date +%Y%m%d).html"

# 生成HTML报告
cat > $REPORT_FILE << EOF
<!DOCTYPE html>
<html>
<head>
    <title>UUCP日志分析报告</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; }
        h1 { color: #333; }
        .section { margin: 20px 0; padding: 15px; border: 1px solid #ddd; }
        .error { color: #d00; }
        .warning { color: #f90; }
        table { border-collapse: collapse; width: 100%; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        th { background-color: #f2f2f2; }
    </style>
</head>
<body>
    <h1>UUCP日志分析报告</h1>
    <p>生成时间: $(date)</p>

    <div class="section">
        <h2>总体统计</h2>
        <pre>$(uulog | wc -l) 行日志</pre>
        <pre>$(grep -c "call to" /var/log/uucp/Log) 次连接</pre>
    </div>

    <div class="section">
        <h2>系统活跃度</h2>
        <table>
            <tr><th>系统</th><th>连接次数</th></tr>
            $(uulog | grep "call to" | awk '{print $5}' | sort | uniq -c | sort -rn | \
              awk '{print "<tr><td>" $2 "</td><td>" $1 "</td></tr>"}')
        </table>
    </div>

    <div class="section">
        <h2>错误统计</h2>
        <table>
            <tr><th>错误类型</th><th>次数</th></tr>
            $(grep -i "fail\|error\|denied\|timeout" /var/log/uucp/Log | \
              awk '{for(i=1;i<=NF;i++) if(tolower($i)~/fail|error|denied|timeout/) {print $i; break}}' | \
              sort | uniq -c | sort -rn | \
              awk '{print "<tr><td>" $2 "</td><td>" $1 "</td></tr>"}')
        </table>
    </div>
</body>
</html>
EOF

echo "报告已生成: $REPORT_FILE"

示例6:故障排查脚本

使用脚本自动化UUCP故障排查:

#!/bin/bash
# 文件名: uucp-troubleshoot.sh
# UUCP故障排查脚本

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志文件
LOG_FILE="/var/log/uucp-troubleshoot.log"

# 函数:记录日志
log() {
    echo -e "$1"
    echo -e "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}

# 函数:检查命令是否存在
check_command() {
    if ! command -v $1 &> /dev/null; then
        log "${RED}错误: $1 命令未找到${NC}"
        return 1
    fi
    return 0
}

# 函数:检查服务状态
check_service() {
    log "${BLUE}[步骤1] 检查UUCP服务状态...${NC}"

    # 检查uucico进程
    if ps aux | grep -q "[u]ucico"; then
        log "${GREEN}✓ uucico进程正在运行${NC}"
    else
        log "${RED}✗ uucico进程未运行${NC}"
        log "${YELLOW}尝试启动UUCP服务...${NC}"
        systemctl start uucp
        sleep 2
    fi

    # 检查uuxqt进程
    if ps aux | grep -q "[u]uxqt"; then
        log "${GREEN}✓ uuxqt进程正在运行${NC}"
    else
        log "${RED}✗ uuxqt进程未运行${NC}"
    fi

    # 检查系统服务状态
    if systemctl is-active uucp &> /dev/null; then
        log "${GREEN}✓ UUCP系统服务正在运行${NC}"
    else
        log "${RED}✗ UUCP系统服务未运行${NC}"
    fi
}

# 函数:检查日志文件
check_logs() {
    log "${BLUE}[步骤2] 检查日志文件...${NC}"

    # 检查日志目录
    if [ -d "/var/log/uucp" ]; then
        log "${GREEN}✓ 日志目录存在: /var/log/uucp${NC}"

        # 检查主日志文件
        if [ -f "/var/log/uucp/Log" ]; then
            LOG_SIZE=$(du -h /var/log/uucp/Log | cut -f1)
            LOG_LINES=$(wc -l < /var/log/uucp/Log)
            log "${GREEN}✓ 主日志文件存在: $LOG_SIZE, $LOG_LINES 行${NC}"

            # 检查最近错误
            log "${YELLOW}最近错误:${NC}"
            tail -20 /var/log/uucp/Log | grep -i "error\|fail\|denied\|timeout" | head -5 || \
                log "${GREEN}没有发现最近错误${NC}"
        else
            log "${RED}✗ 主日志文件不存在${NC}"
        fi

        # 检查调试日志
        if [ -f "/var/log/uucp/Debug" ]; then
            log "${GREEN}✓ 调试日志文件存在${NC}"
        fi
    else
        log "${RED}✗ 日志目录不存在${NC}"
        log "${YELLOW}创建日志目录...${NC}"
        mkdir -p /var/log/uucp
        chown uucp:uucp /var/log/uucp
    fi
}

# 函数:检查权限
check_permissions() {
    log "${BLUE}[步骤3] 检查权限...${NC}"

    # 检查spool目录权限
    if [ -d "/var/spool/uucp" ]; then
        PERM=$(stat -c "%a %U %G" /var/spool/uucp)
        if [[ $PERM =~ "755 uucp uucp" ]]; then
            log "${GREEN}✓ spool目录权限正确: $PERM${NC}"
        else
            log "${RED}✗ spool目录权限错误: $PERM${NC}"
            log "${YELLOW}应为: 755 uucp uucp${NC}"
        fi
    fi

    # 检查日志目录权限
    if [ -d "/var/log/uucp" ]; then
        PERM=$(stat -c "%a %U %G" /var/log/uucp)
        if [[ $PERM =~ "755 uucp uucp" ]]; then
            log "${GREEN}✓ 日志目录权限正确: $PERM${NC}"
        else
            log "${RED}✗ 日志目录权限错误: $PERM${NC}"
        fi
    fi
}

# 函数:检查配置
check_config() {
    log "${BLUE}[步骤4] 检查配置...${NC}"

    # 检查配置文件
    CONFIG_FILES="/etc/uucp/sys /etc/uucp/config /etc/uucp/port"

    for file in $CONFIG_FILES; do
        if [ -f "$file" ]; then
            log "${GREEN}✓ 配置文件存在: $file${NC}"

            # 检查配置文件语法
            if [ "$file" = "/etc/uucp/sys" ]; then
                SYSTEMS=$(grep -c "^system" $file 2>/dev/null || echo 0)
                log "${YELLOW}  配置了 $SYSTEMS 个系统${NC}"
            fi
        else
            log "${RED}✗ 配置文件不存在: $file${NC}"
        fi
    done
}

# 函数:检查网络连接
check_network() {
    log "${BLUE}[步骤5] 检查网络连接...${NC}"

    # 从配置中获取系统列表
    if [ -f "/etc/uucp/sys" ]; then
        SYSTEMS=$(grep "^system" /etc/uucp/sys | awk '{print $2}' | head -3)

        for system in $SYSTEMS; do
            log "${YELLOW}测试连接系统: $system${NC}"

            # 尝试解析主机名
            if host $system &> /dev/null; then
                log "${GREEN}✓ DNS解析成功: $system${NC}"
            else
                log "${RED}✗ DNS解析失败: $system${NC}"
            fi

            # 尝试ping
            if ping -c 2 -W 1 $system &> /dev/null; then
                log "${GREEN}✓ Ping成功: $system${NC}"
            else
                log "${RED}✗ Ping失败: $system${NC}"
            fi
        done
    fi
}

# 函数:检查最近活动
check_recent_activity() {
    log "${BLUE}[步骤6] 检查最近活动...${NC}"

    # 检查最近24小时的活动
    RECENT_COUNT=$(uulog -t "yesterday" 2>/dev/null | wc -l)

    if [ $RECENT_COUNT -gt 0 ]; then
        log "${GREEN}✓ 最近24小时有 $RECENT_COUNT 行日志${NC}"

        # 显示最近活动
        log "${YELLOW}最近5条日志:${NC}"
        uulog -n 5 2>/dev/null || log "${RED}无法读取日志${NC}"
    else
        log "${RED}✗ 最近24小时没有日志活动${NC}"
    fi

    # 检查作业队列
    if command -v uustat &> /dev/null; then
        QUEUE_COUNT=$(uustat -a 2>/dev/null | wc -l)
        if [ $QUEUE_COUNT -gt 0 ]; then
            log "${YELLOW}有 $((QUEUE_COUNT-1)) 个作业在队列中${NC}"
            uustat -a 2>/dev/null | head -5
        else
            log "${GREEN}✓ 作业队列为空${NC}"
        fi
    fi
}

# 函数:生成报告
generate_report() {
    log "${BLUE}[步骤7] 生成故障排查报告...${NC}"

    REPORT_FILE="/tmp/uucp-troubleshoot-$(date +%Y%m%d-%H%M%S).txt"

    {
        echo "=== UUCP故障排查报告 ==="
        echo "生成时间: $(date)"
        echo "主机名: $(hostname)"
        echo ""
        echo "1. 服务状态:"
        ps aux | grep -E "[u]ucico|[u]uxqt"
        echo ""
        echo "2. 最近错误:"
        tail -50 /var/log/uucp/Log 2>/dev/null | grep -i "error\|fail\|denied" | tail -10
        echo ""
        echo "3. 配置摘要:"
        ls -la /etc/uucp/
        echo ""
        echo "4. 权限检查:"
        ls -ld /var/spool/uucp /var/log/uucp
        echo ""
        echo "5. 日志文件状态:"
        find /var/log/uucp -type f -exec du -h {} \;
    } > $REPORT_FILE

    log "${GREEN}报告已生成: $REPORT_FILE${NC}"
    echo ""
    log "${YELLOW}=== 故障排查完成 ===${NC}"

    # 显示报告摘要
    tail -20 $REPORT_FILE
}

# 主函数
main() {
    echo -e "${BLUE}=== 开始UUCP故障排查 ===${NC}"
    echo "日志文件: $LOG_FILE"
    echo ""

    # 检查必要命令
    check_command uulog || exit 1

    # 执行检查步骤
    check_service
    check_logs
    check_permissions
    check_config
    check_network
    check_recent_activity
    generate_report
}

# 运行主函数
main

现代替代工具

journalctl

systemd日志查看工具,替代uulog查看系统日志。

# 查看系统日志
journalctl
# 查看特定服务
journalctl -u uucp
# 实时查看
journalctl -f
# 按时间过滤
journalctl --since "2023-01-01" --until "2023-12-31"
# 查看错误
journalctl -p err
rsyslog

现代系统日志守护进程,功能强大。

# 查看配置
cat /etc/rsyslog.conf
# 测试配置
rsyslogd -N1
# 查看日志
tail -f /var/log/syslog
# 自定义日志规则
# 在/etc/rsyslog.d/中添加配置
logrotate

日志轮转工具,管理日志文件。

# 配置日志轮转
nano /etc/logrotate.d/myapp
# 手动轮转
logrotate -f /etc/logrotate.conf
# 测试配置
logrotate -d /etc/logrotate.d/myapp
multitail

多窗口日志查看工具。

# 同时查看多个日志
multitail /var/log/uucp/Log /var/log/uucp/Debug
# 颜色高亮
multitail -cS syslog /var/log/syslog
# 合并显示
multitail -mergeall /var/log/*.log

常见问题

可能原因和解决方案:

  1. UUCP未安装:确保UUCP工具已安装
    # 检查安装
    which uulog
    # 如未安装
    sudo apt-get install uucp  # Debian/Ubuntu
    sudo yum install uucp      # RHEL/CentOS
  2. 日志目录不存在:创建日志目录
    sudo mkdir -p /var/log/uucp
    sudo chown uucp:uucp /var/log/uucp
    sudo chmod 755 /var/log/uucp
    # 创建空日志文件
    sudo touch /var/log/uucp/Log
    sudo chown uucp:uucp /var/log/uucp/*
  3. 权限问题:检查权限
    ls -la /var/log/uucp/
    # 应该是 uucp:uucp 和 755 权限
    # 修复权限
    sudo chown -R uucp:uucp /var/log/uucp
    sudo chmod 755 /var/log/uucp
  4. 没有日志活动:UUCP可能没有活动
    # 手动生成测试日志
    sudo su - uucp -c "echo '测试日志' >> /var/log/uucp/Log"
    # 然后查看
    uulog
  5. 使用绝对路径:指定日志文件路径
    uulog -l /var/log/uucp/Log
    # 或直接查看
    cat /var/log/uucp/Log

迁移步骤:

  1. 设置syslog转发:配置UUCP日志发送到syslog
    # 编辑UUCP配置
    sudo nano /etc/uucp/config
    # 添加:
    logfile = /var/log/syslog
    # 或配置rsyslog转发
    sudo nano /etc/rsyslog.d/10-uucp.conf
    # 添加:
    if $programname == 'uucp' then /var/log/uucp.log
    # 重启服务
    sudo systemctl restart rsyslog uucp
  2. 使用journalctl:配置systemd日志
    # 查看UUCP日志
    journalctl -u uucp
    # 实时查看
    journalctl -u uucp -f
    # 导出旧日志
    journalctl -u uucp --since "2020-01-01" > uucp-history.log
  3. 配置logrotate:管理日志文件
    # 创建logrotate配置
    sudo nano /etc/logrotate.d/uucp
    # 内容:
    /var/log/uucp/*.log {
        daily
        rotate 30
        compress
        missingok
        notifempty
        create 640 uucp uucp
        sharedscripts
        postrotate
            systemctl reload uucp >/dev/null 2>&1 || true
        endscript
    }
  4. 设置日志监控:使用现代监控工具
    # 使用logwatch
    sudo apt-get install logwatch
    # 配置监控UUCP日志
    # 或使用fail2ban
    sudo apt-get install fail2ban
    # 配置监控UUCP失败登录
  5. 迁移脚本:自动化迁移
    #!/bin/bash
    # 迁移UUCP日志到syslog
    OLD_LOG="/var/log/uucp/Log"
    NEW_LOG="/var/log/syslog"
    
    if [ -f "$OLD_LOG" ]; then
        # 转换时间戳格式
        awk '{print strftime("%b %d %H:%M:%S"), $0}' "$OLD_LOG" >> "$NEW_LOG"
    
        # 备份旧日志
        mv "$OLD_LOG" "$OLD_LOG.$(date +%Y%m%d).bak"
    
        # 配置UUCP使用syslog
        echo "logfile = /var/log/syslog" >> /etc/uucp/config
    fi

安全监控配置:

  1. 配置实时警报:
    #!/bin/bash
    # 实时监控UUCP安全事件
    while true; do
        # 检查失败登录
        FAIL_COUNT=$(uulog -t "5 minutes ago" 2>/dev/null | grep -c "failed\|denied")
    
        if [ $FAIL_COUNT -gt 3 ]; then
            echo "警报: $FAIL_COUNT 次失败登录尝试" | \
                mail -s "UUCP安全警报" admin@example.com
        fi
    
        # 检查异常时间活动
        HOUR=$(date +%H)
        if [ $HOUR -gt 22 ] || [ $HOUR -lt 6 ]; then
            NIGHT_COUNT=$(uulog -t "1 hour ago" 2>/dev/null | grep -c "call to")
            if [ $NIGHT_COUNT -gt 0 ]; then
                echo "警报: 夜间UUCP活动" | \
                    mail -s "UUCP夜间活动警报" admin@example.com
            fi
        fi
    
        sleep 300  # 5分钟检查一次
    done
  2. 使用fail2ban:
    # 配置fail2ban监控UUCP
    sudo nano /etc/fail2ban/jail.local
    # 添加:
    [uucp]
    enabled = true
    port = 540
    filter = uucp
    logpath = /var/log/uucp/Log
    maxretry = 3
    bantime = 3600
    
    # 创建过滤器
    sudo nano /etc/fail2ban/filter.d/uucp.conf
    # 内容:
    [Definition]
    failregex = ^.*login failed.*$
                ^.*permission denied.*$
    ignoreregex =
  3. 审计配置:
    # 安装审计工具
    sudo apt-get install auditd
    # 监控UUCP相关文件
    sudo auditctl -w /etc/uucp/ -p wa -k uucp_config
    sudo auditctl -w /var/log/uucp/ -p wa -k uucp_logs
    # 查看审计日志
    ausearch -k uucp_config
  4. 定期安全扫描:
    #!/bin/bash
    # UUCP安全扫描脚本
    SCAN_DATE=$(date +%Y%m%d)
    REPORT="/var/log/uucp/security-scan-$SCAN_DATE.txt"
    
    {
        echo "=== UUCP安全扫描报告 $SCAN_DATE ==="
        echo ""
    
        # 1. 检查配置文件权限
        echo "1. 配置文件权限:"
        find /etc/uucp -type f -exec ls -la {} \;
    
        # 2. 检查日志中的可疑活动
        echo ""
        echo "2. 可疑活动检查:"
        grep -i "failed\|denied\|error\|warning" /var/log/uucp/Log | tail -20
    
        # 3. 检查异常连接
        echo ""
        echo "3. 异常连接检查:"
        uulog | awk '/call to/ {print $5}' | sort | uniq -c | sort -rn
    
        # 4. 检查系统账号
        echo ""
        echo "4. UUCP账号检查:"
        grep -E "^uucp|^uucpa" /etc/passwd
        grep -E "^uucp" /etc/shadow
    
    } > $REPORT
    
    echo "安全扫描完成: $REPORT"

日志备份和分析策略:

  1. 自动化备份:
    #!/bin/bash
    # UUCP日志备份脚本
    BACKUP_DIR="/backup/uucp-logs"
    DATE=$(date +%Y%m%d)
    RETENTION_DAYS=365
    
    # 创建备份目录
    mkdir -p $BACKUP_DIR/$DATE
    
    # 备份当前日志
    cp -r /var/log/uucp/* $BACKUP_DIR/$DATE/
    cp -r /var/spool/uucp/.Log $BACKUP_DIR/$DATE/
    cp -r /var/spool/uucp/.Admin $BACKUP_DIR/$DATE/
    
    # 压缩备份
    tar -czf $BACKUP_DIR/uucp-logs-$DATE.tar.gz -C $BACKUP_DIR $DATE
    
    # 清理临时目录
    rm -rf $BACKUP_DIR/$DATE
    
    # 删除旧备份
    find $BACKUP_DIR -name "uucp-logs-*.tar.gz" -mtime +$RETENTION_DAYS -delete
    
    echo "备份完成: $BACKUP_DIR/uucp-logs-$DATE.tar.gz"
  2. 日志分析数据库:
    # 创建数据库表
    CREATE TABLE uucp_logs (
        id INT AUTO_INCREMENT PRIMARY KEY,
        log_date DATETIME,
        system_name VARCHAR(100),
        event_type VARCHAR(50),
        message TEXT,
        bytes_sent INT,
        bytes_received INT,
        duration INT
    );
    
    # 导入日志到数据库
    # 使用脚本解析日志并插入数据库
    #!/bin/bash
    while IFS= read -r line; do
        # 解析日志行
        # 插入数据库
        mysql -u user -p db -e "INSERT INTO uucp_logs ..."
    done < /var/log/uucp/Log
    
    # 查询分析
    # 最活跃系统
    SELECT system_name, COUNT(*) as connections
    FROM uucp_logs
    GROUP BY system_name
    ORDER BY connections DESC;
    
    # 传输统计
    SELECT DATE(log_date) as day,
           SUM(bytes_sent) as sent,
           SUM(bytes_received) as received
    FROM uucp_logs
    GROUP BY day;
  3. 使用ELK Stack:
    # 配置Logstash收集UUCP日志
    # logstash-uucp.conf
    input {
        file {
            path => "/var/log/uucp/Log"
            start_position => "beginning"
        }
    }
    
    filter {
        grok {
            match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{DATA:program}\[%{NUMBER:pid}\]: %{GREEDYDATA:message}" }
        }
    }
    
    output {
        elasticsearch {
            hosts => ["localhost:9200"]
            index => "uucp-%{+YYYY.MM.dd}"
        }
    }
    
    # 在Kibana中可视化
    # 创建仪表板显示:
    # - 连接趋势图
    # - 错误率
    # - 传输量统计
    # - 最活跃系统
  4. 长期归档:
    # 归档到云存储
    # 使用AWS S3
    aws s3 cp /backup/uucp-logs-20230101.tar.gz s3://my-bucket/uucp-logs/
    # 或使用rsync到远程服务器
    rsync -avz /backup/uucp-logs-*.tar.gz user@backup-server:/backup/uucp/
    
    # 设置保留策略
    # 本地: 1年
    # 云存储: 7年
    # 磁带归档: 永久
    
    # 验证备份完整性
    sha256sum /backup/uucp-logs-20230101.tar.gz > /backup/uucp-logs-20230101.sha256
    # 恢复时验证
    sha256sum -c /backup/uucp-logs-20230101.sha256