簡體   English   中英

如何使用Perl CGI腳本啟動/停止服務

[英]How to start/stop services using Perl CGI script

我的目的是從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 tic中的第一個命令不起作用,而分配給$ res的第二個命令正在起作用。 瀏覽器上的輸出如下:

httpd (pid 15657) is running...

我建議顯示stop命令的輸出。 我強烈懷疑您會看到一條錯誤消息,表明您無權停止該服務。

幾乎沒有系統權限的用戶將擁有正確配置的Web服務器進程。 這是一項安全功能。 可以訪問Web服務器的任何人都可以運行Web服務器上的CGI程序。 因此,通常將Web服務器用戶配置為僅運行非常有限的一組程序。

啟動和停止Web服務器通常需要root權限。 您的Web服務器進程將沒有root權限(出於顯而易見的原因,希望如此)。 但是,系統上的每個用戶(包括Web服務器用戶)完全有可能擁有獲取Web服務器進程狀態的權限。 這就是為什么您的httpd status命令有效而httpd stop命令無效的原因。

您可以使用sudo或類似方式授予Web服務器用戶臨時權限來啟動或停止服務。 但是您需要非常小心-可能需要在網頁上輸入密碼(並通過https安全傳輸該密碼)。

完全重新考慮這種方法可能是一個更好的主意。

我還可以指出,使用反引號來運行您不希望從中收集輸出的外部命令是一個壞主意。 在這種情況下,使用system()函數將更加有效。

我還注意到,您正在加載CGI模塊,但未使用其任何功能。 您甚至可以手動創建Content-Type標頭,而忽略模塊的header()函數。

這是我的傳統告誡,在2017年編寫新的CGI程序是一個糟糕的主意。 請閱讀CGI :: Alternatives並考慮使用基於PSGI的方法。

您甚至不應該考慮擁有CGI腳本,該腳本具有在計算機上啟動/停止服務的特權。 當然,有充分的理由要對服務器進行遠程控制,但是如果要賦予HTTP守護程序超級用戶特權是實現這一目標的唯一途徑,則需要意識到自己不應該成為那個人實現該功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM