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
。