温馨提示×

SFTP如何批量传输文件

小樊
53
2025-10-21 05:58:22
栏目: 编程语言

SFTP批量传输文件的常见方法

1. 使用命令行工具(基础批量操作)

命令行是最直接的批量传输方式,适合简单场景。核心命令包括mput(批量上传)和mget(批量下载):

  • 批量上传:连接SFTP服务器后,使用mput命令配合通配符上传本地目录所有文件。例如:
    sftp username@hostname → 输入密码 → 执行mput /local/path/*(将本地/local/path/下所有文件上传至远程当前目录)。
  • 批量下载:类似地,使用mget命令下载远程文件。例如:
    mget /remote/path/*.txt(下载远程/remote/path/下所有.txt文件至本地当前目录)。
  • 注意事项mput/mget默认会逐个确认文件传输,若需跳过确认,可添加-i参数(如mput -i /local/path/*)。

2. 编写Shell脚本(自动化批量操作)

通过Shell脚本可自动化执行批量传输流程,避免重复输入命令:

  • 基础脚本示例:创建upload.sh文件,内容如下:
    #!/bin/bash
    sftp username@hostname <<EOF
    cd /remote/directory  # 切换至远程目标目录
    mput /local/directory/*  # 批量上传本地目录文件
    bye  # 退出SFTP会话
    EOF
    
    赋予执行权限后运行:chmod +x upload.sh./upload.sh
  • 带循环的复杂脚本:若需逐个处理文件(如添加日志),可使用for循环。例如:
    #!/bin/bash
    sftp username@hostname <<EOF
    cd /remote/directory
    $(for file in /local/directory/*; do echo "put \"$file\""; done)
    bye
    EOF
    

3. 使用Python脚本(灵活批量操作)

通过paramikopysftp库可实现更灵活的批量操作(如过滤文件类型、错误处理):

  • paramiko示例(批量上传/下载)
    import paramiko
    import os
    
    # 连接SFTP服务器
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('hostname', username='username', password='password')
    sftp = ssh.open_sftp()
    
    # 批量上传:本地目录→远程目录
    local_dir = '/local/path'
    remote_dir = '/remote/path'
    for filename in os.listdir(local_dir):
        local_file = os.path.join(local_dir, filename)
        remote_file = os.path.join(remote_dir, filename)
        sftp.put(local_file, remote_file)
    print("批量上传完成!")
    
    # 批量下载:远程目录→本地目录
    for filename in os.listdir(remote_dir):
        remote_file = os.path.join(remote_dir, filename)
        local_file = os.path.join(local_dir, filename)
        sftp.get(remote_file, local_file)
    print("批量下载完成!")
    
    sftp.close()
    ssh.close()
    
  • pysftp示例(简化版)
    import pysftp
    import os
    
    with pysftp.Connection('hostname', username='username', password='password') as sftp:
        # 批量上传
        sftp.put_d('/local/path', '/remote/path')  # 上传整个本地目录
        # 批量下载
        sftp.get_d('/remote/path', '/local/path')  # 下载整个远程目录
    

4. 图形化工具(可视化批量操作)

若偏好可视化操作,可使用以下工具:

  • FileZilla
    1. 打开FileZilla,输入服务器地址、用户名、密码连接。
    2. 左侧“本地站点”面板选择需传输的文件/文件夹,按住Ctrl键多选。
    3. 拖放到右侧“远程站点”面板对应目录,完成批量传输。
  • WinSCP
    1. 新建站点连接,输入服务器信息并登录。
    2. 左侧文件资源管理器选择文件,拖放到右侧远程目录,支持多文件快速传输。

5. 使用expect工具(自动化交互式脚本)

若需处理密码输入等交互场景,可使用expect工具编写自动化脚本:

  • 示例脚本:创建sftp_batch.exp文件,内容如下:
    #!/usr/bin/expect -f
    set timeout 20
    set host "remote_host"
    set user "username"
    set password "password"
    set local_dir "/local/path"
    set remote_dir "/remote/dir"
    
    spawn sftp $user@$host
    expect "password:"
    send "$password\r"
    expect "sftp>"
    send "cd $remote_dir\r"
    expect "sftp>"
    
    # 遍历本地目录并上传文件
    foreach file [glob -nocomplain -- $local_dir/*] {
        set filename [file tail $file]
        send "put $file $filename\r"
        expect "sftp>"
    }
    
    send "bye\r"
    expect eof
    
    赋予执行权限后运行:chmod +x sftp_batch.exp./sftp_batch.exp

0