phpseclib $ ssh->基于结果的read()循环

时间:2012-06-17 13:43:24

标签: php ssh phpseclib

我正在尝试使用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->读取将继续,直到php超时,等待结果......如何编写它以便它同时查看两个选项,并选择正确的一个

我正在考虑使用CASE,但我不确定如何写这个...

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

谢谢!

2 个答案:

答案 0 :(得分:1)

为什么不改变你怎么称呼apt-get到apt-get install -y emacs所以它不会提示是或否?您可能还想使用-q,因此它不会打印进度。

请参阅apt-get(8)

您的解决方案的问题是$ ssh-&gt;读取等待,直到找到给定的模式。

答案 1 :(得分:0)

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