gpt4 book ai didi

在 CGI 脚本中使用 popen 调用系统 cmd

转载 作者:太空宇宙 更新时间:2023-11-04 12:48:07 24 4
gpt4 key购买 nike

尝试执行包含popen()CGI 脚本 以执行cmd。即使 popen 返回有效指针,但它无法执行所需的操作。

命令我要执行lsblk,insmod

void cmd_execute(char *cmd, char *buff, int len)
{
FILE *f = popen(cmd,"r");
if (NULL == f){
printf("<p> popen failed");
return;
}
fread(buff,len,1,f);
pclose(f);

printf("<p> buff: %s",buff);
}

HTML 内容:

<!DOCTYPE html>
<html>
<body bgcolor="#4a7d49">
<form ACTION="http://localhost/cgi-bin/run.cgi" METHOD="POST" target="display_page">
<input type="submit" value="List Drivers"></form>
<br /><br />
</body>
</html>

当我对 ls cmd 尝试同样的操作时,我得到了想要的结果。但是其他命令失败了。我正在 rhel6.4 中尝试这个。我尝试在 cmd 参数 中使用 su -srunuser -l 更改权限,但没有帮助。我收到类似无法打开 session 的错误。让我知道是否有更好的方法来做同样的事情。

最佳答案

Su(1) 是一个必须以交互方式运行的命令。它打开 /dev/tty 以便能够询问密码,并且当您在没有控制终端的 session 中运行它时(所有守护进程 session 都是非终端的)open( 2) /dev/tty 失败(有那个精确的错误)

解决方案是使用其他方式将密码传递给 su(1)。阅读它的文档,看看是否有其他方法可以将正确的密码传递给它。或者命令它不要求输入密码。

顺便说一句,与此无关,但是 popen(3) 必须用 pclose(3) 关闭,而不是用 fclose(3)。这是因为 pclose 杀死 child 并等待它终止,而不是让它在通信 channel 关闭的情况下运行。

最后一件事:我不知道你的容器的情况,但有些不允许你产生新的进程,所以要小心。我认为这不是你的情况。

关于在 CGI 脚本中使用 popen 调用系统 cmd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38102403/

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