linux uupick命令

Linux uupick命令用于接收通过uuto命令发送的文件,是UUCP(Unix-to-Unix Copy)工具集的一部分。

提示: uupick命令通常与uuto命令配合使用,用于接收从远程系统通过UUCP协议传输的文件。

语法格式

uupick [选项] [系统名]

常用选项

选项 说明
-s 系统名 只接收来自指定系统的文件
-x 调试级别 设置调试级别(1-9)
-I 配置文件 指定使用不同的配置文件
-v 显示详细信息
--help 显示帮助信息
--version 显示版本信息

交互命令

uupick命令在交互模式下支持以下命令:

命令 说明
RETURN (回车) 移动到下一个文件
d 删除当前文件
m [目录] 将当前文件移动到指定目录(默认为当前目录)
a [目录] 将所有文件移动到指定目录
p 打印(显示)当前文件的内容
q 退出uupick
Ctrl+D 退出uupick
! 执行shell命令
* 显示可用命令的帮助信息

使用示例

示例1:基本使用 - 接收文件

# 启动uupick接收文件
uupick

# 输出示例:
# From system remotehost (Wed Dec 20 10:30:00 2023)
# file document.txt
# ?
#
# 此时可以输入交互命令:
#   d - 删除文件
#   m - 移动到当前目录
#   m ~/downloads - 移动到指定目录
#   p - 查看文件内容
#   RETURN - 跳过此文件
#   q - 退出

示例2:接收特定系统的文件

# 只接收来自"backupserver"系统的文件
uupick -s backupserver

# 或者使用交互模式后指定系统
uupick backupserver

示例3:自动处理接收的文件

# 将所有文件自动移动到当前目录
echo "a" | uupick

# 将所有文件移动到指定目录
echo "a ~/incoming" | uupick

# 删除所有接收到的文件(谨慎使用)
echo "d*a" | uupick

示例4:在脚本中自动接收文件

#!/bin/bash
# 自动接收UUCP文件的脚本

# 设置接收目录
RECEIVE_DIR="$HOME/incoming"
mkdir -p "$RECEIVE_DIR"

# 接收所有文件并自动移动到指定目录
echo "a $RECEIVE_DIR" | uupick -s backupserver

# 检查是否成功接收文件
if [ -n "$(ls -A $RECEIVE_DIR 2>/dev/null)" ]; then
    echo "成功接收文件到 $RECEIVE_DIR"
    ls -la "$RECEIVE_DIR"
else
    echo "没有接收到新文件"
fi

示例5:查看文件内容后再决定

# 在uupick交互界面中查看文件内容
uupick

# 输出示例:
# From system remotehost (Wed Dec 20 10:30:00 2023)
# file report.txt
# ?
#
# 输入p查看文件内容:
# p
#
# 显示文件内容后,再决定如何处理:
# m - 保存文件
# d - 删除文件
# RETURN - 跳过此文件

示例6:调试模式

# 使用调试模式运行uupick
uupick -x 3

# 显示详细信息
uupick -v

示例7:完整工作流程

# 发送方使用uuto发送文件
uuto -m document.txt backupserver!username

# 接收方使用uupick接收文件
uupick

# 交互过程:
# From system backupserver (Wed Dec 20 10:30:00 2023)
# file document.txt
# ? m ~/downloads    # 将文件移动到downloads目录
# 移动完成
#
# 没有更多文件时显示:
# No more files from any systems.

示例8:处理多个系统的文件

# 接收来自所有系统的文件
uupick

# 当有多个系统的文件时,uupick会依次显示:
# From system system1 (时间)
# file file1.txt
# ? m
#
# From system system2 (时间)
# file file2.pdf
# ? d    # 删除不需要的文件
#
# 处理完所有文件后退出

文件存储位置

通过uuto发送的文件默认存储在接收方系统的以下位置:

/var/spool/uucppublic/receive/用户名/发送方系统名/

例如,用户alice从系统backupserver接收到的文件通常位于:

/var/spool/uucppublic/receive/alice/backupserver/

检查接收队列

# 查看是否有等待接收的文件
ls -la /var/spool/uucppublic/receive/$USER/

# 或者查看所有用户的接收队列
ls -la /var/spool/uucppublic/receive/*/*/
注意:
  • uupick命令需要在接收方系统上运行
  • 接收的文件默认存储在公共spool目录中,可能所有用户都可访问
  • 使用d命令删除文件时要谨慎,删除后无法恢复
  • 如果长时间不运行uupick,接收队列可能会积累大量文件
  • 某些系统可能需要配置权限才能正确接收文件
  • uupick通常以交互模式运行,但也可以通过管道自动化
  • 确保UUCP服务正确配置并运行

UUCP工作流程

发送方:
  1. 使用uuto命令发送文件
  2. 文件被放入本地spool队列
  3. UUCP守护进程(uucico)处理传输
  4. 文件传输到接收方系统
接收方:
  1. 文件存储在公共接收目录
  2. 用户运行uupick命令
  3. 选择如何处理接收的文件
  4. 文件被移动到指定位置或删除

自动清理脚本

#!/bin/bash
# 自动接收并清理UUCP文件的脚本

# 设置变量
MAX_AGE_DAYS=30  # 最长保留天数
RECEIVE_DIR="/var/spool/uucppublic/receive"

# 自动接收所有文件到用户目录
for user_dir in $RECEIVE_DIR/*/; do
    if [ -d "$user_dir" ]; then
        user=$(basename "$user_dir")
        # 自动接收文件到用户home目录的incoming子目录
        user_home=$(eval echo ~$user)
        target_dir="$user_home/incoming"
        mkdir -p "$target_dir"

        echo "处理用户 $user 的接收文件"
        echo "a $target_dir" | sudo -u "$user" uupick
    fi
done

# 清理旧文件
echo "清理超过 $MAX_AGE_DAYS 天的旧文件"
find $RECEIVE_DIR -type f -mtime +$MAX_AGE_DAYS -delete
find $RECEIVE_DIR -type d -empty -delete

故障排除

问题:uupick无响应

可能原因: 没有待接收的文件

解决: 检查接收队列

# 检查是否有文件等待接收
ls -la /var/spool/uucppublic/receive/$USER/
# 或检查所有用户的队列
ls -la /var/spool/uucppublic/receive/
问题:权限错误

解决: 检查目录权限

# 确保用户有权访问spool目录
ls -ld /var/spool/uucppublic/receive/
# 确保UUCP服务运行
ps aux | grep uucico
问题:文件接收不完整

解决: 检查传输日志

# 查看UUCP日志
tail -f /var/log/uucp/Log
# 或
tail -f /var/log/uucp/DEBUG
问题:无法移动文件

解决: 检查目标目录权限

# 确保目标目录存在且有写入权限
mkdir -p ~/incoming
chmod 755 ~/incoming

安全注意事项

  • UUCP传输默认不加密,敏感文件应使用加密传输
  • 定期清理接收队列,防止磁盘空间耗尽
  • 限制可发送文件的用户和系统
  • 在接收文件前检查文件来源
  • 使用防病毒软件扫描接收的文件
  • 考虑使用更现代的加密传输工具替代

相关命令

  • uuto - 发送文件到远程系统
  • uucp - UUCP文件复制命令
  • uustat - 查看UUCP状态和队列
  • uux - 在远程系统执行命令
  • uuname - 列出已知的UUCP系统
  • uucico - UUCP通信守护进程