SFTP(SSH File Transfer Protocol)支持通过命令行工具、脚本或编程语言库实现批量文件传输,以下是具体方法:
命令行是最基础的批量传输方式,适合简单场景,无需编写复杂代码。
mput/mget命令(快速批量操作)mput用于批量上传本地文件到远程服务器,mget用于批量下载远程文件到本地。
mput加上本地文件路径通配符(如*),例如:sftp username@hostname sftp> mput /path/to/local/files/* # 上传本地目录下所有文件 sftp> bye # 退出SFTP mget下载远程文件:sftp username@hostname sftp> mget /path/to/remote/files/* # 下载远程目录下所有文件 sftp> bye mput/mget会逐个提示确认,若需跳过确认,可添加-r参数(递归模式,部分SFTP版本支持)。若需要对每个文件进行个性化操作(如过滤文件类型、记录日志),可使用Shell循环(for/while)逐个传输。
upload_files.sh:#!/bin/bash REMOTE_USER="username" REMOTE_HOST="hostname" REMOTE_DIR="/path/to/remote/directory" LOCAL_DIR="/path/to/local/files" sftp $REMOTE_USER@$REMOTE_HOST <<EOF cd $REMOTE_DIR $(for file in $LOCAL_DIR/*; do echo "put \"$file\""; done) bye EOF 赋予执行权限并运行:chmod +x upload_files.sh && ./upload_files.sh。download_files.sh:#!/bin/bash REMOTE_USER="username" REMOTE_HOST="hostname" REMOTE_DIR="/path/to/remote/directory" LOCAL_DIR="/path/to/local/directory" sftp $REMOTE_USER@$REMOTE_HOST <<EOF cd $REMOTE_DIR $(for file in $(ssh $REMOTE_USER@$REMOTE_HOST "ls $REMOTE_DIR"); do echo "get \"$file\" \"$LOCAL_DIR/$file\""; done) bye EOF 运行:chmod +x download_files.sh && ./download_files.sh。将SFTP命令写入脚本文件,通过-b参数直接执行,避免手动输入。
upload_script.sftp):open username@hostname cd /path/to/remote/directory mput /path/to/local/files/* bye sftp -b upload_script.sftp。若需要更强大的功能(如进度监控、错误重试、加密传输),可使用编程语言库实现。
pysftp库(推荐)pysftp是基于paramiko的SFTP库,语法简洁,适合Python开发者。
pip install pysftp。import pysftp import os # 配置SFTP连接信息 cnopts = pysftp.CnOpts() cnopts.hostkeys = None # 跳过主机密钥验证(生产环境建议开启) with pysftp.Connection( host='hostname', username='username', password='password', cnopts=cnopts ) as sftp: local_dir = '/path/to/local/files' remote_dir = '/path/to/remote/directory' # 遍历本地目录,逐个上传文件 for filename in os.listdir(local_dir): local_path = os.path.join(local_dir, filename) remote_path = os.path.join(remote_dir, filename) sftp.put(local_path, remote_path) print(f"Uploaded: {filename}") print("Batch upload completed!") put改为get,调整路径即可。JSch库JSch是Java实现的SSH2库,支持SFTP操作,适合Java项目。
<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version> </dependency> import com.jcraft.jsch.*; import java.io.File; public class SFTPBatchUpload { public static void main(String[] args) { String host = "hostname"; int port = 22; String user = "username"; String password = "password"; String remoteDir = "/path/to/remote/directory"; String localDir = "/path/to/local/files"; JSch jsch = new JSch(); Session session = null; ChannelSftp channelSftp = null; try { // 创建SSH会话 session = jsch.getSession(user, host, port); session.setPassword(password); session.setConfig("StrictHostKeyChecking", "no"); // 跳过主机密钥验证 session.connect(); // 打开SFTP通道 channelSftp = (ChannelSftp) session.openChannel("sftp"); channelSftp.connect(); channelSftp.cd(remoteDir); // 遍历本地目录,逐个上传文件 File localFolder = new File(localDir); for (File file : localFolder.listFiles()) { if (file.isFile()) { String remoteFilePath = remoteDir + "/" + file.getName(); channelSftp.put(file.getAbsolutePath(), remoteFilePath); System.out.println("Uploaded: " + file.getName()); } } System.out.println("Batch upload completed!"); } catch (JSchException | SftpException e) { e.printStackTrace(); } finally { // 关闭连接 if (channelSftp != null) channelSftp.exit(); if (session != null) session.disconnect(); } } } /home/user/files),避免相对路径错误。ssh-keygen生成密钥对,将公钥上传至服务器)。rsync命令(rsync -avz -e ssh /local/dir/ user@host:/remote/dir/),但rsync并非SFTP协议,需服务器支持。