You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下如何实现从STDOUT读取数据的程序的自动化交互?

如何自动化与从STDOUT读取输入的程序交互?

问题背景

在Linux环境下,存在一类特殊程序——它们从文件描述符1(STDOUT)读取输入,而非标准的STDIN(文件描述符0)。这类程序可通过键盘手动交互输入有效密码,但无法通过管道或重定向(如echo "123" | ./stdout_as_stdin)实现无人值守执行;若将读取逻辑改为从STDIN读取,输入重定向则能正常工作。

需要实现无需人工参与,通过Bash或Python脚本完成与这类程序的自动化交互。

示例程序代码

以下是这类特殊程序的示例代码:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main() {
    const int buff_size = 1024;
    char buff[buff_size];
    char p_1[] = "123";
    char p_2[] = "abc";
    printf("Enter secret password (%s):\n", p_1);
    memset(buff, 0, buff_size);
    read(1, buff, buff_size-2); // 从STDOUT读取输入
    if ((strlen(buff) == strlen(p_1) + 1) && (memcmp(p_1, buff, strlen(p_1)) == 0)) {
        printf("Secret token: %s\n", p_2);
        return 0;
    } else {
        printf("Failed\n");
        return 1;
    }
}

解决方案:借助FIFO实现双向交互

利用Linux的FIFO(命名管道)特性,构建可同时读写的通道,让程序的STDOUT既可以输出提示信息,又能接收脚本写入的输入数据,从而实现自动化交互。

Bash脚本实现

# 创建命名管道
mkfifo ./my_fifo
# 将程序的STDOUT关联到FIFO,以读写模式打开并后台运行程序
exec ./stdout_as_stdin 1<> ./my_fifo &

后续可通过操作./my_fifo文件完成交互,比如用echo "123" > ./my_fifo写入密码,用cat ./my_fifo读取程序输出。

Python脚本实现

结合pwntools库管理进程,利用FIFO实现交互:

import os
from pwn import process

# 创建权限为600的命名管道
os.mkfifo('./my_fifo', 0o600)
# 以读写模式打开FIFO
fd = os.open('./my_fifo', os.O_RDWR)
# 启动程序,将其STDOUT指向FIFO
p = process(argv=['./stdout_as_stdin'], stdout=fd)

# 后续可通过以下方式交互:
# 读取程序输出
output = os.read(fd, 1024)
# 写入密码
os.write(fd, b'123\n')

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 02:13:15