php - 如何从 php 文件重新启动 linux

标签 php linux nginx exec reboot

我的 linux 系统上有一个用户 brftv,我有运行 nginx 的 www-data。

从终端我可以让我的 brftv 用户运行

sudo /sbin/reboot

它工作正常,因为我将以下内容添加到我的/etc/sudoers 文件的“#user privilege specification”部分:

brftv ALL=NOPASSWD: /sbin/halt, /sbin/reboot, /sbin/poweroff
www-data ALL=NOPASSWD: /sbin/halt, /sbin/reboot, /sbin/poweroff

但是当我的php文件运行下面的代码时,没有任何反应

exec('nohup sudo -u brftv /sbin/reboot');

我将 www-data 行添加到上面的 etc/sudoers 以防在运行上面的 exec() 时有必要(即使我以 -u brftv 运行它,但我不是 linux 专家,只是想得更好以防万一)。

运行此 exec() 的 php 文件归 www-data 所有,chmod 为 777,因此所有人都应该有权从中执行。

我已经尝试通过浏览器(我假设将由用户 www-data 运行)和终端 $ php myFile.php 运行 php 文件。

----------------更新----------------

这是我做的

sudo chmod u s /sbin/reboot

这允许我系统上的所有用户无需密码即可运行重启命令。它有效,但我宁愿不让它保持打开状态,所以/etc/sudoers 的其他解决方案会更好,如果有人暗示我的问题是什么......

我关注了这个图 http://linux.byexamples.com/archives/315/how-to-shutdown-and-reboot-without-sudo-password/第二个例子几乎是我上面得到的,但对我不起作用..

最佳答案

我会使用一个非常小的 C 程序来仅授予对 PHP 组的访问权限(在您的情况下可能是 www-data?),在可执行文件上使用 suid 位,然后执行重启命令

phpreboot.c :

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
   setuid(0); // for uid to be 0, root
   char *command = "/sbin/reboot";
   execl(command, command, NULL);
   return 0; // just to avoid the warning (since never returns)
}

编译它

gcc -Wall phpreboot.c -o phpreboot

将 phpreboot 移动到你想运行的地方(必须能被 PHP 访问!)

mv phpreboot /home/private/

作为 root(或通过 sudo)确保所有者是 root 并且组设置为 www-data ,并更改权限以拥有 suid 位(按此顺序)

chown root:www-data phpreboot
chmod 4750 phpreboot

结果 ls -l phpreboot 应该是这样的(注意 rws 中的 s)

-rwsr-x--- 1 root www-data 8565 Jun 12 11:42 phpreboot*

更改 PHP 脚本以改为执行 phpreboot

exec ("/home/private/phpreboot"); // change the path!

只有一个微小的可执行文件将具有运行 reboot 程序的 suid,并且只有 PHP 组才能执行它(当然还有 root)。

关于php - 如何从 php 文件重新启动 linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24100055/

相关文章:

python - 消息 : ConnectionError(ProtocolError ('Connection aborted.' , 错误 (2, 'No such file or directory' )),)

php - 与 mysql 和路径交叉检查

python - Linux epoll 系统调用,等待数据可用

linux - 编辑文件并用 :w! 保存后,在 vim 中删除文件的 "read only"属性

linux - 使用 Linux 命令从文本中删除一些行

html - 如何在 nginx 中提供 html 文件而不显示此别名设置中的扩展名

使用 NGINX 代理进行 Docker 负载平衡

PHP 和 mySQL "UPDATE"实际上没有更新

php - 上传和调整图像大小时PNG黑色背景

php - 如何从 zend 框架获取 $_GET 对象