SFTP批量传输文件的常见方法
命令行是最直接的批量传输方式,适合简单场景。核心命令包括mput(批量上传)和mget(批量下载):
mput命令配合通配符上传本地目录所有文件。例如:sftp username@hostname → 输入密码 → 执行mput /local/path/*(将本地/local/path/下所有文件上传至远程当前目录)。mget命令下载远程文件。例如:mget /remote/path/*.txt(下载远程/remote/path/下所有.txt文件至本地当前目录)。mput/mget默认会逐个确认文件传输,若需跳过确认,可添加-i参数(如mput -i /local/path/*)。通过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
通过paramiko或pysftp库可实现更灵活的批量操作(如过滤文件类型、错误处理):
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()
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') # 下载整个远程目录
若偏好可视化操作,可使用以下工具:
Ctrl键多选。若需处理密码输入等交互场景,可使用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。