如何在PHP下以root用户身份运行bash脚本

17

如何在PHP中以 root用户 身份(具备所有权限)而不是默认的 nobody 用户运行bash脚本?

这是我在sudo visudo之后的输出:

Defaults        env_keep += "LINES COLUMNS"
Defaults        env_keep += "LSCOLORS"
Defaults        env_keep += "SSH_AUTH_SOCK"
Defaults        env_keep += "TZ"
Defaults        env_keep += "DISPLAY XAUTHORIZATION XAUTHORITY"
Defaults        env_keep += "EDITOR VISUAL"
Defaults        env_keep += "HOME MAIL"

#User privilege specification
root    ALL=(ALL) ALL
%admin  ALL=(ALL) ALL


# Uncomment to allow people in group wheel to run all commands
# %wheel        ALL=(ALL) ALL

# Same thing without a password
# %wheel        ALL=(ALL) NOPASSWD: ALL

# Samples
# %users  ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users  localhost=/sbin/shutdown -h now

3
这听起来很危险,所以会引发一个显而易见的问题:你为什么需要这样做?也许这是一个更好的总体解决方案。 - Oliver Charlesworth
5个回答

35

你可以使用sudo:

exec("sudo /your/script");

您应该允许在不需要密码提示的情况下执行您的脚本。在控制台中运行sudo visudo,并将以下字符串添加到末尾:

nobody ALL = NOPASSWD: /your/script

你必须正确设置文件模式,以确保没有人可以修改此脚本并将危险内容放入其中(在 root 控制台中):

chown root:root /your/script
chmod 755 /your/script

我应该在哪里添加?在问题中的 sudo visudo 后,我发布输出。 - Oleg
只需在文件末尾加入新行。 - Pavel Strakhov
@Riateche 我已经做完了!但是无法运行...我正在调用xcodebuilde(Unix程序)-什么也没有发生,在终端中可以正常工作。 - Oleg
检查exec函数的返回值。传递$output$return_var参数并检查它们的值,它们可能包含一些有用的信息。 - Pavel Strakhov
已验证,output=数组,return_var=69。 - Oleg

1

你可以创建一个设置了 set-uid root 的程序。这将使得程序总是以 root 权限运行。这种方法无法用于 shell 脚本,所以你需要使用 调用你的脚本的程序


链接似乎已损坏。 - Joel G Mathew

0
在Linux下,通常使用sudo命令来执行此操作。尽量具体说明,以免给脚本过多的权限。
有关如何使用sudo的示例,请参考:http://aplawrence.com/Basics/sudo.html

问题在于当我在终端上运行它时,它能够正常工作,但是当我从PHP运行该bash脚本时,它无法执行(其他带有cpmv命令的简单bash可以正常工作),我认为这90%是权限问题。 - Oleg

0

我会添加一个特定的规则,允许该脚本被nobody用户调用,使用sudo


我该如何编辑这个文件?我使用了 sudo visudo 命令,但是它只显示输出。 - Oleg
奇怪。sudo visudo 应该在文件编辑器中打开它:http://www.google.com.br/search?q=visudo - J. Bruni
我对此无能为力,我打开文件 - 无法保存,它不会关闭,它会自我复制... - Oleg
看起来你不习惯在CLI环境下编辑文件(即使用像“Vim”或“Nano”这样的文本编辑器)...至少你知道你正在使用哪个编辑器吗? - J. Bruni
好的,我已经试过了... 要写入:按'I'。要保存更改,按ESC和':w'。 - Oleg
显示剩余3条评论

-1

我最近发布了一个项目,它允许PHP获取并与真实的Bash shell进行交互(作为用户:apache/www-data或root,如果需要的话)。您可以在这里获取它:https://github.com/merlinthemagic/MTS

下载后,您只需使用以下代码:

$shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1  = $shell->exeCmd('/full/path/to/script.sh');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接