Ubuntu SFTP自动化管理实践
一 基础准备与连接加固
二 自动化方式对比与选型
| 方式 | 适用场景 | 关键要点 | 主要优缺点 |
|---|---|---|---|
| 命令行 SFTP + Here Document | 简单上传/下载、一次性批处理 | 借助 <<EOF 输入 SFTP 命令;配合密钥免交互 | 轻量、系统自带;复杂逻辑与错误处理较弱 |
| Shell + expect/sshpass | 必须用密码、交互式会话 | 自动应答 password;可批量 put/get | 上手快;密码明文风险、可维护性一般 |
| Python Paramiko/SCP | 复杂流程、可编排、可观测 | 细粒度控制连接、重试、日志、进度 | 生态强、可扩展;需依赖第三方库 |
| 系统工具链(rsync over SSH) | 大规模同步/镜像、增量备份 | rsync -avz -e ssh;天然增量、断点续传 | 不是 SFTP 协议,但实践中更高效可靠 |
说明:expect/sshpass 适合快速“把事做成”,但在生产环境更推荐密钥认证或改用 Paramiko/rsync。
三 脚本示例
#!/usr/bin/env bash
set -Eeuo pipefail
LOCAL_DIR="/data/backup/$(date +%F)"
REMOTE_USER="sftpuser"
REMOTE_HOST="sftp.example.com"
REMOTE_DIR="/incoming"
mkdir -p "$LOCAL_DIR"
# 使用 <<'EOF' 避免本地变量被展开;如需展开,使用 <<EOF
sftp "$REMOTE_USER@$REMOTE_HOST" <<'EOF'
cd "$REMOTE_DIR"
lcd "$LOCAL_DIR"
mput *
bye
EOF
echo "Upload finished at $(date)"
要点:优先用密钥;如需记录执行过程,可重定向日志:./backup.sh > backup.log 2>&1。
#!/usr/bin/env python3
import os, paramiko, logging
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
def sftp_upload(host, port, user, pkey_path, local_dir, remote_dir):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
key = paramiko.RSAKey.from_private_key_file(pkey_path)
ssh.connect(host, port=port, username=user, pkey=key)
sftp = ssh.open_sftp()
for root, _, files in os.walk(local_dir):
for f in files:
local_path = os.path.join(root, f)
rel = os.path.relpath(local_path, local_dir)
remote_path = os.path.join(remote_dir, rel)
os.makedirs(os.path.dirname(remote_path), exist_ok=True)
sftp.put(local_path, remote_path)
logging.info("PUT %s -> %s", local_path, remote_path)
sftp.close()
ssh.close()
if __name__ == "__main__":
sftp_upload(
host="sftp.example.com", port=22,
user="sftpuser", pkey_path="/home/ubuntu/.ssh/id_rsa",
local_dir="/data/backup/2025-11-23",
remote_dir="/incoming"
)
要点:使用私钥而非密码;可按需加入重试、校验(如 size/mtime/哈希)、并发与进度条。
四 定时调度与日志审计
# crontab -e
0 2 * * * /usr/bin/bash /opt/backup/sftp_upload.sh >> /var/log/sftp_backup.log 2>&1
五 服务端安全配置要点(如你同时运维 SFTP 服务器)
# /etc/ssh/sshd_config
Subsystem sftp internal-sftp
Match Group sftpusers
ChrootDirectory /home/sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no