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
相关产品推荐
相关产品推荐

