用c重新加载linux服务
我想用c和cgi代码重新启动linux服务,如apache、bind、proftpd和其他 我使用system()来执行此操作,例如:用c重新加载linux服务,c,linux,service,C,Linux,Service,我想用c和cgi代码重新启动linux服务,如apache、bind、proftpd和其他 我使用system()来执行此操作,例如: system ("service httpd reload"); 我还在编译的程序上设置suid并运行它。但不工作并返回权限错误 我该怎么办 编辑: 我的apache日志错误: [Wed Dec 21 21:07:13 2011] [error] [client *] cannot remove `/var/run/httpd.pid' [Wed Dec 21
system ("service httpd reload");
我还在编译的程序上设置suid并运行它。但不工作并返回权限错误
我该怎么办
编辑:
我的apache日志错误:
[Wed Dec 21 21:07:13 2011] [error] [client *] cannot remove `/var/run/httpd.pid'
[Wed Dec 21 21:07:13 2011] [error] [client *] : Permission denied
[Wed Dec 21 21:07:13 2011] [error] [client *]
[Wed Dec 21 21:07:13 2011] [error] [client *] touch:
[Wed Dec 21 21:07:13 2011] [error] [client *] cannot touch `/var/lock/subsys/httpd'
[Wed Dec 21 21:07:13 2011] [error] [client *] : Permission denied
命名、proftpd等的日志相同。这里有几件事需要检查:
您需要是root用户才能成功运行
/usr/sbin/service
命令
因此,您的问题是应用程序如何获得根权限
如果您的应用程序是一个CGI,您(合法地)不想授予其root访问权限,那么您可以编写一个包装程序,该程序是setuid root,并且只能从您的CGI(或者至少从运行它的uid)运行
但是你确定你真的想从CGI运行这样的东西吗?(您可以研究webmin是如何工作的)。系统调用调用的shell路径中是否有
service
?如果没有,它只会弹出“service:commandnotfound”。请尝试绝对路径,例如/usr/sbin/service http reload
。不,这不是我的问题。我给出了一些pid文件的权限错误,该服务将删除或重新定义该文件。还要确保编译的程序没有bug,并且需要身份验证才能运行;通过CGI运行的有缺陷的根SUID应用程序是一个相当大的安全漏洞。您还应该确保装载的文件系统没有nosuid
选项集1。检查过了,没问题。2.我该怎么检查?3.所有代码片段都成功运行,我知道CGI的安全性。在GNU/Linux上,它是:grep/proc/mounts | awk'{print$4}例如:grep/home/proc/mounts | awk'{print$4}你会得到选项列表,确保没有“noexec”和“nosuid”。我想我在SUID上没有问题,因为,在这段代码中,我从一些具有root权限的文件中读写,没有问题。这是真的吗?我也使用popen()调用cgi中的系统程序。是的,绝对的!当我运行CGI时,它将我的真实uid提供给0。你能解释一下我需要的包装器吗?-还有最后一个问题,我花了一些时间在kloxo上,它使用root用户运行lighttpd进行管理,监听7778端口,并将其与用于用户的apache web服务器分离。但是directadmin只使用一个web服务器,并且与我的一样通常我在c中有一些api,并从不在同一服务器上的web服务器请求它们。我想要一个特定的端口,e.x.7777,并用iptables限制来自未知位置的所有请求。-但我也会检查webmin。阅读一本关于Unix编程的好书,因为setuid很难解释和掌握。如