php - 从 PHP 使用 linux 'dialog' 命令

标签 php dialog command-line-interface

我正在尝试编写一个帮助程序脚本来在服务器上执行只能从命令行完成的各种管理任务,并尝试使用“对话框”命令来显示消息框、输入、密码提示等,但是,这个任务的需要要求我用 PHP 处理数据。

我在让对话框命令以这种方式工作时遇到问题,无法弄清楚我做错了什么。

有一个例子here

不幸的是,它不起作用。

当您对外部应用程序运行 PHP 和 exec/backtick/system 时,IO 似乎没有按您预期的方式工作。

我能得到的最接近的是使用 passthru() 命令:

<?php
  $CMD = "dialog --menu \"Please select\" 10 40 3 backup \"Backup Files\" restore \"Restore Files\"";
  passthru($CMD);
?>

这是 PHP 让对话框正确使用 STDOUT 的唯一方法,任何其他方法都不会显示,但您可以按回车键选择一个选项。

我试过反引号、exec() 和 system() 但似乎没有任何效果。

我想知道的是如何从 PHP 中正确读取 STDERR 以将返回值放入名为 $result 的变量中。

我敢肯定其他一些系统管理员以前不得不这样做。

我不为此使用 bash 的原因是我必须执行的一个命令作为选择的结果只产生 XML 输出,我无法在 bash 中有效地解析它。

最佳答案

以防万一其他人正在搜索此内容:

function dialog ($args) {
    $pipes = array (NULL, NULL, NULL);
    // Allow user to interact with dialog
    $in = fopen ('php://stdin', 'r');
    $out = fopen ('php://stdout', 'w');
    // But tell PHP to redirect stderr so we can read it
    $p = proc_open ('dialog '.$args, array (
        0 => $in,
        1 => $out,
        2 => array ('pipe', 'w')
    ), $pipes);
    // Wait for and read result
    $result = stream_get_contents ($pipes[2]);
    // Close all handles
    fclose ($pipes[2]);
    fclose ($out);
    fclose ($in);
    proc_close ($p);
    // Return result
    return $result;
}

它需要对话框(apt-get 安装对话框)和 proc_xxx(PHP 4.3.0、PHP 5)

它有效,至少对我而言。 :)

关于php - 从 PHP 使用 linux 'dialog' 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4711904/

相关文章:

php - 通过 WordPress Media Uploader 上传图片时出现 HTTP 错误

C GTK通过ESC关闭后无法再次打开Dialog

javascript - 我将如何实现 stackoverflow 的悬停对话框?

cmd - 从 cmd 打印 MS Word 文件

erlang - Elixir 或 Erlang 通过隐藏输入提示输入密码

php - 时间戳查询不起作用

php - 使用 PHP 和 MySQL 进行事务处理

php - 追踪 CakePHP 中的错误函数调用

ios - nativescript 模态对话框透明度

Ruby thor 命令行工具命令