2009-10-10 6 views
1

Je travaille sur un outil qui lit une configuration iptables à partir d'un hôte distant sur SSH2 en utilisant l'extension PECL SSH2. Je parviens à établir la connexion avec l'hôte, à m'authentifier et à exécuter des commandes. Le problème que j'ai est parfois le flux ne contient aucune donnée.Vide le contenu du flux PHP SSH2, même avec 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; 
    } 

Environ 25% du temps, loadRules() renvoie false, même lors de la connexion à locahost au lieu du système distant. J'ai pu contourner le problème en changeant l'appel ssh2_exec à

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

mais je crains que quelque chose ne va pas.

+0

Avez-vous jamais obtenir une réponse à votre question? –

Répondre

-1

J'ai le même problème ici. D'une certaine façon, vous devez définir un délai pour obtenir le résultat du flux.

La façon dont vous l'avez fait est possible, mais vous pouvez également définir un sleep(1) après la fonction stream_set_block($stream, true). Vous pouvez essayer la fonction usleep(). Je n'ai pas encore essayé

+0

Non travaillé. Même sortie vide. – csonuryilmaz

+0

Je pensais que ces solutions ne fonctionnaient pas mais j'ai trouvé mon erreur. J'ai ajouté à la fin de ma commande "2> & 1" chaîne afin de rediriger stderr à stdout. Maintenant cela fonctionne :) Veuillez vérifier ce lien pour plus d'informations: http://stackoverflow.com/questions/16665041/php-why-isnt-exec-returning-output – csonuryilmaz

1

phpSecLib peut être en mesure d'aider:

Selon this post, il retourne toujours la sortie, à la différence ssh2.so.

-1

Peut être cela résoudra le problème:

$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

Non travaillé. Même sortie vide. – csonuryilmaz

+0

Je pensais que ces solutions ne fonctionnaient pas mais j'ai trouvé mon erreur. J'ai ajouté à la fin de ma commande "2> & 1" chaîne afin de rediriger stderr à stdout. Maintenant ça marche :) Veuillez vérifier ce lien pour plus d'informations: http://stackoverflow.com/questions/16665041/php-why-isnt-exec-returning-output – csonuryilmaz

Questions connexes