【发布时间】:2023-12-30 05:15:01
【问题描述】:
我一直在寻找上述问题的答案。
Popen 命令不应该返回任何内容,它只是询问“你想继续吗?” (是)和取自本地数据库的“管理员密码”。
当前代码状态是:一切正常,但询问我第二个输入,第一个输入通过。
- 我使用的是 Ubuntu 服务器(使用 Python -u)
- 在每次 stdin.write 后尝试刷新
- 尝试通信(有问题,代码循环无限次)
- 试过 pexpect 但也有问题,我猜 Popen 更适合我的条件。
所以,我愿意接受建议并愿意尝试您的帮助。任何帮助将不胜感激。
#Input 1
p = Popen(["foo", "bar"], stdin=PIPE, universal_newlines=True)
try:
p.stdin.write('yes' + linesep)
except IOError as e:
if e.errno == errno.EPIPE or e.errno == errno.EINVAL:
break
else:
raise
p.stdin.flush()
#Input 2
try:
p.stdin.write(KeyPass + linesep)
except IOError as e:
if e.errno == errno.EPIPE or e.errno == errno.EINVAL:
break
else:
raise
p.stdin.flush()
p.stdin.close()
p.wait()
【问题讨论】:
-
如果您正在尝试驱动交互式应用程序,
Popen并不比pexpect更适合您的条件。向我们展示您尝试了什么以及出了什么问题;几乎可以肯定这是一个更容易解决的问题。 -
另外,它要求“从本地数据库获取的“管理员密码””。通常,当程序要求输入密码时,它们要么从 TTY 而不是 stdin 读取,要么在 stdin 不是 TTY 或无法设置为 NOECHO 时拒绝继续,或者调用
libpam或类似名称而不是自己读取.如果您在命令行上运行此命令,输入时是否会回显密码? (此外,您没有读取标准输出,因此在发送密码之前没有等待提示,如果它在提示之前丢弃输入,则会破坏它,许多密码输入都会这样做。) -
即使发送的是输入,您也看不到任何东西,但它可以工作,您可以尝试其他任何东西,然后它不会要求管理员密码。我也不想看到任何东西,当我的工作完成时我不会打印输入或输出,我现在正在调试。此外,管理员密码是使用 minidom 从 XML 数据库中解析的。所以它被设置为 KeyPass 变量。我不知道你所说的细节对不起。它是一个简单的应用程序,popen 就足够了。
-
再次,当您为命令行运行应用程序时,它是否回显密码?如果您在提示符之前开始输入,它是否会忽略您在提示符之前输入的任何内容?
-
这就像更改*nix系统的密码一样。它既不回显密码也不回显星号。很抱歉在我的第一条评论中造成误解。
标签: python subprocess stdin popen