gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:44:41 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com