我不知道这笔交易是在这里什么...
所以我想运行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
可能以某种方式消除,我不认为我会被有这个权限问题。
这听起来像你需要设置无密码须藤。尝试:
%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);
#!/bin/bash
/usr/bin/sudo /home/www/myMount.bash $1
#!/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
运行sudo visudo
命令然后设置-%sudo ALL=(ALL:ALL)
到%sudo ALL=(ALL:ALL) NOPASSWD: ALL
它会工作。
我最近出版的一期工程,使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');
我也有类似的情况试图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
部分规则。
最好的安全的方法是使用crontab。即保存在数据库中的所有命令说,MySQL表,并创建一个cronjob阅读这些MySQL的entreis,并通过执行exec()或执行了shell_exec()。请仔细阅读本link更详细的信息。