我在PHP中使用SSH2_Shell会话。我的问题是我需要一个命令完全完成才能进入下一个命令。到目前为止,这是我的代码:
$command_capture = "cd /mnt/NADS/scripts/";
$command_capture2 = "./tcpdump.sh $capture_name $sleep";
if (!($connection = ssh2_connect("172.20.1.18", 22))) {
echo "fail: unable to establish connection";
}
if (!ssh2_auth_password($connection, "root", "Hideandseek")) {
echo "fail: unable to authenticate";
}
$stream = ssh2_shell($connection);
fwrite($stream, $command_capture. PHP_EOL);
sleep(1);
fwrite($stream, $command_capture2 . PHP_EOL);
sleep(5);
$data="";
while($buf = stream_get_contents($stream)){
$data.=$buf;
}
echo $data;
fclose($stream);
tcpdump.sh脚本正在运行lftp命令,但没有足够的时间来完成。我不能使用睡眠,因为它可能需要更长的时间,然后指定的时间,我不想让用户等待,如果它只需要几秒钟。我没有幸运实现stream_set_blocking,就像我一样,似乎冻结了我的浏览器。
总的来说,我需要一种方法来检测命令何时完成并进入下一个命令。
提前致谢!
答案 0 :(得分:1)
感谢您的想法,但我想我已经解决了。当命令结束时,我对一些特殊字符进行了回显,然后我将使用strpos()搜索字符。我认为可能有帮助的另一件事是调整php.ini文件中的max_execution_time设置。我在这里找到答案:
http://verysimple.com/2006/03/30/fatal-error-maximum-execution-time-of-30-seconds-exceeded/
这是我的新代码
$data="";
while (true){
$data .= stream_get_contents($stream);
if (strpos($data,"XOXO") !== false) {
echo "okay: command finished\n";
break;
}
}
echo $data;
fclose($stream);
答案 1 :(得分:0)
我有一个SSH2类,它在github上实现了Secure Shell2 ..查看https://github.com/bubba-h57/PHP-SSH2并查看是否有帮助。
我继续寻找更好的方法来处理寻找提示,所以任何建议或贡献都会受到欢迎。希望它能提供帮助,只不过是给你一些想法。
答案 2 :(得分:0)
您可以使用phpseclib, a pure PHP SSH implementation。例如
<?php
include('Net/SSH2.php');
$ssh = new Net_SSH2();
$ssh->login('username', 'password');
echo $ssh->exec('command');
echo $ssh->exec('command2');
?>
如果您真的需要shell支持,可以执行以下操作(使用最新的SVN):
<?php
include('Net/SSH2.php');
$ssh = new Net_SSH2();
$ssh->login('username', 'password');
$ssh->read('[prompt]');
$ssh->write("command\n");
echo $ssh->read('[prompt]');
$ssh->write("command\n");
echo $ssh->read('[prompt]');
?>