Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用c重新加载linux服务_C_Linux_Service - Fatal编程技术网

用c重新加载linux服务

用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

我想用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 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等的日志相同。

这里有几件事需要检查:

  • 确保编译的程序具有suid root(即程序的所有者是root)
  • 确保在没有“noexec”选项的情况下装入正在执行程序的分区

  • 您需要是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很难解释和掌握。如