【问题标题】:How to start/stop services using Perl CGI script如何使用 Perl CGI 脚本启动/停止服务
【发布时间】:2023-12-08 23:54:01
【问题描述】:

我的目标是通过 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...

【问题讨论】:

  • 您是否尝试过查看运行停止命令的输出?
  • 可能运行CGI脚本的用户没有启动/停止服务的权限。
  • 我说得对吗:您试图在 HTTP 服务器为您的脚本提供服务时停止它?就像开车时卸下车轮一样?
  • 我想知道他是如何尝试重新开始的...... ;)
  • 如果 httpd 服务已停止,那么我的浏览器中会出现一个错误,表明该服务已停止。但问题是它的 httpd 或任何其他服务 - 它不是工作。如果用户在运行脚本时是 apache,那么它如何显示状态。我的意思是用户可能没有这样做的权限。

标签: linux apache perl cgi


【解决方案1】:

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

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

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

您可以使用sudo 或类似的方式授予网络服务器用户启动或停止服务的临时权限。但是您需要非常小心地进行操作 - 可能需要在网页上输入密码(并通过 https 安全地传输该密码)。

但是完全重新考虑这种方法可能是一个更好的主意。

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

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

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

【讨论】:

  • 注意点。感谢您的建议。实际上我是 CGI 环境的新手。我想尝试的另一种方法是以 root 用户身份登录并执行该命令。是否可以登录脚本中的 root 或其他选项是为 apache 用户授予 sudo 权限。哪一个会更好并简化我的任务?
  • 其实我是 CGI 环境的新手。 @VamseeBond:那么请停下来。在 2017 年学习 CGI 是荒谬的。
  • @VamseeBond 我不是严格反对学习 CGI,但你需要找到不同的任务来学习。一种不涉及打开系统后门的方法。
  • @VamseeBond:您尚未接受任何问题的答案。您可能想在人们开始怀疑他们是否愿意为您提供帮助之前就说明这一点。见*.com/help/someone-answers
  • @VamseeBond:太好了。谢谢。
【解决方案2】:

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

【讨论】:

    最近更新 更多