ssh2_connect ssh2 instalar exist doesn app php ssh

instalar - php ssh2 manual



incapaz de llamar callbacks ssh2_connect() (4)

Estoy usando el método ssh2_connect() para establecer una conexión con un servidor remoto. Se está estableciendo una conexión correctamente si proporciono el nombre de host y el número de puerto correctos. Cuando no puedo conectar debido a credenciales incorrectas , intento llamar a una función de devolución de llamada, pero la forma en que lo intento no es llamar a la devolución de llamada después de una falla de conexión.

Este es el código que probé:

$callbacks = array( ''ignore'' => array($this, ''callbackSshDisconnect''), ''debug'' => array($this, ''callbackSshDisconnect''), ''macerror'' => array($this, ''callbackSshDisconnect''), ''disconnect'' => array($this, ''callbackSshDisconnect''), ); ssh2_connect($hostName,$port,array(''hostkey'', ''ssh-rsa''),$callbacks); public function callbackSshDisconnect($reason, $message, $language) { $this->log(''disconnected''); $this->log($reason);die; }

¿Que estoy haciendo mal?


Cuando no puede conectarse debido a credenciales incorrectas, entonces no obtendrá devoluciones de llamadas de todos modos, ssh2_connect () simplemente devuelve false en este caso.

Si realmente quiere captar el motivo de la falla, puede usar el controlador de búfer de salida para extraer el mensaje de error (asumiendo que tiene activado el informe de errores):

set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) { list($command,$errormessage)=explode(":",$errstr,2); echo "Error ($errno):", $errormessage."<br><br>"; }); $connection = ssh2_connect($hostName,$port); restore_error_handler();


Cuando ssh2_connect falla debido a un host, puerto, etc. incorrecto, no llama a ninguna devolución de llamada.

Lo que hace, en cambio, es devolver falso

La documentación de PHP dice:
Devuelve un recurso en caso de éxito o FALSE en caso de error.

$result = ssh2_connect($hostName,$port,array(''hostkey'' => ''ssh-rsa''),$callbacks); if ($result === false) exit("ssh2_connect failed");

Además, leyendo el documento, su

array(''hostkey'', ''ssh-rsa'')

debiera ser

array(''hostkey'' => ''ssh-rsa'')


Incluso si usa código de trabajo , como este:

$callbacks = array( ''ignore'' => ''callback'', ''debug'' => ''callback'', ''macerror'' => ''callback'', ''disconnect'' =>''callback'', ); $session = ssh2_connect($hostName, $port, array(''hostkey'' => ''ssh-rsa''), $callbacks); if($session === false) { print(''Connection failed'' . PHP_EOL); exit(1); } if(!ssh2_auth_pubkey_file( $session, "user", ''/home/user/.ssh/id_rsa.pub'', ''/home/user/.ssh/id_rsa'' )) { print(''Failed to authenticate session'' . PHP_EOL); exit(2); } // Check this great answer: // http://.com/a/12094837/171318 $stream = ssh2_exec($session, "ls -al"); stream_set_blocking($stream, true); $stream = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO); echo stream_get_contents($stream); function callback($reason, $message, $language) { print("callback:" . PHP_EOL); print(" " . $message . PHP_EOL); print(" " . $reason . PHP_EOL); }

las devoluciones de llamada no se llamarán en una aplicación habitual. Esto se debe a que fueron llamados solo bajo ciertas circunstancias nombradas en la página de manual

La devolución de llamada de disconnect por ejemplo, solo se llama si se SSH2_MSG_DISCONNECT un paquete SSH2_MSG_DISCONNECT . Tal paquete no se recibe a menos que el servidor cierre la conexión, lo que normalmente no sucederá.


No hay nada que estés haciendo mal aparte del error tipográfico: array(''hostkey'', ''ssh-rsa'') debería ser array(''hostkey'' => ''ssh-rsa'') . La función ssh_connect() simplemente devuelve falso para una falla de conexión; las devoluciones de llamada simplemente no se inician aún cuando se usan las credenciales incorrectas.

Hay soluciones (por ejemplo, como sugiere rubo77 a continuación) pero la que considero que le dará más control y le permitirá hacer lo que quiera (por ejemplo, el seguimiento de errores de MAC), es usar la biblioteca phpseclib ( http://phpseclib.sourceforge.net/ssh/intro.html ) para conexiones y control ssh. Da un control muy fino de los comandos, y también incluye el registro.

No es la solución más simple, pero puedes controlarlo tan bien como si estuvieras en el teclado / terminal directamente.

Usted tiene control sobre los tiempos de espera y puede usar la devolución de llamada en los comandos. Pero si desea un mejor control, use read() y write() y puede supervisar si hay desconexiones u otros problemas. Compruebe la documentación al iniciar sesión con phpseclib : puede iniciar sesión y analizar el registro, o llamar a getLastError() .

Los archivos de registro mostrarán ''Connection closed by server'' en las desconexiones, por ejemplo, pero también le dirán si está utilizando un modo de autenticación no compatible al iniciar sesión, etc.

O para obtener más información, lea el código: aquí, por ejemplo, están las razones de desconexión:

$this->disconnect_reasons = array( 1 => ''NET_SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT'', 2 => ''NET_SSH2_DISCONNECT_PROTOCOL_ERROR'', 3 => ''NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED'', 4 => ''NET_SSH2_DISCONNECT_RESERVED'', 5 => ''NET_SSH2_DISCONNECT_MAC_ERROR'', 6 => ''NET_SSH2_DISCONNECT_COMPRESSION_ERROR'', 7 => ''NET_SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE'', 8 => ''NET_SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED'', 9 => ''NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE'', 10 => ''NET_SSH2_DISCONNECT_CONNECTION_LOST'', 11 => ''NET_SSH2_DISCONNECT_BY_APPLICATION'', 12 => ''NET_SSH2_DISCONNECT_TOO_MANY_CONNECTIONS'', 13 => ''NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER'', 14 => ''NET_SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE'', 15 => ''NET_SSH2_DISCONNECT_ILLEGAL_USER_NAME'' );