以指定用户身份从 php 运行 shell 脚本

Posted

技术标签:

【中文标题】以指定用户身份从 php 运行 shell 脚本【英文标题】:run shell script from php as a specified user 【发布时间】:2018-01-20 20:54:07 【问题描述】:

我正在尝试从 php 脚本运行 shell 脚本。

PHP 代码:

<? php
     $sss = escapeshellarg('virtualbox');
     $result = shell_exec("/home/hani/Desktop/launchscript.sh '$sss' 2>&1 ");
     echo "<pre>$result</pre>";
     echo "<br />";
     echo (shell_exec('whoami'));
?>

我的 shell 脚本:

#!/bin/bash


sss=$1
echo 'the sudo password' |sudo -S service $1 restart

在 Web 服务器 (Xampp) 中运行 PHP 代码后,我得到了以下输出:

[sudo] password for daemon: Sorry, try again.
[sudo] password for daemon: 
sudo: 1 incorrect password attempt

daemon

虽然,我没有为 daemon 用户设置任何密码。 在我检查了当前运行 PHP 代码的用户后,我发现它是 daemon。 经过这里和网上的大量研究,我发现 daemon 无法运行sudo 命令。 我还发现我可以通过编辑 sudoers 文件并授予守护程序用户运行 sudo 命令的权限来解决此问题。但是,这不是一个安全的解决方案。 所以我的问题是:如何通过 PHP 代码而不是作为守护进程运行该脚本?PS:我尝试这样做是为了更改当前正在运行的用户PHP 文件:

$result = shell_exec(" sudo -u hani /home/hani/Desktop/launchscript.sh '$sss' 2>&1 ");  

但我在浏览器中得到了这个输出:

sudo: no tty present and no askpass program specified

并且用户仍然是守护进程。

我在 Ubuntu 16.04 中使用 Xampp 另一个信息,我在终端运行这个命令来知道'httpd'服务的所有者:

ps -ef | egrep '(httpd)' | grep -v `whoami` | grep -v root | head -n1 | awk 'print $1'

输出是:守护进程

【问题讨论】:

对不起,我忘了说我已经运行了:sudo chmod +x myshellscript。 【参考方案1】:

我想我找到了解决方案(但仍然不确定安全问题)。 只需更改httpd服务的默认user(所有者)和group。这可以通过编辑位于/opt/lampp/etc 中的httpd.conf 来完成(如果您使用的是Xampp)。正如我在问题中提到的,默认用户是守护进程。但是它没有运行 sudo 命令的权限,所以它只需要将该用户更改为另一个有权运行 sudo 命令的用户(显然是 root 用户或 你在 Ubuntu 中的默认用户)。

【讨论】:

您好,我有守护进程问题。我的 python 脚本在终端中很好,但在 symfony 框架中失败了。请帮帮我 到底是什么问题?【参考方案2】:

更好的方法是授予守护程序访问权限以运行您想要的特定脚本

编辑 sudoers 文件

sudo visudo

添加以下行(更改要运行的脚本的路径)

daemon ALL=(ALL) NOPASSWD: /home/ubuntu/scripts/script.sh

【讨论】:

以上是关于以指定用户身份从 php 运行 shell 脚本的主要内容,如果未能解决你的问题,请参考以下文章

Cron,以root身份执行bash脚本,但一部分(Python脚本)以用户身份执行

从 php 以特定用户身份执行 bat 文件

sh 用于从ubuntu构建安全的mysql服务器的shell脚本。 (必须以root身份运行并准备使用大量密码)

如何以用户而不是 root 用户身份运行 cron 作业 [关闭]

如何将我的php脚本以守护进程的方式一直运行

如何以管理员身份运行powershell