我需要从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");
发生了什么事?为什么不能执行交互式命令?
答案 0 :(得分:9)
尝试passthru($cmd)
;
它将允许终端屏幕上的用户I / O.
答案 1 :(得分:2)
kdiff3是一个交互式图形用户界面程序,所以它使用KDE和Qt,需要一个X11服务器。
在网络服务器中(例如PHP
正在运行Apache
或Lighttpd
),您没有任何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