【问题标题】:phpseclib $ssh->read() loop based on resultsphpseclib $ssh->read() 循环基于结果
【发布时间】:2013-02-13 21:53:37
【问题描述】:

我正在尝试使用 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 也可能有更好的方法来执行此操作...但不确定如何执行此操作。

谢谢!

【问题讨论】:

    标签: php ssh phpseclib


    【解决方案1】:

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

    apt-get(8)

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

    【讨论】:

    • 哦,好吧,我必须承认我不知道那个选项......我会使用它,虽然我希望有一种方法可以使用 CASE 语句,以便我可以搜索“emacs已经是最新版本”或“未找到包”等,因此用户可以获得确切的错误消息,但这解决了我的直接问题,谢谢。
    • 如果您使用我的方法,您可以使用 $ssh->exec 并 grep 它输出的最新版本的文本
    • 哦,太好了!这很有帮助,我刚刚开始使用 stristr 搜索 $ssh->exec 输出...效果很好,谢谢。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 2016-10-16
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 2019-09-28
      相关资源
      最近更新 更多