You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python Paramiko实现远程Unix服务器间SFTP文件传输问题

解决方法:在已登录的Unix服务器上执行远程文件传输命令

你遇到的问题核心是混淆了SFTP连接的方向:当前代码里的ssh.open_sftp()是建立本地机器到目标Unix服务器的SFTP通道,所以sftp.get()会把Unix服务器上的文件拉到你的本地电脑,这和你要把文件从另一台SFTP服务器下载到Unix服务器的需求完全相反。

要实现你的需求,正确的思路是在已经登录的Unix服务器上,发起对另一台SFTP服务器的连接并执行下载操作,而不是从本地操作。下面是两种可行的方案:

方案一:使用Unix服务器自带的sftp命令行工具

大多数Unix系统都预装了OpenSSH的sftp客户端,我们可以通过exec_command()在远程服务器上执行sftp批处理命令来完成下载。

修改后的代码示例:

import paramiko

# 第一步:连接到目标Unix服务器
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("unix_server_ip", port=22, username="unix_user", password="unix_password")

# 定义SFTP下载命令:从另一台SFTP服务器拉取文件到当前Unix服务器
# 替换成你的SFTP服务器信息和文件路径
sftp_batch_cmd = """
sftp sftp_user@sftp_server_ip <<EOF
get /remote/sftp/file/path /path/on/unix/server/save/file.txt
bye
EOF
"""

# 执行命令并获取输入输出流
stdin, stdout, stderr = ssh.exec_command(sftp_batch_cmd)

# 如果SFTP服务器需要密码验证,在这里输入密码(注意要加换行符)
stdin.write("sftp_server_password\n")
stdin.flush()

# 读取执行结果
output = ''.join(stdout.readlines())
error = ''.join(stderr.readlines())

print("命令执行输出:")
print(output)
if error:
    print("错误信息:")
    print(error)

# 关闭连接
ssh.close()

注意事项:

  • 如果SFTP服务器支持密钥认证,推荐把Unix服务器的公钥添加到SFTP服务器的~/.ssh/authorized_keys中,这样就不需要手动输入密码,命令也更安全。
  • 确保Unix服务器上的sftp命令可用(一般OpenSSH安装后就自带)。
  • 路径要写绝对路径,避免因工作目录不同导致的问题。

方案二:使用scp命令替代sftp

如果SFTP服务器支持SCP协议,也可以用更简洁的scp命令来完成下载:

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("unix_server_ip", port=22, username="unix_user", password="unix_password")

# 替换为你的实际信息
scp_cmd = "scp sftp_user@sftp_server_ip:/remote/sftp/file/path /path/on/unix/server/save/file.txt"

stdin, stdout, stderr = ssh.exec_command(scp_cmd)
stdin.write("sftp_server_password\n")
stdin.flush()

output = ''.join(stdout.readlines())
error = ''.join(stderr.readlines())

print("执行结果:")
print(output)
if error:
    print("错误:")
    print(error)

ssh.close()

为什么你的原代码会报错?

原代码中的sftp = ssh.open_sftp()创建的是本地到Unix服务器的SFTP会话,sftp.get(filepath, localpath)的作用是把Unix服务器上的filepath文件下载到你的本地电脑的localpath,这和你的需求完全相反,所以会出现不符合预期的结果。

内容的提问来源于stack exchange,提问作者vaishali bisht

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:44:40