sudo in php exec()
I don't know what the deal is here…
So I want to run an applescript: sudo osascript myscript.scpt
This works fine in the terminal, but not when I execute it via PHP's exec()
; nothing happens. The console says
no tty present and no askpass program specified ; TTY=unknown ; …
I did my research, and it seems I'm missing the password for the sudo
command. I tried a couple different ways to get around this, including:
- writing
%admin ALL=(ALL) ALL
in/etc/sudoers
- and
proc_open()
instead ofexec()
none of which seem to be working, consequently driving me CrAzY!
So basically, is there a clear-cut way to get PHP to execute a simple terminal command?
EDIT: to clarify, myscript.scpt
is a simple appleScript that changes the onscreen UI (for a larger project). In theory, simply osascript myscript.scpt
should be enough, however the sudo
is for some reason necessary to invoke some response from the system. If the sudo
could be somehow eliminated, I don't think I would be having this permissions problem.
Solution 1:
It sounds like you need to set up passwordless sudo. Try:
%admin ALL=(ALL) NOPASSWD: osascript myscript.scpt
Also comment out the following line (in /etc/sudoers via visudo), if it is there:
Defaults requiretty
Solution 2:
I think you can bring specific access to user and command with visudo
something like this:
nobody ALL = NOPASSWD: /path/to/osascript myscript.scpt
and with php:
@exec("sudo /path/to/osascript myscript.scpt ");
supposing nobody
user is running apache.
Solution 3:
php: the bash console is created, and it executes 1st script, which call sudo to the second one, see below:
$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, you want to run script from root level without root privileges, to do that create and modify the /etc/sudoers.d/mount file:
www-data ALL=(ALL:ALL) NOPASSWD:/home/www/myMount.bash
dont forget to chmod:
sudo chmod 0440 /etc/sudoers.d/mount