本文目录导读:

我来详细介绍几种使用SFTP传输文件的方法:
命令行SFTP客户端
基本用法
# 连接服务器 sftp username@hostname sftp username@hostname:port sftp -oPort=2222 username@hostname # 连接后交互式命令 sftp> ls # 列出远程目录 sftp> ll # 列出本地目录 sftp> cd /remote/path # 切换远程目录 sftp> lcd /local/path # 切换本地目录 sftp> get remote_file # 下载文件 sftp> put local_file # 上传文件 sftp> get -r remote_dir # 递归下载目录 sftp> put -r local_dir # 递归上传目录 sftp> exit # 退出
一次性命令
# 下载文件 sftp username@hostname:/remote/path/file.txt /local/path/ # 上传文件 sftp username@hostname:/remote/path/ <<< $'put /local/path/file.txt' # 使用批处理文件 sftp -b batch.txt username@hostname
Shell脚本示例
简单上传脚本
#!/bin/bash # SFTP上传脚本 HOST="example.com" USER="username" PASSWORD="password" # 建议使用密钥认证 REMOTE_PATH="/remote/directory" LOCAL_FILE="/local/path/file.txt" # 使用密钥认证(推荐) sftp -i ~/.ssh/id_rsa $USER@$HOST <<EOF cd $REMOTE_PATH put $LOCAL_FILE exit EOF echo "文件上传完成"
带错误处理的完整脚本
#!/bin/bash
# SFTP传输脚本
HOST="example.com"
USER="username"
PORT="22"
PRIVATE_KEY="$HOME/.ssh/id_rsa"
LOCAL_DIR="/local/data"
REMOTE_DIR="/remote/backup"
# 错误处理函数
error_exit() {
echo "错误: $1" >&2
exit 1
}
# 检查必要文件
[ -f "$PRIVATE_KEY" ] || error_exit "SSH密钥不存在"
# 执行SFTP操作
sftp -oPort=$PORT -i $PRIVATE_KEY $USER@$HOST <<EOF
cd $REMOTE_DIR || error_exit "无法进入远程目录"
lcd $LOCAL_DIR || error_exit "无法进入本地目录"
put *.txt
put *.csv
get logs/access.log
bye
EOF
if [ $? -eq 0 ]; then
echo "文件传输成功"
else
error_exit "SFTP传输失败"
fi
Expect脚本(自动输入密码)
#!/usr/bin/expect -f # Expect脚本处理密码认证(不推荐,但有时需要) set timeout 30 set host "example.com" set user "username" set password "your_password" set local_file "/local/data/file.txt" set remote_dir "/remote/upload" # 启动SFTP spawn sftp $user@$host expect "password:" send "$password\r" expect "sftp>" send "cd $remote_dir\r" expect "sftp>" send "put $local_file\r" expect "sftp>" send "exit\r" expect eof
Python脚本(使用paramiko)
#!/usr/bin/env python3
import paramiko
import os
def sftp_transfer(host, username, password, local_path, remote_path, transfer_type='upload'):
"""
SFTP文件传输函数
"""
try:
# 建立SSH连接
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=username, password=password)
# 创建SFTP客户端
sftp = ssh.open_sftp()
if transfer_type == 'upload':
# 确保远程目录存在
remote_dir = os.path.dirname(remote_path)
try:
sftp.stat(remote_dir)
except:
sftp.mkdir(remote_dir)
# 上传文件
sftp.put(local_path, remote_path)
print(f"上传成功: {local_path} -> {remote_path}")
elif transfer_type == 'download':
# 下载文件
sftp.get(remote_path, local_path)
print(f"下载成功: {remote_path} -> {local_path}")
# 关闭连接
sftp.close()
ssh.close()
except Exception as e:
print(f"传输失败: {e}")
# 使用示例
if __name__ == "__main__":
sftp_transfer(
host="example.com",
username="user",
password="pass",
local_path="/local/file.txt",
remote_path="/remote/file.txt",
transfer_type='upload'
)
使用lftp工具
#!/bin/bash # 使用lftp进行SFTP传输 HOST="sftp://example.com" USER="username" PASS="password" # 上传文件 lftp -u $USER,$PASS $HOST <<EOF cd /remote/path lcd /local/path put file.txt mput *.csv # 批量上传 mirror -R local_dir remote_dir # 递归上传目录 exit EOF # 下载文件 lftp -u $USER,$PASS $HOST <<EOF cd /remote/path lcd /local/path get file.txt mget *.txt # 批量下载 mirror remote_dir local_dir # 递归下载目录 exit EOF
批量传输脚本
#!/bin/bash
# 批量SFTP传输脚本
CONFIG_FILE="transfer_list.txt"
HOST="example.com"
USER="username"
KEY="~/.ssh/id_rsa"
# 配置文件格式:本地路径 远程路径 操作(upload/download)
while IFS= read -r line; do
local_path=$(echo $line | awk '{print $1}')
remote_path=$(echo $line | awk '{print $2}')
action=$(echo $line | awk '{print $3}')
if [ "$action" == "upload" ]; then
sftp -i $KEY $USER@$HOST <<EOF
put $local_path $remote_path
EOF
elif [ "$action" == "download" ]; then
sftp -i $KEY $USER@$HOST <<EOF
get $remote_path $local_path
EOF
fi
done < "$CONFIG_FILE"
安全建议
- 优先使用SSH密钥认证,避免在脚本中硬编码密码
- 添加错误处理和日志记录
- 使用.ssh/config配置文件简化连接参数
- 设置合理超时和重试机制
- 对大文件使用rsync(基于SSH)可能更高效
选择合适的脚本方式取决于你的具体需求、操作系统和可用工具。