我有一个简单的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而感到迷茫。
答案 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" );
}