python popen子进程中的意外EOF

时间:2013-05-25 17:40:36

标签: python python-2.7 subprocess stdin

我正在尝试将密码/密码传递给子流程,但是子流程会抱怨存在意外的EOF。在我的特定情况下,我试图用udisksctl解密硬盘。以下是我的错误尝试。

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

1 个答案:

答案 0 :(得分:1)

要求密码的Linux进程通常在未从终端会话调用时表现得很奇怪。使用python pexpect模块而不是popen或检查程序是否提供了传递密码的不同方式。