执行从 PHP 读取用户输入的 shell 脚本

我正在尝试实现一种可用于调用 shell 脚本或程序的 PHP 方法。使用反引号这本身很容易,但是我只在脚本/程序完成时才得到输出,这不是我需要的。


所以我切换到 using popen(),所以我在输入时打印输出。现在工作正常,但我遇到了下一个我找不到工作解决方案的问题:处理来自被调用脚本/程序的提示。我的项目的本质是我无法预先知道脚本是否需要用户输入,因此无法自动回答提示。例如,像这样的脚本apt-get update ; apt-get upgrade可能会触发我不知道也不想为用户自动回答的用户提示。


目前我正在使用我在StackOverflow 上找到的这篇文章:


        static public function command($cmd) 

        {

            $cwd = getcwd();  

            $proc = proc_open($cmd, [['pipe','r'],['pipe','w'],['pipe','w']], $pipes, $cwd);


            while(($line = fgets($pipes[1])) !== false) 

            {

                fwrite(STDOUT,$line);

            }


            while(($line = fgets($pipes[2])) !== false) 

            {

                fwrite(STDERR,$line);

            }


            fclose($pipes[0]);

            fclose($pipes[1]);

            fclose($pipes[2]);


            return proc_close($proc);

        }

它适用于输出,但是一旦脚本提示用户(例如使用read -p "What's your poison?"),我就没有输出,也无法输入任何内容。起初我认为这可能与没有进一步处理 STDIN 管道有关,但我不知道如何正确设置它。


有人可以在正确的方向上指导我实施如何支持用户提示而不是自动回答它们吗?


慕标5832272
浏览 140回答 1
1回答

慕容708150

事实证明,有一个更简单的解决方案:只需使用该passthru()功能,它就会正确处理用户提示并实时输出。
打开App,查看更多内容
随时随地看视频慕课网APP