Пустое содержимое потока PHP SSH2, даже с stream_set_blocking?

Я работаю над инструментом, который читает конфигурацию 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);