我有一个必须登录到 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 客户端,例如 curl
或 lftp
。
或者您可以在其中一台服务器上执行 python
并将 Paramiko/SFTP 代码提供给它。
关于python - 直接在两台远程机器之间使用 Python Paramiko 的 SFTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55430075/