当前位置: 技术问答>linux和unix
cgi程序中用system函数执行iptables命令,在web网页中没法执行
来源: 互联网 发布时间:2017-02-15
本文导语: 在Linux下,我编写了一个很简单的c程序,用system函数调用iptables -L命令,编译后在终端能执行成功,但是,编译成.cgi后,再在网页上执行却没反应,不知道是什么原因,希望有懂这方面的好心人指点下,这是我毕设...
在Linux下,我编写了一个很简单的c程序,用system函数调用iptables -L命令,编译后在终端能执行成功,但是,编译成.cgi后,再在网页上执行却没反应,不知道是什么原因,希望有懂这方面的好心人指点下,这是我毕设中出现的问题,现在很着急,希望大家能帮下忙,谢谢!(我用的服务器是boa)
源程序代码为:
#include
#include
int main()
{
print("%srnrn","Comtent-Type=text/html");
system("/sbin/iptables -L");
return 0;
}
用gcc编译后在终端运行是没问题的。
源程序代码为:
#include
#include
int main()
{
print("%srnrn","Comtent-Type=text/html");
system("/sbin/iptables -L");
return 0;
}
用gcc编译后在终端运行是没问题的。
|
可以按以下的规则查看sysytem错误:
1,在程序中,用exit来设置进程的退出值时,虽然该函数的参数类型为int型,但再父进程中只能取到其值的低8位.
2,对于system函数,返回值是由两部分组成的,低8位值表示所执行的脚本在执行过程中所接收到的信号值,其余的位表示的脚本exit退出时所设置的值,
即脚本内exit退出是的值的低8位,在system返回值的低9-16位.
system失败的原因很多 除了权限之外,还有可能是 在执行system的时候由于内存不够而导致fork失败,system的实现就是fork+exec。在嵌入式系统中,后面一种情况经常发生。
所以最好是用 perror 看一下system失败的原因。
1,在程序中,用exit来设置进程的退出值时,虽然该函数的参数类型为int型,但再父进程中只能取到其值的低8位.
2,对于system函数,返回值是由两部分组成的,低8位值表示所执行的脚本在执行过程中所接收到的信号值,其余的位表示的脚本exit退出时所设置的值,
即脚本内exit退出是的值的低8位,在system返回值的低9-16位.
system失败的原因很多 除了权限之外,还有可能是 在执行system的时候由于内存不够而导致fork失败,system的实现就是fork+exec。在嵌入式系统中,后面一种情况经常发生。
所以最好是用 perror 看一下system失败的原因。
|
例如:
建一个目录:system("mkdir yourdir")。
(1)首先:要用root用户
如果cgi中要用root用户,则必须在boa.conf文件中配置,将User nobody修改为User root;
这样改之后,将会导致boa无法启动,查看error_log,提示:“boa.c:266.icky Linux kernel bug!:No such file”,解决这个问题,只需将修改boa.c中的以下几行判断去掉即可。
if (setuid(0) != -1) {
DIE("icky Linux kernel bug!");
}
(2)其次:要用绝对路径
system("/system/bin/mkdir yourdir")。
建一个目录:system("mkdir yourdir")。
(1)首先:要用root用户
如果cgi中要用root用户,则必须在boa.conf文件中配置,将User nobody修改为User root;
这样改之后,将会导致boa无法启动,查看error_log,提示:“boa.c:266.icky Linux kernel bug!:No such file”,解决这个问题,只需将修改boa.c中的以下几行判断去掉即可。
if (setuid(0) != -1) {
DIE("icky Linux kernel bug!");
}
(2)其次:要用绝对路径
system("/system/bin/mkdir yourdir")。