Python subprocess + scp - 无法读取所有输出

时间:2011-06-08 22:40:21

标签: python linux ssh scp

我正在尝试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'

2 个答案:

答案 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).