在两台远程计算机之间直接使用Python Paramiko进行SFTP

时间:2019-03-30 09:38:55

标签: 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文件时抛出错误。

1 个答案:

答案 0 :(得分:1)

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


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

因此,使用SSHClient.exec_command执行 V = cov(returns) mu = colMeans(returns) mu.prime = t(mu) V.inv = solve(V) one=rep(1, 30) one.prime = t(one) A=mu.primV.inv%*%one B=mu.prime%*%V.inv%*%mu C=one.prime%*%V.inv%*%one D=B%*%C-A^2 #mvp min.return = A/C min.dv =1/C #EZp EZp <- runif(n = 99, min =min.return, max = 0.0075) %>% as.list() st.d.zi = sqrt(var(EZp)) risk = lapply(EZp, function(EZp)(sqrt(C*(EZp^2)-(2*A*EZp-B))/D)) EZp <- as.numeric(EZp) df <- cbind(EZp, risk) %>% as.data.frame() ,然后使用sftp向其提供sftp commands

赞:

stdin.write

尽管只有在运行stdin,stdout,stderr = ssh.exec_command('sftp username@hostname') stdin.write("get file\n") stdin.write("quit\n") stdin.flush() 的服务器上具有OpenSSH公钥身份验证设置(或任何其他无输入身份验证)的情况下,以上操作才有效。使用密码验证时,由于OpenSSH不允许您自动提供密码,因此更为复杂。如果您设置了sftp,则应该能够将密码写入stdin

get_pty=True

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() 可能会带来一些不良后果,但我认为在这种情况下,它应该可以正常工作。

有关其他方法,请参见How to run the sftp command with a password from Bash script?


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

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