sudo在PHP exec()

我不知道交易是在这里…

所以我想运行一个sudo osascript myscript.scptsudo 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); 
  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权限,要做到这一点创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的权限。