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的权限。