ubuntu

ubuntu sftp如何进行自动化管理

小樊
32
2025-11-23 10:29:01
栏目: 智能运维

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

0
看了该问题的人还看了