2013-05-25 31 views
0

我試圖將密碼/密碼傳遞給子流程,但子流程抱怨存在意外的EOF。在我的具體情況下,我試圖用udisksctl解密硬盤。這是我的嘗試,然後是錯誤。python popen子流程中意想不到的EOF

from subprocess import Popen, PIPE, STDOUT 

mykey='password' 

p = Popen(['udisksctl', 'unlock', '-b', '/dev/sdb1'], stdin=PIPE) 
p.stdin.write(mykey+"\n"); 
p.stdin.close() 

錯誤:** (udisksctl unlock:16450): ERROR **: Unexpected EOF while reading from controlling terminal.

感謝您的幫助

注:

  • Python版本:2.7.3
  • 操作系統:Ubuntu的12.10 64位
  • 結束程序不會將密碼存儲爲純文本。它將從gnome-keyring中讀取。

編輯:

感謝tdelaney我得到了我的程序工作。

import pexpect 

drive = '/dev/sdb1' 
mykey = 'password' 

child = pexpect.spawn('udisksctl unlock -b ' + drive) 
child.expect('Passphrase:') 
child.sendline(mykey) 
i = child.expect(['Unlocked ' + drive + ' as ','already unlocked as ', pexpect.EOF]) 
child.close() 

if (i > 1) : sys.exit('Could not unlock ' + drive) 

dev=(child.readline())[:-2] 
if (i == 0) : dev = dev[:-1] 
print 'Device =', dev 
+0

您是否嘗試*不*關閉'stdin'? – Bakuriu

+0

@Bakuriu是的,我嘗試過。我添加了'p.stdin.close()'這一行,希望能解決這個問題。它沒。 – shockburner

+0

@shockburner幾位評論家拒絕了你對我的回答的補充,但我認爲將你的解決方案添加到你原來的帖子中可以。 – tdelaney

回答

1

請求密碼的Linux進程通常在未從終端會話中調用時表現異常。使用python pexpect模塊而不是popen或檢查程序是否提供了一種不同的方法來傳入密碼。