如何使用Perl CGI脚本启动/停止服务

时间:2017-08-02 09:46:49

标签: linux apache perl cgi

我的目标是从Perl CGI脚本启动/停止服务(如httpd,sshd,iptables等)。

#!/usr/bin/perl
use strict;
use warnings;
print "content-type:text/html\n\n";
print <<EOM;
<html>
<body>
EOM
`/etc/init.d/httpd stop`;
my $res=`/etc/init.d/httpd status`;
print <<EOM;
<h3>$res</h3>
</body>
</html>
EOM

这里back tics里面的第一个命令不起作用,而分配给$ res的第二个命令正在工作。 浏览器上的输出如下:

httpd (pid 15657) is running...

2 个答案:

答案 0 :(得分:4)

我建议显示stop命令的输出。我强烈怀疑您会看到一个错误,表明您无权停止该服务。

正确配置的Web服务器进程将由几乎没有系统权限的用户拥有。这是一项安全功能。您的Web服务器上的CGI程序可以由任何可以访问Web服务器的人运行。因此,Web服务器用户通常配置为仅运行非常有限的一组程序。

启动和停止Web服务器通常需要root权限。您的Web服务器进程将没有root权限(希望是明显的原因)。但完全有可能系统上的每个用户(包括Web服务器用户)都有权获取Web服务器进程的状态。这就是httpd status命令有效的原因,而httpd stop命令没有。

您可以使用sudo或类似内容为Web服务器用户提供启动或停止服务的临时权限。但是你需要非常小心地做 - 可能需要在网页上输入密码(并通过https安全地传输密码)。

但完全重新考虑这种方法可能更好。

我是否也可以指出,使用反引号来运行您不希望从中收集输出的外部命令是一个坏主意。在这种情况下,使用system()函数会更有效。

我还注意到,您正在加载CGI模块,但未使用其任何功能。您甚至可以手动创建Content-Type标题,忽略模块的header()功能。

这是我传统的忠告,即在2017年编写新的CGI程序是一个糟糕的主意。请阅读CGI::Alternatives并考虑采用基于PSGI的方法。

答案 1 :(得分:2)

您甚至不应该想到拥有在计算机上启动/停止服务的权限的CGI脚本。当然,有理由想要对服务器进行远程控制,但如果给予HTTP守护程序超级用户权限是你能想到达到目的的唯一方法,你需要意识到你不应该成为那个人实现该功能。