Я работаю над инструментом, который читает конфигурацию iptables с удаленного хоста по SSH2 с использованием расширения PECL SSH2. Я могу успешно выполнить соединение с командами хоста, аутентификации и выполнения. Проблема, с которой я столкнулась, иногда поток не содержит никаких данных.
/** * Load the current firewall configuration * @return bool */ public function loadRules() { $stream = ssh2_exec($this->connection,"~/iptsave;"); stream_set_blocking($stream,true); $iptablesSave = stream_get_contents($stream); if(empty($iptablesSave)) { return false; } parent::restore($iptablesSave); return true; }
Примерно в 25% времени loadRules()
возвращает false, даже при подключении к locahost вместо удаленной системы. Я смог решить проблему, изменив вызов ssh2_exec
на
$stream = ssh2_exec($this->connection,"~/iptsave; sleep .5");
но я обеспокоен тем, что что-то не так.
phpSecLib может помочь:
Согласно этому сообщению , он всегда возвращает результат, в отличие от ssh2.so.
У меня такая же проблема. Как-то вам нужно установить задержку для получения результата потока.
Способ, которым вы это сделали, возможен, но вы также можете установить sleep(1)
после функции stream_set_block($stream, true)
. Вы можете попробовать функцию usleep()
. Еще не пробовал
Возможно, это решит проблему:
$stream = ssh2_exec($this->connection,"~/iptsave;"); stream_set_blocking($stream,true); $stream_out = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO); $iptablesSave = stream_get_contents($stream);