[英]sudo in php exec()
我不知道这是什么交易...
所以我想运行一个sudo osascript myscript.scpt
: sudo 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);
/home/www/start.bash
#!/bin/bash /usr/bin/sudo /home/www/myMount.bash $1
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()执行。 请阅读此链接以获取更多详细信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.