我有一个必须登录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文件时抛出错误。
答案 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_pty
或curl
。
或者您可以在其中一台服务器上执行lftp
并将Paramiko / SFTP代码提供给它。