2009-10-10 6 views
1

Я работаю над инструментом, который читает конфигурацию iptables с удаленного хоста через SSH2 с использованием расширения PECL SSH2. Я могу успешно выполнить соединение с командами хоста, аутентификации и выполнения. Проблема, с которой я столкнулась, иногда поток не содержит никаких данных.Пустое содержимое потока SSH2 для PHP, даже с stream_set_blocking?

/** 
    * 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() возвращает ложь, даже при подключении к locahost вместо удаленной системы. Я был в состоянии обойти эту проблему, изменив ssh2_exec вызов

$stream = ssh2_exec($this->connection,"~/iptsave; sleep .5"); 

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

+0

ли вы когда-нибудь получите ответ на свой вопрос? –

ответ

-1

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

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

+0

Не работает. Тот же пустой выход. – csonuryilmaz

+0

Я думал, что эти решения не работают, но я нашел свою ошибку. Я добавил к концу строки «2> & 1» для перенаправления stderr на stdout. Теперь это работает :) Пожалуйста, проверьте эту ссылку для получения дополнительной информации: http://stackoverflow.com/questions/16665041/php-why-isnt-exec-returning-output – csonuryilmaz

1

phpSecLib может быть в состоянии помочь:

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

-1

Может быть, это будет решать вопрос:

$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

Не работает. Тот же пустой выход. – csonuryilmaz

+0

Я думал, что эти решения не работают, но я нашел свою ошибку. Я добавил к концу строки «2> & 1» для перенаправления stderr на stdout. Теперь это работает :) Пожалуйста, проверьте эту ссылку для получения дополнительной информации: http://stackoverflow.com/questions/16665041/php-why-isnt-exec-returning-output – csonuryilmaz