管道C程序输入到system()函数fuinput

时间:2013-11-10 04:07:47

标签: c linux bash pipe

我有一个简单的C Wrapper程序,可以在提升的上下文中运行bash脚本。它位于FastCGI包装器后面,允许一些服务挂钩调用我的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而感到迷茫。

2 个答案:

答案 0 :(得分:0)

扩展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

答案 1 :(得分:0)

尝试在stdin的末尾添加换行符:

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