我正在尝试使用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也可能有更好的方法来做到这一点......但不知道该怎么做。
谢谢!
答案 0 :(得分:1)
为什么不改变你怎么称呼apt-get到apt-get install -y emacs
所以它不会提示是或否?您可能还想使用-q,因此它不会打印进度。
请参阅apt-get(8)
您的解决方案的问题是$ ssh-&gt;读取等待,直到找到给定的模式。
答案 1 :(得分:0)
您还可以执行$ ssh-&gt; setTimeout(10)或其他任何内容,然后在连接超时时执行$ ssh-&gt; getLog()以查看实际发送的内容。