Pages : 1
#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