I need to execute kdiff3 command in my desktop machine (localhost) from PHP script (using browser, not command line). I've given permission for the user www-data that is executing the scripts to execute kdiff3 using visudo. In fact, if I log in as www-data I can execute it without problems (sudo kdiff3 ..., it's configured to not ask for a password at all).
The problem is when I try to execute this command from a PHP script. I've tried this:
$output = shell_exec("sudo kdiff3 -m $file.def.old $file $file.def -o $file");
and nothing happens (output is NULL). If I try a non interactive command, like ls it works:
$output = shell_exec("ls");
What's happening? Why cannot execute an interactive command?
Try
passthru($cmd)
;It will allow user's I/O on the Terminal screen.
Try to use exec :
$Output= exec( $command ,$dom,$return )
kdiff3 is an interactive graphical user interface program, so it use KDE and Qt and requires an X11 server.
And within a web server (i.e. in
PHP
running forApache
orLighttpd
) you don't have any X11 server.So there is no way to use
kdiff3
from inside a PHP script (unless the web server is running on your desktop Linux machine; and then you need to set appropriately the environment, notablyDISPLAY
and probablyXAUTHORITY
environment variable). However you could run a command line program likediff3
... (using thepopen
tricks).Every interactive command expects a working stdin - this is not given with
shell_exec();
Use
popen()
and friends or redirect your input from a file. You might still be out of luck, if the file in question checksISATTY
The problem is that
sudo
is waiting for user input, as you have said, it is "interactive" - it has asked you for a password.You can supply one by using
proc_open()
to execute the command and get separate I/O streams, so that you can parse the output and supply the password when required.I have come across scripts that use this approach of
echo "suPassword\n" | sudo cmd
to do this, but I personally have found this to be a bit hit and miss.