我有一个简单的 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/