Python子进程挂起

时间:2016-10-18 19:31:14

标签: python subprocess

我正在执行以下子流程...

p.call(["./hex2raw", "<", "exploit4.txt", "|", "./rtarget"])

......它挂了。

但是如果我执行kmwe236@kmwe236:~/CS485/prog3/target26$ ./hex2raw < exploit4.txt | ./rtarget那么它执行得很好。使用输入或管道操作符有什么问题吗?

我也试过sp.call(["./hex2raw", "<", "exploit4.txt", "|", "./rtarget"], shell=True)

整个代码看起来像 UPDATED WITH SUGGESTIONS

import subprocess as sp
import pdb

for i in range(4201265,4201323):
    pdb.set_trace()
    d = hex(i)[2:]
    output = " "
    for i in range(len(d),0,-2):
        output = output + d[i-2:i] + " "

    out_buffer = "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" + output + "00 00 00 00"

    text_file = open("exploit4.txt", "w")
    text_file.write("%s" % out_buffer)

 #   sp.call(["./hex2raw", "<", "exploit4.txt", "|", "./rtarget"], shell=True)
    with open("exploit4.txt") as inhandle:
        p = sp.Popen("./hex2raw",stdin=inhandle,stdout=sp.PIPE)
        p2 = sp.Popen("./rtarget",stdin=p.stdout,stdout=sp.PIPE)
        [output,error] = p2.communicate()

我收到错误

  File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
    raise child_exception
OSError: [Errno 8] Exec format error

调试后,它发生在fire subprocess调用p = sp.Popen("./hex2raw",stdin=inhandle,stdout=sp.PIPE)

1 个答案:

答案 0 :(得分:2)

由于您正在使用重定向和管道,因此您必须启用shell=True

sp.call(["./hex2raw", "<", "exploit4.txt", "|", "./rtarget"],shell=True)

但是在两个可执行文件上使用Popen并将exploit4.txt的内容作为输入提供将更加清晰。以下示例,适合您的情况:

import subprocess

    with open("exploit4.txt") as inhandle:
        p = subprocess.Popen("./hex2raw",stdin=inhandle,stdout=subprocess.PIPE)
        p2 = subprocess.Popen("./rtarget",stdin=p.stdout,stdout=subprocess.PIPE)
        [output,error] = p2.communicate()
        print(output)
        # checking return codes is also a good idea
        rc2 = p2.wait()
        rc = p.wait()

说明:

  1. 打开输入文件,获取其句柄inhandle
  2. 打开第一个子流程,将stdininhandle重定向,将stdout重定向到输出流。获取管道把手(p)
  3. 打开第二个子流程,将stdin与之前的流程stdout重定向,将stdout重定向到输出流
  4. 让第二个进程communicate。它会&#34;拉&#34;第一个是消耗它的输出:两个进程都以管道方式工作
  5. 获取返回代码并打印结果
  6. 注意:你得到&#34;格式错误&#34;因为一个或两个可执行文件实际上是shell或其他非本机可执行文件。在这种情况下,只需将shell=True选项添加到相关的Popen来电。