最近项目需求移植了一个mini_httpd做嵌入式服务器,需要在网页里进行重启还有修改一些iptable规则,因为用root登录板子,运行一些带有iptables 或者重启的脚本都没问题,一到网页调用cgi程序去用system()或者popen调用外部脚本,却不行,找了很久后发现,是权限问题,在网上找了一圈,踩了许多坑后,终于解决这个问题:
第一步,在cgi程序里,在想用system或者popen调用root权限的命令前加入setuid(0); ,setuid()这个函数是库函数,大概作用是更改当前运行程序的uid,因为root的uid是0,所以setuid(0)可以把程序用户设成root,这个函数只要包含几个头文件就行了,可以网上找一下,我这里包含了这几个头文件,懒得找可以直接复制:
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
第二步,在mini_httpd的配置文件mini_httpd.conf文件里,加入一行:
user=root
第三步,重启mini_httpd服务: 路径/mini_httpd -C 路径/mini_httpd.conf
重新编译cgi程序,放到板子上就可以了,就这么简单,但是花了我好几个小时。。。。经过测试,cgi程序可以通过system() 或者popen调用reboot或者iptables这种需要root权限的指令,因为就是通过root来运行的。
完。。