【问题标题】:python popen unexpected EOF in subprocesspython在子进程中弹出意外的EOF
【发布时间】:2013-05-21 01:47:17
【问题描述】:

我正在尝试将密码短语/密码传递给子进程,但是子进程抱怨存在意外的 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

【问题讨论】:

  • 您是否尝试关闭stdin
  • @Bakuriu 是的,我确实尝试过。我添加了p.stdin.close() 行,希望它能解决问题。它没有。
  • @shockburner 几位评论者拒绝了您对我的回答的补充,但我认为将您的解决方案添加到您的原始帖子中会很好。

标签: python python-2.7 subprocess stdin


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-21
    • 2021-12-10
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多