直接在两台远程计算机之间使用Python Paramiko的SFTP [英] SFTP using Python Paramiko directly between two remote machines

查看:13
本文介绍了直接在两台远程计算机之间使用Python Paramiko的SFTP的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个代码,我必须登录到Unix服务器。在那之后,我必须通过sftp进入某个服务器,并将一些文件下载到Unix服务器。我正在使用Pythons的paramiko命令登录到Unix服务器。我知道通过使用sftp.get(filepath, localpath),我可以将SFTP服务器上的文件sftp发送到本地计算机。然而,我的问题是,我必须将这些文件sftp到Unix服务器,而不是本地计算机。

import paramiko

ip = ip
username = username
password = password
port = port


ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,port,username,password)
remotefilepath = remotefilepath
unixserverlocalpath = unixserverlocalpath

transport = paramiko.Transport(host)
transport.connect(username = username, password = password)
sftp = paramiko.SFTPClient.from_transport(transport)

stdin,stdout,stderr=ssh.exec_command('some commands')
sftp.get(filepath, localpath)
stdin.write('Password')
stdin.flush()
outlines=stdout.readlines()
resp=''.join(outlines)
print(resp)
sftp.close()
transport.close()

此代码引发错误,因为它尝试在我的本地计算机而不是Unix服务器中sftp文件。

推荐答案

不允许在两个远程服务器之间传输。因此,您必须使用任何可用的SFTP客户端在其中一台服务器上启动传输。


如果服务器是公共*nix服务器,则它们确实有OpenSSH sftp client

因此使用SSHClient.exec_command执行sftp,然后使用stdin.write向其馈送sftp commands

点赞:

stdin,stdout,stderr = ssh.exec_command('sftp username@hostname')
stdin.write("get file
")
stdin.write("quit
")
stdin.flush()

但是,只有当您在运行sftp的服务器上设置了OpenSSH公钥身份验证(或任何其他无输入身份验证)时,上述方法才有效。使用口令身份验证时,情况会更加复杂,因为OpenSSH不允许您自动提供口令。如果设置get_pty=True

,您应该能够将密码写入stdin
stdin,stdout,stderr = ssh.exec_command('sftp username@hostname', get_pty=True)
stdin.write(password + "
")
stdin.write("get file
")
stdin.write("quit
")
stdin.flush()

get_pty可能会带来一些不良副作用,但我相信在这种情况下,它应该可以正常工作,不会出现问题。

有关替代方法,请参阅How to run the sftp command with a password from Bash script?


您还可以使用服务器上可用的任何其他SFTP客户端,如curllftp

或者您可以在其中一台服务器上执行python,并将Paramiko/SFTP代码提供给它。

这篇关于直接在两台远程计算机之间使用Python Paramiko的SFTP的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆