Ivan
Ivan

Reputation: 15912

How to execute an interactive command from PHP?

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?

Upvotes: 6

Views: 7037

Answers (5)

Francisco Luz
Francisco Luz

Reputation: 2943

Try passthru($cmd);

It will allow user's I/O on the Terminal screen.

Edit (27 january 2024)

readline() is a better option.

Here is an example:

<?php
$invalid = TRUE;
while($invalid) {
    $input = strtolower(readline('Confirm (y/n): '));
    $invalid = !in_array($input, ['y', 'n']);
}
$yes = $input === 'y';
var_dump($yes);

Upvotes: 16

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 for Apache or Lighttpd) 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, notably DISPLAY and probably XAUTHORITY environment variable). However you could run a command line program like diff3 ... (using the popen tricks).

Upvotes: 1

Eugen Rieck
Eugen Rieck

Reputation: 65244

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 checks ISATTY

Upvotes: 0

Pavunkumar
Pavunkumar

Reputation: 5335

Try to use exec :

$Output= exec( $command ,$dom,$return )

Upvotes: 0

DaveRandom
DaveRandom

Reputation: 88647

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.

Upvotes: 1

Related Questions