【问题标题】:subprocess is waiting for password. and stdin is unable to push password子进程正在等待密码。并且标准输入无法推送密码
【发布时间】:2020-06-18 14:13:45
【问题描述】:

让我解释一下情况。我正在执行 tibemsadmin.exe 作为子进程。 一旦子进程启动,我需要通过管道传输 3 个命令。 1.“连接” 2.用户名是'' 3.密码是''

import subprocess as sp
process=sp.Popen('tibemsadmin',cwd='C:/tibco/ems/8.5 - Copy/bin',shell=True, stdout=sp.PIPE, stdin=sp.PIPE, stderr=sp.STDOUT)
process.stdin.write(b'connect\n')
process.stdin.write(b'\n')
process.stdin.write(b'\n')
stdout=process.communicate()
print(stdout)
cmd.terminate()

进程没有输入密码。它用于用户输入。听到卡住了

C:\Users\user\Desktop\TIBCO>py cmd_popen.py 密码:

【问题讨论】:

  • stdout=process.communicate()。这是错误的。使用元组解包,std_out,std_err=process.communicate()
  • 同意 Adam,在致电 process.communicate() 之前,process.stdin.close() 也有帮助吗?密码可能位于管道的父级输出缓冲区中。
  • 您也可以使用communicate 传递输入:stdout, stderr = process.communicate(b'connect\n\n\n')但是,请确保 tibemsadmin 实际上是从标准输入读取凭据,而不是直接从终端读取。
  • 这看起来可能会有所帮助:support.tibco.com/s/article/…
  • 问题解决了吗?

标签: python passwords subprocess


【解决方案1】:

tibemsadmin 进程接受用户名和密码作为参数。所以解决方法很简单。

import subprocess as sp
cmd_tib_connect = "tibemsadmin -server {} -user {} -password {}".format(server_name, user_name, password)
process=sp.Popen(cmd_tib_connect, cwd='C:/tibco/ems/8.5 - Copy/bin',shell=True, stdout=sp.PIPE, stdin=sp.PIPE, stderr=sp.STDOUT)
stdout=process.communicate()
print(stdout)
cmd.terminate()

【讨论】:

  • 您仍然希望使用单行 subprocess.run() 而不是多行 Popen + communicate + 复杂性和脆弱性。
猜你喜欢
  • 2014-10-29
  • 2012-04-03
  • 1970-01-01
  • 2010-12-18
  • 2019-06-16
  • 2021-05-28
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多