温馨提示×

如何用SFTP批量传输文件

小樊
54
2025-09-19 10:39:39
栏目: 编程语言

如何用SFTP批量传输文件

SFTP(SSH File Transfer Protocol)支持通过命令行工具、脚本或编程语言库实现批量文件传输,以下是具体方法:

一、命令行工具批量传输

命令行是最基础的批量传输方式,适合简单场景,无需编写复杂代码。

1. 使用mput/mget命令(快速批量操作)

mput用于批量上传本地文件到远程服务器,mget用于批量下载远程文件到本地。

  • 批量上传:连接SFTP服务器后,输入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版本支持)。
2. 结合Shell循环(灵活控制单个文件)

若需要对每个文件进行个性化操作(如过滤文件类型、记录日志),可使用Shell循环(for/while)逐个传输。

  • 示例1:循环上传本地文件
    创建脚本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
  • 示例2:循环下载远程文件
    创建脚本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
3. 使用SFTP脚本文件(完全自动化)

将SFTP命令写入脚本文件,通过-b参数直接执行,避免手动输入。

  • 步骤
    1. 创建SFTP脚本文件(如upload_script.sftp):
      open username@hostname cd /path/to/remote/directory mput /path/to/local/files/* bye 
    2. 运行脚本:sftp -b upload_script.sftp

二、编程语言库批量传输

若需要更强大的功能(如进度监控、错误重试、加密传输),可使用编程语言库实现。

1. Python:使用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,调整路径即可。
2. Java:使用JSch

JSch是Java实现的SSH2库,支持SFTP操作,适合Java项目。

  • 添加依赖(Maven):
    <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密钥认证(ssh-keygen生成密钥对,将公钥上传至服务器)。
  • 增量传输:若需仅传输修改过的文件,可使用rsync命令(rsync -avz -e ssh /local/dir/ user@host:/remote/dir/),但rsync并非SFTP协议,需服务器支持。

0