我的目标是从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...
答案 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守护程序超级用户权限是你能想到达到目的的唯一方法,你需要意识到你不应该成为那个人实现该功能。