【问题标题】:How to execute an interactive command from PHP?如何从 PHP 执行交互式命令?
【发布时间】:2012-02-20 09:23:51
【问题描述】:

我需要从 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");

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

【问题讨论】:

    标签: php linux shell


    【解决方案1】:

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

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

    我遇到过使用echo "suPassword\n" | sudo cmd 的这种方法来执行此操作的脚本,但我个人觉得这有点偶然。

    【讨论】:

    • 您可以配置sudo,使其不要求输入密码。
    • 是的,但这对于网络服务器用户来说是一个非常的坏主意,这就是我不建议这样做的原因。允许 Web 服务器用户有效地为所欲为,这会带来严重的麻烦。
    • 同意,但是在网络服务器上使用sudokdiff3 已经很糟糕了......
    • 如果你真的将密码限制在特定的命令中,它可能会比在应用程序中写入密码的危害更小。
    • @BasileStarynkevitch:事实上,我已将 sudo 配置为不要求输入密码。它写在我的问题中,但表达不佳,对不起。这不是问题。
    【解决方案2】:

    尝试使用 exec :

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

    【讨论】:

      【解决方案3】:

      每个交互式命令都需要一个正常工作的标准输入 - shell_exec(); 没有给出这一点

      使用popen() 和朋友或从文件重定向您的输入。如果有问题的文件检查了ISATTY

      ,您可能仍然不走运

      【讨论】:

        【解决方案4】:

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

        并且在 Web 服务器中(即在运行 ApacheLighttpdPHP 中)您没有任何 X11 服务器。

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

        【讨论】:

        • 也许我不应该说“我需要在我的本地主机中执行 kdiff3 命令”。更好:“我需要在我的台式机上执行 kdiff3 命令”:)
        • 只需将 DISPLAY=:0.0 添加到 /etc/environment 即可。谢谢!
        【解决方案5】:

        试试passthru($cmd)

        它将允许用户在终端屏幕上进行 I/O。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-06-22
          • 2011-02-25
          • 1970-01-01
          • 2019-05-25
          • 2012-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多