须藤在PHP EXEC()

问题描述 投票:39回答:8

我不知道这笔交易是在这里什么...

所以我想运行AppleScript:sudo osascript myscript.scpt

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

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

我做我的研究,似乎我错过了sudo命令的密码。我尝试了几种不同的方法来解决这个问题,其中包括:

  • %admin ALL=(ALL) ALL/etc/sudoers
  • proc_open() exec()代替

其中没有一个似乎工作,因此快把我逼疯了!

所以基本上,有没有一个明确的方式来让PHP执行一个简单的终端命令?

编辑:澄清,myscript.scpt是一个简单的AppleScript改变屏幕上的UI(对于一个较大的项目)。从理论上讲,只要osascript myscript.scpt应该够用了,但是sudo是一些必要的理由来调用从系统的一些反应。如果sudo可能以某种方式消除,我不认为我会被有这个权限问题。

php linux sudo
8个回答
17
投票

这听起来像你需要设置无密码须藤。尝试:

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

还注释以下行(在经由visudo命令的/ etc / sudoers的)中,如果它是存在的:

Defaults    requiretty

15
投票

如果有人仍然需要这一点。你可以写一个纯文本文件,说〜./。sudopass / sudopass.secret,根密码在那里。比方说,root的密码是“12345”。创建〜./ sudopass / sudopass.secret只有“12345”作为其内容:

12345

然后你做到以下几点:

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

只记得在受控环境中使用此。


9
投票

我想你可以给用户,并命令visudo这样的特定访问:

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

并用PHP:

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

假设nobody用户正在运行的Apache。


4
投票

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权限运行,从根级别的脚本,要做到这一点创建和修改/etc/sudoers.d/mount文件:

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

不要忘记文件模式:

sudo chmod 0440 /etc/sudoers.d/mount

1
投票

运行sudo visudo命令然后设置-%sudo ALL=(ALL:ALL)%sudo ALL=(ALL:ALL) NOPASSWD: ALL它会工作。


0
投票

我最近出版的一期工程,使PHP获得和一个真正的Bash shell互动。在这里获得:https://github.com/merlinthemagic/MTS外壳具有PTY(伪终端设备,就像您有即SSH会话),如果需要,你可以得到的shell作为根。不知道你需要root执行脚本,但考虑到你提到须藤这是可能的。

下载后,你会简单地使用下面的代码:

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

0
投票

我也有类似的情况试图exec()在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部分规则。


0
投票

最好的安全的方法是使用crontab。即保存在数据库中的所有命令说,MySQL表,并创建一个cronjob阅读这些MySQL的entreis,并通过执行exec()或执行了shell_exec()。请仔细阅读本link更详细的信息。

  • killProcess.php
© www.soinside.com 2019 - 2024. All rights reserved.