如何从PHP执行交互式命令?

我需要从PHP脚本(使用浏览器,而不是命令行)在我的桌面机器(localhost)中执行kdiff3命令。 我已经授予执行脚本的用户www-data使用visudo执行kdiff3的权限。 事实上,如果我作为万维网数据login,我可以执行它没有问题( sudo kdiff3 … ,它被configuration为根本不要求密码)。

问题是当我尝试从PHP脚本执行这个命令。 我试过这个:

$output = shell_exec("sudo kdiff3 -m $file.def.old $file $file.def -o $file"); 

没有任何反应(输出为NULL)。 如果我尝试一个非交互式命令,像ls它的工作:

 $output = shell_exec("ls"); 

发生了什么? 为什么不能执行交互式命令?

Solutions Collecting From Web of "如何从PHP执行交互式命令?"

kdiff3是一个交互式的图形用户界面程序,所以它使用KDE和Qt,并且需要一个X11服务器。

而在一个网络服务器(即运行ApacheLighttpd PHP ),你没有任何X11服务器。

因此,在PHP脚本中没有办法使用kdiff3 (除非Web服务器在桌面Linux机器上运行,然后您需要适当地设置环境,特别是DISPLAY和可能的XAUTHORITY环境变量)。 但是你可以运行一个像diff3的命令行程序(使用popen技巧)。

尝试passthru($cmd) ;

它将允许用户的终端屏幕上的I / O。

问题在于sudo正在等待用户输入,正如你所说的那样,它是“交互式”的 – 它要求你输入密码。

您可以通过使用proc_open()来执行命令并获取单独的I / O流,以便在需要时解析输出并提供密码。

我遇到了使用echo "suPassword\n" | sudo cmd这种方法的脚本 echo "suPassword\n" | sudo cmd做到这一点,但我个人认为这是一个打击和小姐。

尝试使用exec:

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

每个交互式命令都需要一个工作标准输入 – 这不是用shell_exec();

使用popen()和朋友或重定向您的输入文件。 如果有问题的文件检查ISATTY ,您可能仍然不走运