顺晟科技
2021-06-16 10:55:46
377
对于项目中的需求,希望用户可以在后台关闭/重启内网服务器,记录功能实现的过程
这些功能主要分为三个部分:
Linux相关命令
Php执行系统命令
服务器权限问题
关机命令
我选择使用关机命令关机,如下所示
关机[-t秒] [-rkhncfF]时间[消息]
参数描述:
-t秒:在几秒钟后设置关机程序
-k:并不是真的关机,它只是向所有用户发出警告信息。
-r:关闭并重新启动
-h:停机后停机
-n:不使用正常程序关机,而是使用强制方法杀死所有正在运行的程序并自行关机
-c:取消正在进行的关机操作
当-f:关闭时,不要执行fcsk操作(检查Linux文件系统)
-F:在关闭时被迫执行fsck动作
时间:设置关机时间
消息:向所有用户发送警告消息
举几个例子:
立即关机并重启
关机-现在#立即关机并停止机器
关机-r10 # 10分钟后重启
关机-r 10:00 # 10 10点钟重启
Shutdown -t5 -r现在#立即重新启动,但是在警告和删除进程之间有5秒钟的延迟。
关机-c #取消之前的关机命令
当然,还有其他关机命令,如关机、重启、暂停、初始化,大致使用如下
halt[-n][-w][-d][-f][-I][-p][-h]
重新启动[-n] [-w] [-d] [-f] [-i]
断电[-n] [-w] [-d] [-f] [-i] [-h]
Php执行系统命令
Php提供了以下方法来执行系统命令
Exec():执行外部程序
返回命令执行结果的最后一行。如果您想要获取命令的输出内容,请确保使用输出参数
System():执行外部程序(命令行)并显示输出
这个函数会直接输出结果(注意是直接输出而不是返回值)。命令成功后,它将返回最后一行输出,如果失败,它将返回FALSE
Shell_exec():通过Shell环境执行命令,并以字符串形式返回完整的输出
命令执行输出。如果在执行过程中出现错误或者进程没有产生输出,则返回空值
Passthru():执行外部程序并显示原始输出
你可以在这里选择任何方法。总之,您应该在php文件中执行关闭服务器的命令
exec(' shut down-h now ');
服务器权限
如果服务器有多个角色,在实际执行关机命令时,将出现以下错误
请在关闭抑制剂并注销其他用户后重试操作。
或者,忽略抑制剂和带有“systemctl reboot -i”的用户。
在这种情况下,您可以通过使用sudo命令来执行关机来关机,所以它涉及到一个问题,如何在php文件中调用sudo,我找到了一个解决方案来配置etc/sudoers文件中的以下权限
% xxxall=(all)no passwd : all//将xxx组下的用户设置为使用sudo,无需输入密码
首先要做的是获取执行php脚本的用户,一般是www-data。如果您不清楚,可以使用以下方法在php文件中获取用户名
系统(' whoami ');
另一个问题是,向用户开放所有的无秘密权限风险太大。我们只需要打开关机权限,所以最终的配置应该是
% www-data ALL=(ALL)nopasswd :/sb in/shut down
在php文件中执行
exec(' sudo shut down-h now ');
08
1972-02
11
2022-08
17
2022-03
16
2022-03
03
2021-08
16
2021-06