2011-06-08 46 views
2

我试图在机器之间创建一个SCP文件,并且当用户没有设置用于执行无密码登录的私有/公共证书时,我需要失败。不幸的是,使用subprocess.Popen我无法弄清楚如何捕获以下的输出:Python子进程+ scp - 无法读取所有输出

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', '[email protected]:/location/file.txt', '/someplace/file.txt', 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE) 
proc.wait() 
print 'result: %s' % repr(proc.stderr.readline()) 

我试过很多其他的排列。这个仍然提示我,而不是Python进入是/否。至少当我键入没有,虽然我得到:

result: 'Host key verification failed.\r\n' 
+2

你可能要考虑尝试[paramiko](http://www.lag.net/paramiko/)这是一个本地的Python SSH库。你将会对连接有更多的控制权,并且不必处理Popen。 – 2011-06-08 22:43:17

+4

你正在挂stderr吗? – 2011-06-08 22:43:30

+0

@ greg-hewgill在这种情况下,我不能使用第三方库。 – sudoer 2011-06-08 22:50:26

回答

2

'The authenticity of host '***' can't be established'意味着你从不是招连接机没有被告知将其他服务器的身份保存到known_hosts文件,并询问您是否信任该计算机。您可以更改SSH客户端,只需自动添加它,而不会提示您。

试试这个:

proc = subprocess.Popen(['scp', '-o BatchMode=yes', 
           '[email protected]:/location/file.txt', 
           '/someplace/file.txt'], 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE) 
proc.wait() 
print 'result: %s' % repr(proc.stderr.readline()) 

与上面的代码我得到:

[email protected]:~$ python tmp.py 
result: 'Host key verification failed.\r\n' 
[email protected]:~$ 

如果我使用禁用StrictHostKeyChecking我得到:

[email protected]:~$ python tmp.py 
result: 'Permission denied (publickey,password,keyboard-interactive).\r\n' 
[email protected]:~$ python tmp.py 

所以它看起来像它正在打印第一行derr与BatchMode打开:)

+0

这是有帮助的,我早些时候尝试做的事,但我更感兴趣的是知道公共/私人证书没有设置,并在这种情况下出错。有没有一种方法可以让SSH在没有进一步交互的情况下工作或失败? – sudoer 2011-06-09 00:28:58

+0

@sudoer这看起来像是一个触摸。看着我的(linux)机器上的scp,它看起来像scp产生了自己的子进程(一个ssh进程),它将自己的文件句柄打开到'/ dev/tty'。除非切换到scp,否则它会在它产生的ssh进程中控制这种行为,我认为这种方法可能不适合你。你能检查scp进程的退出状态,以确定它是否有效吗? – tMC 2011-06-09 00:37:40

+0

@sudoer - 我编辑了我的答案,尝试使用'BatchMode'? – tMC 2011-06-09 00:40:48

2

我以前碰到类似的事情,但在我的情况下,它实际上是有帮助的。我相信ssh和朋友并没有真正阅读stdin并在stdout或stderr上打印,他们做了一些时髦的事情来与你直接运行的终端连接起来。

我相信推理是他们应该能够直接与用户交谈,即使通过包装程序脚本运行时也是如此,因为用户知道密码而不是调用脚本(并且可能他们故意不采用“不想调用脚本有机会拦截密码)。

[编辑补充]:根据我的系统上的man页面,SCP确实有可能做一个标志,你想要什么:

-B  Selects batch mode (prevents asking for passwords or passphrases). 
+0

有趣。正如我评论els在哪里 - 是否有一种方法让我告诉ssh/scp失败,如果它需要来自用户的进一步信息? – sudoer 2011-06-09 00:30:09

+0

scp显然具有“批处理模式”的-B标志。我编辑了我的答案。 – Ben 2011-06-09 05:05:57

相关问题