У меня есть сеанс SSH2_Shell, работающий в PHP. моя проблема в том, что мне нужна команда, чтобы полностью закончить, прежде чем перейти к следующей команде. Вот мой код:
$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, как когда я это делаю, он, похоже, заморозит мой браузер.
В общем, мне нужен способ определить, когда команда закончилась и перейти к следующей команде.
Заранее спасибо!
Спасибо за идеи, но я думаю, что решил. Когда закончилась команда, я сделал эхо нескольких специальных символов, а затем я бы поискал символы с помощью strpos (). Еще одна вещь, о которой я думаю, возможно, помогла настроить параметр max_execution_time в файле php.ini. Я нашел ответ здесь:
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);
У меня есть класс SSH2, который реализует Secure Shell2 поверх github. Проверьте https://github.com/bubba-h57/PHP-SSH2 и посмотрите, поможет ли это.
Я продолжаю искать лучший способ справиться с поиском подсказок, поэтому любые советы или вклад в это будут приветствоваться. Надеюсь, это поможет, если не что иное, как дать вам некоторые идеи.
Вы можете использовать phpseclib, чистую реализацию PHP SSH . например.
<?php include('Net/SSH2.php'); $ssh = new Net_SSH2(); $ssh->login('username', 'password'); echo $ssh->exec('command'); echo $ssh->exec('command2'); ?>
в<?php include('Net/SSH2.php'); $ssh = new Net_SSH2(); $ssh->login('username', 'password'); echo $ssh->exec('command'); echo $ssh->exec('command2'); ?>
Если вам действительно нужна поддержка оболочки, вы можете сделать следующее (с последним 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]'); ?>
в<?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]'); ?>