Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/12/2011, à 12:09

harmonyk

ssh2 + screen / Lire un fichier de log en temps réel

Bonjour,

Je travaille depuis quelques jours sur une class php (voir ci dessous) qui me permet d'envoyer des commandes ssh sur un serveur distant, par le biais d'une session screen.

Tout fonctionne parfaitement, meme si la sécurité n'est pas au rendez-vous, mais là n'est pas la question.

En effet ce que je voudrais réaliser, c'est un affichage en temps réel du retour des commandes envoyées dans la session screen.
Pour le moment j'utilise la fonction "-X log" de screen pour enregistrer ces résultats, ca fonctionne à une pétouille près, je n'obtiens avec php que le résultat de la commande lancée avant la précédente (l'affichage a donc 2 résultats de retard).

J'ai vérifié le fichier de log, il se rempli avec 2 commandes de retard, cela viendrait-il de la fonction "log" de screen (j'ai testé avec "hardcopy", la meme...)

Merci d'avance !

<?php
/**
 * @author HarmO
 * @example
 *    $oSsh=new Ssh(user, pass)
 *    $oSsh->screen('screenName', 'command');
 *    $aReturn = $oSsh->getTerm('/home/logs/screenlog.0');
 */
class Ssh
{
    private $host;
    private $user;
    private $pass;
    private $port;
    private $conn;
    private $stream;
    private $errorStream;
    private $log=array();
    private $aScreen=array();
    private $debug=false;
    
    public function __construct($user, $pass, $port=22, $host='localhost'){
    $this->host=$host;
    $this->user=$user;
    $this->pass=$pass;
    $this->port=$port;
    
    if($this->connect($this->host,$this->port))
    {
        if($this->auth_pwd($this->user,$this->pass))
        return true;
        else 
        return false;
    } 
    else 
        return false;
    }
    
    public function connect($host, $port){
    if(($this->conn=ssh2_connect($host, $port)))
    {
        $this->log[]='Connexion success to '.$host.' : '.$port;
        return true;
    }
    else
    {
        $this->log[]='Connexion failed to '.$host.' : '.$port;
        return false;
    }
    }
    
    public function auth_pwd($user, $pass){
    if(ssh2_auth_password($this->conn, $user, $pass))
    {
        $this->log[]='Login success by '.$user;
        return true;
    }
    else
    {
        $this->log[]='Login failed by '.$user;
        return false;
    }
    }
    
    public function exec($cmd){
    $this->stream=  ssh2_exec($this->conn, $cmd);
    $this->log[]='Exec command : '.$cmd;
    $this->errorStream=ssh2_fetch_stream($this->stream, SSH2_STREAM_STDERR);
    }
    
    public function screen($screen, $cmd){
    $this->stream=  ssh2_exec($this->conn, 'screen -dr '.$screen.' -X eval \'stuff "'.$cmd.'"\015\' log');
    $this->log[]='Exec command : '.$cmd;
    $this->errorStream=ssh2_fetch_stream($this->stream, SSH2_STREAM_STDERR);
    }
    
    public function getLog($print=false){
    if($print==false)
        return $this->log;
    else
    {
        echo '<pre>';
        foreach($this->log as $key=>$val)
        echo $key. ' : '.$val.PHP_EOL;
        echo '</pre>';
    }
    }
    
    public function getTerm($logFile=false){
    if($logFile==true)
        $this->exec('sleep 2 && cat '.$logFile.' && rm -rf '.$logFile);
    
    stream_set_blocking($this->stream, true);
    stream_set_blocking($this->errorStream, true);
    $tmp=stream_get_contents($this->stream);
    $this->aScreen=array('results'=>explode(PHP_EOL, $tmp), 'errors'=>stream_get_contents($this->errorStream));
    return $this->aScreen;
    }
    
    public function debug(){
    $this->debug=true;
    }
    
    public function disconnect(){
    unset($this->conn);
    
    if($this->debug==true)
        $this->getLog(true);
    return null;
    }
}
?>

Hors ligne