python - 直接在两台远程机器之间使用 Python Paramiko 的 SFTP

标签 python linux sftp paramiko

我有一个必须登录到 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 不允许在两个远程服务器之间传输。因此,您必须使用其中可用的任何 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\n")
stdin.write("quit\n")
stdin.flush()

虽然以上方法仅适用于运行 sftp 的服务器上的 OpenSSH 公钥身份验证设置(或任何其他无输入身份验证)。使用密码身份验证时,它会更加复杂,因为 OpenSSH 不允许您自动提供密码。如果设置 get_pty=True,您应该能够将密码写入 stdin:

stdin,stdout,stderr = ssh.exec_command('sftp username@hostname', get_pty=True)
stdin.write(password + "\n")
stdin.write("get file\n")
stdin.write("quit\n")
stdin.flush()

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

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


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

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

关于python - 直接在两台远程机器之间使用 Python Paramiko 的 SFTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55430075/

相关文章:

python - 在 Python 中的两个给定路径之间查找公共(public)文件的有效方法

java - 如何自动化 Eclipse Build + SFTP 文件传输?

linux - 如何检测服务器是否正在使用 SPDY

ssis - 需要将 SSIS 变量传递给执行进程任务,以便为 Winscp 创建动态命令行参数

go - 有没有办法确定当前步骤是否是目录?

python - 在模板中传递 QuerySet 对象。 Django

python - python表达式中的临时变量

python - 使用 pygame 在 python 中使图像背景透明的问题

linux - svn 导出到结帐

python - Apache 和 Flask : attempt to invoke directory as script