2012-05-07 12 views
5

Ok, entonces pecl ssh2 supuestamente es un contenedor para libssh2. libssh2 tiene libssh2_channel_get_exit_status. ¿Hay CUALQUIER forma de obtener esta información?PHP ssh2_exec estado de salida del canal?

que necesito:
-stdout
-STDERR
-exit ESTADO

tengo todo, pero el código de salida. Mucha gente lanza phplibsec cuando ssh aparece, pero no veo forma de que stderr o el estado de salida del canal salga de eso:/¿Alguien ha podido obtener los tres?

Respuesta

6

Por lo tanto, lo primero es lo primero:
NO, no implementaron libssh2_channel_get_exit_status. ¿Por qué? Mas alla de mi.

Esto es lo que hicieron Identificación:

$command .= ';echo -e "\n$?"' 

que abarrotan un salto de línea y el eco de $? al final de cada comando que ejecuto. ¿Alto y delgado? Sí. Pero parece haber funcionado bastante bien. Luego lo retiro en $ returnValue y quito todas las líneas nuevas del final de stdout. Tal vez algún día obtenga el estado de salida del canal y algunos años después estará en los repositorios de distribución. Por ahora, esto ha sido lo suficientemente bueno. Cuando ejecuta más de 30 comandos remotos para poblar recursos remotos complejos, esto es mucho, mucho mejor que configurar y desmantelar la sesión ssh para cada comando.

+1

Si el comando es 'exit 1', el eco no se ejecutará. '$ command = '('. $ command. '); echo -e" \ n $? "'' podría ser mejor. – Jesse

5

Me trataron de mejorar la respuesta de Rapzid un poco más. Para mi propósito envolví ssh2 en un objeto php e implementé estas dos funciones. Me permite manejar los errores ssh utilizando la captura de excepciones de sanación.

function exec($command) 
{ 
    $result = $this->rawExec($command.';echo -en "\n$?"'); 
    if(! preg_match("/^(.*)\n(0|-?[1-9][0-9]*)$/s", $result[0], $matches)) { 
     throw new RuntimeException("output didn't contain return status"); 
    } 
    if($matches[2] !== "0") { 
     throw new RuntimeException($result[1], (int)$matches[2]); 
    } 
    return $matches[1]; 
} 

function rawExec($command) 
{ 
    $stream = ssh2_exec($this->_ssh2, $command); 
    $error_stream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR); 
    stream_set_blocking($stream, TRUE); 
    stream_set_blocking($error_stream, TRUE); 
    $output = stream_get_contents($stream); 
    $error_output = stream_get_contents($error_stream); 
    fclose($stream); 
    fclose($error_stream); 
    return array($output, $error_output); 
} 
Cuestiones relacionadas