我正在尝试使用 Paramiko 连接远程服务器并将一些文件发送到其他远程服务器。我尝试了下面的代码,但它不起作用。我检查了所有连接、用户名和密码参数,没有任何问题。另外,我要传输的文件存在于正确路径中的第一个远程服务器中。
我不将文件下载到本地计算机并上传到第二台服务器的原因是,两个远程服务器之间的连接速度要快得多。
我尝试过的事情:
我将paramiko日志级别设置为debug,但找不到任何有用的信息。
我尝试从命令行从第一台服务器到第二台服务器使用相同的
scp
命令,工作正常。
我尝试在
data = stdout.readlines()
行之后通过 stdin.flush()
进行登录,但没有记录任何内容。
import paramiko
s = paramiko.SSHClient()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
s.connect("10.10.10.10", 22, username='oracle', password='oracle', timeout=4)
stdin, stdout, stderr = s.exec_command(
"scp /home/oracle/myFile.txt [email protected]:/home/oracle/myFile.txt")
stdin.write('password\n')
stdin.flush()
s.close()
您无法将密码写入 OpenSSH 的标准输入
scp
。
在shell中尝试一下,也行不通:
echo password | scp /home/oracle/myFile.txt [email protected]:/home/oracle/myFile.txt
OpenSSH 工具(包括
scp
)仅从终端读取密码。
您可以通过设置
get_pty
的
SSHClient.exec_command
参数来模拟终端:
stdin, stdout, stderr = s.exec_command("scp ...", get_pty=True)
stdin.write('password\n')
stdin.flush()
尽管启用终端仿真可能会给您带来不必要的副作用。
更好的解决方案是使用公钥身份验证。还有其他解决方法。请参阅如何将密码传递给 scp?(尽管他们内部必须执行类似于
get_pty=True
的操作)。
其他问题:
s.close()
可能会终止传输。在大多数情况下使用 stdout.readlines()
就可以了。但它可能会挂起,请参阅Paramiko ssh die/hang with big output。AutoAddPolicy
– 这样做您将失去针对 MITM 攻击 的保护。正确的解决方案请参阅Paramiko“未知服务器”。