我正在尝试SCP机器之间的文件,当用户没有设置私有/公共证书进行无密码登录时,我需要失败。不幸的是,使用subprocess.Popen我无法弄清楚如何捕获以下输出:
The authenticity of host '***' can't be established.
RSA key fingerprint is ***.
Are you sure you want to continue connecting (yes/no)
它总是显示在控制台上,我无法在程序中找到它来检测它。
以下是一些示例代码:
proc = subprocess.Popen(['scp', 'user@server:/location/file.txt', '/someplace/file.txt',
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
proc.wait()
print 'result: %s' % repr(proc.stderr.readline())
我尝试了很多其他的排列。这个仍然提示我,而不是Python输入是/否。至少当我输入no时,我得到:
result: 'Host key verification failed.\r\n'
答案 0 :(得分:3)
'The authenticity of host '***' can't be established'
表示未通知您连接的计算机将其他目的(服务器)标识保存到known_hosts
文件,并询问您是否信任该计算机。您可以更改ssh客户端,只需自动添加它而不会提示您。
试试这个:
proc = subprocess.Popen(['scp', '-o BatchMode=yes',
'user@server:/location/file.txt',
'/someplace/file.txt'],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
proc.wait()
print 'result: %s' % repr(proc.stderr.readline())
使用上面的代码我得到:
me@myMachine:~$ python tmp.py
result: 'Host key verification failed.\r\n'
me@myMachine:~$
如果我使用禁用StrictHostKeyChecking
我得到:
me@myMachine:~$ python tmp.py
result: 'Permission denied (publickey,password,keyboard-interactive).\r\n'
me@myMachine:~$ python tmp.py
所以看起来它打开了stderr的第一行并打开了BatchMode
:)
答案 1 :(得分:2)
我之前碰到过类似的东西,不过在我的情况下它实际上是有帮助的。我相信ssh和朋友实际上并没有阅读stdin并在stdout或stderr上打印,他们会做一些时髦的事情来与你正在运行的终端挂钩。
我认为原因是他们应该能够直接与用户交谈,即使是通过包装shell脚本运行,因为用户知道密码,而不是调用脚本(可能他们故意不这样做)希望调用脚本有机会拦截密码。)
[编辑添加]:根据我系统上的手册页,scp确实有一个可能符合你想要的标志:
-B Selects batch mode (prevents asking for passwords or passphrases).