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

时间:2019-09-03 05:49:01

标签: php bash shell

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

所以我改用popen(),所以我打印输出结果。现在效果很好,但是我遇到了下一个问题,我找不到有效的解决方案:handle从被调用的脚本/程序中进行提示。我项目的本质是使我无法预先知道脚本是否需要用户输入,因此无法自动回答提示。例如,诸如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管道没有得到进一步处理有关,但我不知道如何正确设置它。

有人可以在正确的方向上指导我,使实现看起来像支持用户提示而不是自动回答吗?

1 个答案:

答案 0 :(得分:0)

事实证明,有一个更简单的解决方案:只需使用passthru()函数,它就可以正确处理用户提示并实时输出。