【问题标题】:how to send EOF to a process in python如何将EOF发送到python中的进程
【发布时间】:2017-10-20 15:19:29
【问题描述】:

现在我有一个如下程序:

#include <stdio.h>
#include <unistd.h>

int main(){
    char str[200];
    while(read(0, str,10)>0){
        printf("%s", str);
    }   
    printf("good\n");
    scanf("%s", str);
    printf("%s\n", str);
}

当收到EOF时,这个程序会打印good,然后继续接受我的下一个输入,然后打印出来,以防直接运行。

我要做的是与另一个 python 代码交互:

from pwn import *

r = process('./test')
r.send('123')
print r.recv(1000)
r.send('\x04')
print r.recv(1000)

但无论如何,除非我关闭连接,否则我无法退出 while 循环。但是如果我关闭连接,我将无法发送最后一个输入。 我在某处发现 '\x04' 代表 EOF。但它似乎不起作用。

我想知道我应该怎么做才能跳出循环然后发送最后一个输入。

【问题讨论】:

  • 顺便说一句,但您的 C 程序中的 str 缓冲区不会以空值终止。确保在每次 read 调用后设置 str[N]='\0'
  • EOFnot char (所以不能“发送”它)。这是一种状态。 read() 检测“文件结束”是否以及何时关闭输入流。您可能想发明一种不同的协议。
  • “当收到EOF时,这个程序会打印好,然后继续接受我的下一个输入” - 当你遇到EOF时,就是没有“下一个输入”。
  • 但是你可以测试一下:当按下 ^D 时,如果我手动运行它,它会打印“good”并等待我的下一个输入
  • 你知道 EOF 意味着文件结束,对吧?将程序设计为使用 EOF 作为记录分隔符是非常不寻常的,因为它实际上不能存储在文件中。为什么不使用换行符?

标签: c eof


【解决方案1】:

看起来您刚刚获得了标准输入和标准输出流来与您的测试过程进行通信。这不足以发送 EOF,您需要一个 PTY。您可以为此使用 ptyprocess:

from ptyprocess import PtyProcessUnicode
p = PtyProcessUnicode.spawn(['./test'])
p.write("123\n")
print(p.read())
p.sendeof()
print(p.read())

【讨论】:

    猜你喜欢
    • 2013-07-20
    • 2018-04-28
    • 2021-04-03
    • 2021-06-03
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多