2011-06-08 49 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

相關問題