如何从php文件中重启linux

时间:2014-06-07 17:53:15

标签: php linux nginx exec reboot

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

从终端

我可以让我的brftv用户运行

sudo /sbin/reboot

并且它工作正常,因为我将以下内容添加到我的/ etc / sudoers文件" #user权限规范"部分:

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');

我在上面的etc / sudoers中添加了www-data行,以防在运行上面的exec()时有必要(尽管我将它作为-u brftv运行,但我没有linux专家,只是我认为最好是安全的。)

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

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

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

我做了这个

sudo chmod u s /sbin/reboot

允许我系统上的所有用户在没有密码的情况下运行reboot cmd。它有效,但我宁愿不把它打开,所以使用/ etc / sudoers的其他解决方案会更好,如果有人会暗示我的问题是什么......

我跟着这个啧啧http://linux.byexamples.com/archives/315/how-to-shutdown-and-reboot-without-sudo-password/,第二个例子就是我上面提到的那些对我没有用的东西..

7 个答案:

答案 0 :(得分:10)

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

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 ,并将group设置为 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!

只有一个微小的可执行文件具有suid来运行 reboot 程序,只有PHP组才能执行它(当然还有 root )。< / p>

答案 1 :(得分:3)

赋予www user重新启动权限是一个坏主意。创建一个cron并从cron而不是从PHP脚本重新启动系统。 Cron将每分钟运行并检查重启标志。如果已设置,则会重新启动。

1)从php程序的文件写一个标志,以便cron可以决定是否重启。

 $Handle = fopen("/tmp/myfile", 'w');
 fwrite($Handle, "doreboot");
 fclose($Handle);

2)创建一个bash脚本来读取该文件,并在PHP脚本告诉它时重新启动。

#!/bin/bash
arg=$(head -n 1 /tmp/myfile)   
if [ "$arg" == "doreboot" ]; then
  >/tmp/myfile
  echo "Rebooting"
  echo 'password' | sudo -S reboot
fi

在shell中执行此操作 chmod +x mycron.sh

3)在crontab中配置脚本

crontab -e并粘贴此

* * * * * path/mycron.sh

4)设置cron的用户应该具有sudo权限。把他加到sudoers。

答案 2 :(得分:1)

我在我的系统上工作的唯一方法是通过更改/ sbin / reboot上的chmod来“破解”它 像这个家伙一样

http://linux.byexamples.com/archives/315/how-to-shutdown-and-reboot-without-sudo-password/

sudo chmod u + s / sbin / reboot

我意识到在许多情况下这可能不是最佳的,但是这个mediaPlayer非常被锁定,因此无论如何都没有为其他人访问终端。

答案 3 :(得分:0)

你为什么把-u brftv放在那里?这使得您的PHP脚本尝试以您的用户身份运行reboot,这不会起作用。只有root才能重启系统。删除它。

答案 4 :(得分:0)

试试这段代码exec('sudo shutdown -r now');

5分钟后

或“shutdown -r +5”关闭

答案 5 :(得分:0)

允许从PHP重新启动:

  1. vim /etc/sudoers
  2. 列出项目粘贴新行“%www-data ALL=NOPASSWD: /sbin/reboot”并写入更改。
  3. 重新启动操作系统。
  4. 确保您的脚本归www-data,chown www-data:www-data filename.php(apache用户)
  5. 所有
  6. 运行脚本
  7. 享受:)

    (在使用php5-7的ubuntu服务器14.40 LTS上测试,也适用于任何基于debian的发行版。)

答案 6 :(得分:-1)

试试此代码

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

然后从php

exec('sudo /sbin/reboot');