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协议,需服务器支持。