繁体   English   中英

须藤在php exec()

[英]sudo in php exec()

我不知道这是什么交易...

所以我想运行一个sudo osascript myscript.scptsudo osascript myscript.scpt

这在终端中工作正常,但是当我通过PHP的exec()执行它时却无法正常工作; 什么都没发生。 控制台说

no tty present and no askpass program specified ; TTY=unknown ; …

我做了研究,看来我缺少sudo命令的密码。 我尝试了几种不同的方法来解决此问题,包括:

  • /etc/sudoers写入%admin ALL=(ALL) ALL
  • proc_open()而不是exec()

似乎都没有起作用,因此让我发疯了!

因此,基本上,是否有一种明确的方法可以使PHP执行简单的终端命令?

编辑:澄清一下, myscript.scpt是一个简单的appleScript,可更改屏幕UI(用于较大的项目)。 response from the system. 从理论上讲, osascript myscript.scpt就足够了,但是sudo出于某种原因需要从系统调用响应。 如果可以以某种方式消除sudo ,我认为我不会遇到此权限问题。

听起来您需要设置无密码sudo。 尝试:

%admin ALL=(ALL) NOPASSWD: osascript myscript.scpt

如果存在,还注释掉以下行(通过visudo在/ etc / sudoers中):

Defaults    requiretty

如果还有人要求。 您可以编写纯文本文件,例如〜./。sudopass / sudopass.secret ,并在其中输入root密码。 假设根密码为“ 12345”。 您创建的〜./。sudopass / sudopass.secret仅包含“ 12345”作为其内容:

12345

然后您执行以下操作:

exec('sudo -u root -S {{ your command }} < ~/.sudopass/sudopass.secret');

请记住仅在受控环境中使用此功能。

我认为您可以使用visudo来为用户和命令带来特定的访问权限,如下所示:

nobody ALL = NOPASSWD: /path/to/osascript myscript.scpt

和与PHP:

@exec("sudo /path/to/osascript myscript.scpt ");

假设nobody正在运行apache。

php:bash控制台已创建,并执行第一个脚本,该脚本将sudo调用到第二个脚本,如下所示:

$dev = $_GET['device'];
$cmd = '/bin/bash /home/www/start.bash '.$dev;
echo $cmd;
shell_exec($cmd);
  1. /home/www/start.bash

     #!/bin/bash /usr/bin/sudo /home/www/myMount.bash $1 
  2. myMount.bash:

     #!/bin/bash function error_exit { echo "Wrong parameter" 1>&2 exit 1 } .......... 

oc,您要在没有root特权的情况下从root级别运行脚本,以创建和修改/etc/sudoers.d/mount文件:

www-data ALL=(ALL:ALL) NOPASSWD:/home/www/myMount.bash

不要忘记使用chmod:

sudo chmod 0440 /etc/sudoers.d/mount

运行sudo visudo命令,然后将-%sudo ALL=(ALL:ALL)%sudo ALL=(ALL:ALL) NOPASSWD: ALL它将起作用。

我最近发布了一个项目,该项目允许PHP获取真正的Bash shell并与之交互。 在此处获取它: https : //github.com/merlinthemagic/MTS外壳具有pty(伪终端设备,与ssh会话中的设备相同),并且可以根据需要将外壳作为根。 不确定是否需要root才能执行脚本,但是考虑到sudo可能会发生。

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

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

我在尝试exec()后端命令时也遇到类似情况no tty present and no askpass program specified在Web服务器错误日志中也no tty present and no askpass program specified 原始(错误)代码:

$output = array();
$return_var = 0;
exec('sudo my_command', $output, $return_var);

bash包装器解决了此问题,例如:

$output = array();
$return_var = 0;
exec('sudo bash -c "my_command"', $output, $return_var);

不知道这是否在每种情况下都有效。 另外,请确保在my_command部分上应用适当的引用/转义规则。

最好的安全方法是使用crontab。 将所有命令保存在数据库中,例如mysql表中,并创建一个cronjob来读取这些mysql entreis并通过exec()或shell_exec()执行。 请阅读此链接以获取更多详细信息。

          • killProcess.php

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM