SFTP 在两台远程机器之间直接使用 Python Paramiko
SFTP using Python Paramiko directly between two remote machines
我有一个必须登录到 Unix 服务器的代码。之后,我必须通过 sftp 进入某个服务器,并将一些文件下载到该 Unix 服务器。我正在使用 Pythons 的 Paramiko 命令登录到 Unix 服务器。我知道通过使用 sftp.get(filepath, localpath)
,我可以将文件从 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
to execute sftp
and then use stdin.write
to feed sftp
commands吧。
喜欢:
stdin,stdout,stderr = ssh.exec_command('sftp username@hostname')
stdin.write("get file\n")
stdin.write("quit\n")
stdin.flush()
虽然以上方法仅适用于您 运行 sftp
服务器上的 OpenSSH public 密钥身份验证设置(或任何其他无输入身份验证)。使用密码身份验证时,它会更加复杂,因为 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 代码。
我有一个必须登录到 Unix 服务器的代码。之后,我必须通过 sftp 进入某个服务器,并将一些文件下载到该 Unix 服务器。我正在使用 Pythons 的 Paramiko 命令登录到 Unix 服务器。我知道通过使用 sftp.get(filepath, localpath)
,我可以将文件从 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
to execute sftp
and then use stdin.write
to feed sftp
commands吧。
喜欢:
stdin,stdout,stderr = ssh.exec_command('sftp username@hostname')
stdin.write("get file\n")
stdin.write("quit\n")
stdin.flush()
虽然以上方法仅适用于您 运行 sftp
服务器上的 OpenSSH public 密钥身份验证设置(或任何其他无输入身份验证)。使用密码身份验证时,它会更加复杂,因为 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 代码。