gpt4 book ai didi

python - 在发送 stdin 输入之前等待子进程的提示

转载 作者:太空宇宙 更新时间:2023-11-03 11:14:27 25 4
gpt4 key购买 nike

我有一个 linux x86 二进制文件,它要求输入密码并打印出密码是否正确。我想使用 python 来模糊输入。

下面是我运行二进制文件的截图,然后给它字符串“asdf”,并接收到字符串“incorrect”

截图:

Screenshot

到目前为止,我已经尝试使用 Python3 子进程模块来

  1. 将二进制文件作为子进程运行
  2. 收到输入密码的提示
  3. 发送一个字符串。
  4. 收到回复

这是我的脚本

p = subprocess.Popen("/home/pj/Desktop/L1/lab1",stdin=subprocess.PIPE, stdout=subprocess.PIPE)
print (p.communicate()[0])

运行这个脚本的结果是

b'Please supply the code: \nIncorrect\n'

我希望只收到提示,但是在我有机会发送我的输入之前,二进制文件也返回了不正确的响应。

我怎样才能改进我的脚本以便成功地与这个二进制文件交互?

最佳答案

阅读documentation仔细(强调我的):

Popen.communicate(input=None)

Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate. The optional input argument should be a string to be sent to the child process, or None, if no data should be sent to the child.

communicate() returns a tuple (stdoutdata, stderrdata).

Note that if you want to send data to the process’s stdin, you need to create the Popen object with stdin=PIPE. Similarly, to get anything other than None in the result tuple, you need to give stdout=PIPE and/or stderr=PIPE too.

因此,您没有向进程发送任何内容,而是立即读取所有 stdout


在您的情况下,您实际上不需要等待提示将数据发送到流程,因为流是异步工作的:流程仅在尝试读取其 STDIN 时才会获取您的输入:

In [10]: p=subprocess.Popen(("bash", "-c","echo -n 'prompt: '; read -r data; echo $data"),stdin=subprocess.PIPE,stdout=subprocess.PIPE)

In [11]: p.communicate('foobar')
Out[11]: ('prompt: foobar\n', None)

如果您出于任何原因坚持等待提示(例如,您的进程也在提示之前检查输入,期待其他东西),you need to read STDOUT manually and be VERY careful how much you read : 因为 Python 的 file.read 是阻塞的,一个简单的 read() 会死锁,因为它等待 EOF 并且子进程没有关闭 STDOUT -- 因此不会产生 EOF -- 直到它得到你的输入。如果输入或输出长度可能超过 stdio 的缓冲区长度(在您的特定情况下不太可能),you also need to do stdout reading and stdin writing in separate threads .

这是一个使用 pexpect 的例子它会为您解决这个问题(我正在使用 pexpect.fdexpect 而不是 pexpect.spawn suggested in the doc '因为它适用于所有平台):

In [1]: import pexpect.fdpexpect

In [8]: p=subprocess.Popen(("bash", "-c","echo -n 'prom'; sleep 5; echo 'pt: '; read -r data; echo $data"),stdin=subprocess.PIPE,stdout=subprocess.PIPE)

In [10]: o=pexpect.fdpexpect.fdspawn(p.stdout.fileno())

In [12]: o.expect("prompt: ")
Out[12]: 0

In [16]: p.stdin.write("foobar") #you can communicate() here, it does the same as
# these 3 steps plus protects from deadlock
In [17]: p.stdin.close()
In [18]: p.stdout.read()
Out[18]: 'foobar\n'

关于python - 在发送 stdin 输入之前等待子进程的提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54319960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com