sudo在PHP exec()
我不知道交易是在这里…
所以我想运行一个sudo osascript myscript.scpt
: sudo osascript myscript.scpt
这在terminal工作正常,但不是当我通过PHP的exec()
执行它; 什么都没发生。 控制台说
no tty present and no askpass program specified ; TTY=unknown ; …
我做了我的研究,似乎我错过了sudo
命令的密码。 我尝试了几种不同的方式来解决这个问题,包括:
- 在
/etc/sudoers
写入%admin ALL=(ALL) ALL
- 和
proc_open()
而不是exec()
这似乎没有任何工作,因此驱使我CrAzY!
所以基本上,有一个明确的方法让PHP执行一个简单的terminal命令?
编辑:澄清, myscript.scpt
是一个简单的appleScript,改变了屏幕上的用户界面(一个较大的项目)。 理论上, osascript myscript.scpt
应该足够了,但是sudo
是由于某种原因需要从系统调用一些响应的。 如果sudo
可能被消除,我不认为我会有这个权限问题。
如果有人仍然需要这个。 你可以写一个纯文本文件,例如〜./。sudopass / sudopass.secret ,并在那里inputroot密码。 假设root密码是“12345”。 你创build〜./。sudopass / sudopass.secret只有'12345'作为它的内容:
12345
然后你做下面的事情:
exec('sudo -u root -S {{ your command }} < ~/.sudopass/sudopass.secret');
请记住只能在受控环境中使用它。
这听起来像你需要设置无密码的sudo。 尝试:
%admin ALL=(ALL) NOPASSWD: ALL
也注释掉以下行(在/ etc / sudoers通过visudo),如果它在那里:
Defaults requiretty
php:bash控制台被创build,它执行第一个脚本,它调用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权限,要做到这一点创build和修改/etc/sudoers.d/mount文件:
www-data ALL=(ALL:ALL) NOPASSWD:/home/www/myMount.bash
不要忘记chmod:
sudo chmod 0440 /etc/sudoers.d/mount
我认为你可以带来特定的访问权限,如visudo
:
nobody ALL = NOPASSWD: /path/to/osascript myscript.scpt
并用php:
@exec("sudo /path/to/osascript myscript.scpt ");
假设nobody
用户正在运行Apache。
运行sudo visudo
命令,然后设置-%sudo ALL=(ALL:ALL)
到%sudo ALL=(ALL:ALL) NOPASSWD: ALL
将会起作用。
我最近发布了一个项目,允许PHP获得一个真正的Bash shell并与之交互。 得到它在这里: https : //github.com/merlinthemagic/MTS壳有一个pty(伪terminal设备,相同,你会在一个SSH会话),你可以得到的shell作为根,如果需要的话。 不知道你需要root来执行你的脚本,但给你提到sudo是可能的。
下载后,你只需使用下面的代码:
$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true); $return1 = $shell->exeCmd('/path/to/osascript myscript.scpt');
如何使用sudo
运行PHP脚本,并在脚本中省略它? 这可能也会考虑subprocess的权限。