c - 通过管道将 C 程序输入传递给 system() 函数 fuinput

标签 c linux bash pipe

我有一个简单的 C 包装程序,可以在提升的上下文中运行 bash 脚本。它位于 FastCGI 包装器后面,允许一些服务 Hook 调用我的 C 程序,然后该程序将以 root 身份运行我的 bash 脚本。我很清楚安全问题,并且我的 Web 服务器只允许单个 IP 地址调用 CGI-BIN 脚本。我拥有两台机器,因此几乎没有安全风险。我是一个彻头彻尾的 C 菜鸟,并且从互联网上复制了一个片段。

到目前为止,效果很好:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
   setuid( 0 );
   return system( "./myscript.sh" );
}

但是我的程序现在需要从 FastCGI 获取 POST 数据。 CGI 规范表示它通过 STDIN 传递所有原始 POST 数据。我想要的是能够直接将这个原始 POST 数据从我的 C 程序/包装器的 STDIN 传输到我的脚本中。我尝试了以下方法,但没有成功:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
   setuid( 0 );
   dup2(1, 0);
   return system( "./myscript.sh" );
}

使用普通管道时,脚本工作得非常好(例如echo "Hey"| ./myscript.sh),但是我不知道如何将我的 C 程序的 STDIN 通过管道传输到 STDIN我的脚本。

最佳答案

扩展 Barmar 上面的评论。这是修改后的 C 程序:

/* foo.c*/

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
   setuid( 0 );       
   return system( "wc -l");
}

wc -l 命令将等待来自 STDIN 的输入。

现在,编译并运行上面的程序。您将看到它等待输入,当您使用 Ctrl + D 结束输入时,您将看到它打印行数:

/tmp> ./foo 
Hello world
This is an input
2

关于c - 通过管道将 C 程序输入传递给 system() 函数 fuinput,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19886161/

相关文章:

c - 基于 unix 的系统中的延迟加载等效项

c - Xcode 的 SVD 库

c - 符号查找错误 : undefined symbol atexit (linux/C)

Linux 的 Java 分析工具

bash - 在 bash 中重复打印一个字符

c - PINVOKE 查询(无符号长*)

c - libVLC 无法同时叠加和录制视频流

linux - Linux上远程执行脚本

html - grep linux 正则表达式

Bash 命令引用问题