脚本怎样使用SFTP传输文件

wen 实用脚本 30

本文目录导读:

脚本怎样使用SFTP传输文件

  1. 命令行SFTP客户端
  2. Shell脚本示例
  3. Expect脚本(自动输入密码)
  4. Python脚本(使用paramiko)
  5. 使用lftp工具
  6. 批量传输脚本
  7. 安全建议

我来详细介绍几种使用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"

安全建议

  1. 优先使用SSH密钥认证,避免在脚本中硬编码密码
  2. 添加错误处理和日志记录
  3. 使用.ssh/config配置文件简化连接参数
  4. 设置合理超时和重试机制
  5. 对大文件使用rsync(基于SSH)可能更高效

选择合适的脚本方式取决于你的具体需求、操作系统和可用工具。

抱歉,评论功能暂时关闭!