使用PHP的sudo运行shell脚本

时间:2013-11-26 14:28:24

标签: php linux bash shell

我目前在我的ubuntu盒子上有一个PHP文件,我希望用它来通过网络界面在机器上创建用户(安全性blablabla,它在内部网络上的一切都完全无法访问任何意外/故意造成伤害的人系统)我最初尝试使用它:

    shell_exec("sudo mkdir -m 755 ".escapeshellarg($directory));

    shell_exec("sudo useradd -s /bin/false -d ".escapeshellarg($directory)." -p ".crypt($pass,$salt)." ".escapeshellarg($servername));

但显然这暴露了mkdir和useradd无密码sudo'd,所以不是这样做,我决定通过在/ etc中创建一个名为'newserver.sh'的shell脚本来减少复杂性,现在我有了这个;

#!/bin/bash
#Var 1 = Directory, Var 2 = Username Var 3 = Password
mkdir "$1"
chmod 755 "$1"
useradd -s /bin/false -d "$1" -p "$3" "$2"
chown "$2" "$1"

这似乎工作得更好,当我从终端运行它时工作得很好,但当PHP使用

执行它时
shell_exec("sudo sh /etc/newserver.sh /home/testuser testuser testpass");

它似乎没有做任何事情(甚至用与从终端运行它时相同的参数进行测试。

仅供参考我的sudoers文件中包含此行www-data ALL=(root) NOPASSWD: /etc/newserver.sh

2 个答案:

答案 0 :(得分:0)

首先,密码必须加密,如下所示:

/etc/newserver.sh /home/testuser testuser "$6$VP9.GI9D$nVjpXIlgoTCLYICNW9ijPqg07opPrjTU2ilYULaT4rut8S9CAmWggMXuOhJ27C5ltwCRfzSxEVgSlReA2i/rH1"

我认为,您应该使用“-c”作为参数。

shell_exec("sudo sh -c \"/etc/newserver.sh /home/testuser testuser testpass\"");

答案 1 :(得分:0)

以root身份运行可以通过两种方式完成:

  • 使用sudo(使www-data成为一个sudoer并不是一个好主意......)
  • 设置setuid

看看/bin/ping

-rwsr-xr-x 1 root root /bin/ping

它属于root,但's'替换'x'(执行)意味着该程序是setuid:它将始终以所有者的身份执行:root。 ping是一个需要构建ICMP数据包的程序,只有root才能操作它们直到最后。

您可以创建类似的环境:将命令放在shell脚本中(假设为myscript.sh)并且:

chown root:root myscript.sh # Give it to root.
chmod u+s myscript.sh # Use setuid on it.

现在,当您运行它时,即使是常规用户(或Web服务器的www-data ...),也会以root用户的身份创建进程。

危险将setuid(以root身份)提供给脚本非常危险。您应该小心权限:除了您感兴趣的人之外,不要允许任何人运行它。例如,为允许运行此脚本的人创建一个名为 myscriptexec 的组:

addgroup myscriptexec
chgrp myscriptexec myscript.sh
chmod g+x # Group can execute.
chmod o= myscript.sh # No one executes except root and group members.

然后,根据需要将用户添加到该组。

如果您需要检查脚本,我建议您使用临时日志文件,以便进行调试:

exec > /tmp/mylog.log
exec 2> /tmp/mylog.log