Пустое содержимое потока PHP SSH2, даже с stream_set_blocking? - PullRequest
1 голос
/ 10 октября 2009

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

но меня беспокоит, что что-то не так.

Ответы [ 3 ]

1 голос
/ 18 декабря 2009

phpSecLib может помочь:

Согласно этому посту , он всегда возвращает результат, в отличие от ssh2.so.

0 голосов
/ 27 апреля 2014

Может быть, это решит проблему:

$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);
0 голосов
/ 23 ноября 2009

У меня тут такая же проблема. Каким-то образом вам нужно установить задержку для получения результата потока.

То, как вы это сделали, возможно, но вы также можете установить sleep(1) после функции stream_set_block($stream, true). Вы можете попробовать функцию usleep(). Еще не пробовал

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...