SFTP如何批量传输文件
作者:WeekendFlower
时间:2026-06-26
来源:互联网
浏览:0
SFTP批量传输文件可通过mput和mget命令配合通配符实现批量上传下载,加-i参数避免确认提示;可编写Shell脚本实现自动化定时传输;可视化图形工具如FileZilla等提供可定制界面,支持断点续传、目录同步等功能,显著提高传输效率且易于使用,满足多种场景需求。
在日常运维或开发工作中,SFTP批量传输文件是再常见不过的需求了。虽说单文件传输可以用最简单的命令搞定,但一旦要批量处理几十上百个文件,就得讲究点方法。从最朴素的命令行到灵活可定制的脚本,再到可视化的图形工具,本文拆解几种主流方案,帮你找到最适合自己场景的那一套。

1. 使用命令行工具(基础批量操作)
命令行当然是最直接的批量传输方式,适合那些不想折腾环境、一次性的操作。核心就两个命令:mput(批量上传)和mget(批量下载)。
- 批量上传:先通过
sftp username@hostname连上服务器,输入密码后,执行mput /local/path/*,本地/local/path/目录下的所有文件就被一股脑传到远程当前目录了。 - 批量下载:类似的,用
mget /remote/path/*.txt就能把远程目录下所有.txt文件拉到本地。 - 需要留个心眼的是:
mput和mget默认会逐个问你“传不传这个文件?”,如果不想确认,加个-i参数就行,比如mput -i /local/path/*。
2. 编写Shell脚本(自动化批量操作)
每次重复输入命令毕竟不是长久之计。把批量传输的流程封装成一个Shell脚本,以后跑一次就完事。
- 基础脚本示例:写个
upload.sh文件,内容如下:
然后#!/bin/bash sftp username@hostname <chmod +x upload.sh赋予执行权限,运行./upload.sh即可。 - 如果需要更精细的控制——比如每个文件传输后记个日志——可以配合
for循环。例如:#!/bin/bash sftp username@hostname <
3. 使用Python脚本(灵活批量操作)
当需求变得复杂——比如只传输图片文件、传输失败自动重试、或者记录详细传输日志——Python脚本的优势就体现出来了。常用库有paramiko和pysftp。
- paramiko示例(批量上传/下载):
import paramiko import os 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和WinSCP是两款很成熟的选择,操作起来跟本地文件管理器差不多。
- FileZilla:连接服务器后,左侧“本地站点”面板选中需要传输的文件或文件夹(按住
Ctrl多选),直接拖到右侧“远程站点”面板对应的目录,文件就自动开始批量传输了。 - WinSCP:新建站点配置好服务器信息并登录,左侧是本地文件浏览器,右侧是远程目录,同样拖放即可完成批量操作,支持多文件同时传输。
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 eofchmod +x sftp_batch.exp→./sftp_batch.exp。
