1

我正在尝试使用 phpseclib(使用 apt-get)安装应用程序,并希望处理我可能收到的不同输出结果......但是我不确定如何让它工作。我目前有以下内容:

$first = $ssh->read('root@DMZ-Server:~#');
$ssh->write("sudo apt-get install emacs\n");
echo "<br />";
echo "sudo apt-get install emacs";
echo str_repeat(' ',1024*64);
if ($unexpected_output = $ssh->read('root@DMZ-Server:~#')){
  echo "<pre>$unexpected_output</pre>";
  echo str_repeat(' ',1024*64);
}   elseif ($continue = $ssh->read('Do you want to continue [Y/n]?')){
    echo "<pre>$continue</pre>";
    echo str_repeat(' ',1024*64);
    $ssh->write("Y\n");
    $continue_end = $ssh->read('root@DMZ-Server:~#');
    echo "<pre>$continue_end</pre>";
    echo str_repeat(' ',1024*64);
} 

这个 if 循环只适用于第一个“if”......也就是说,如果有意外的输出(你回到 shell 没有被问到“你想继续”,这意味着已经安装等)那么这个脚本将工作得很好。

但是如果应用程序没有安装,它永远不会进入 elseif 循环。我很确定原因是因为第一个 ssh->read 将继续,直到 php 超时,等待结果......我如何编写它以便它同时查看两个选项,并选择正确的一个。

我正在考虑为此使用 CASE,但不知道如何写...

使用 phpseclib 也可能有更好的方法来做到这一点......但不知道如何做到这一点。

谢谢!

4

2 回答 2

1

你为什么不改变你调用 apt-get 的方式,apt-get install -y emacs这样它就不会提示是或否?您可能还想使用 -q 这样它就不会打印进度。

apt-get(8)

您的解决方案的问题是 $ssh->read 等到找到给定的模式。

于 2012-06-17T20:09:51.943 回答
0

您也可以执行 $ssh->setTimeout(10) 或其他任何操作,然后在连接超时时执行 $ssh->getLog() 以查看实际发送的内容。

于 2012-06-17T20:43:53.287 回答