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

时间:2012-01-27 11:10:48

标签: php linux shell

我需要从PHP脚本(使用浏览器,而不是命令行)在我的桌面计算机(localhost)中执行 kdiff3 命令。我已经允许正在执行脚本的用户 www-data 使用 visudo 执行kdiff3。事实上,如果我以 www-data 身份登录,我可以毫无问题地执行它( sudo kdiff3 ... ,它被配置为根本不要求密码)。

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

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

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

$output = shell_exec("ls");

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

5 个答案:

答案 0 :(得分:9)

尝试passthru($cmd);

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

答案 1 :(得分:2)

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

在网络服务器中(例如PHP正在运行ApacheLighttpd),您没有任何X11服务器。

因此无法在PHP脚本中使用kdiff3(除非Web服务器在桌面Linux机器上运行;然后您需要适当地设置环境,尤其是DISPLAY和可能XAUTHORITY环境变量)。但是,您可以运行命令行程序,如diff3 ...(使用popen技巧)。

答案 2 :(得分:1)

问题是sudo正在等待用户输入,正如您所说,它是“互动的” - 它已经要求您输入密码。

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

我遇到了使用这种echo "suPassword\n" | sudo cmd方法执行此操作的脚本,但我个人认为这有点受欢迎。

答案 3 :(得分:0)

尝试使用exec:

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

答案 4 :(得分:0)

每个交互式命令都需要一个正在运行的标准输入 - 这不是shell_exec();

使用popen()和朋友或从文件中重定向您的输入。如果相关文件检查ISATTY

,您可能仍然不幸