本文目录导读:

我来详细介绍几种使用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)可能更高效
选择合适的脚本方式取决于你的具体需求、操作系统和可用工具。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播