PHP múltiples comandos SSH

Estoy intentando construir un script ssh para ejecutar múltiples comandos en un host. Mi objective es obtener la salida de cada comando. Mi servidor de destino es un enrutador Cisco y para que la siguiente secuencia de comandos ejecute más de un comando, necesito ejecutarlo para cada comando que deseo ejecutar, lo cual no es una solución muy elegante.

$cmd = array ('sh run int te 1/1', 'sh run int te 1/2'); for ($i = 0; $i <= 1; $i++) { $connection = ssh2_connect('10.1.1.1', 22); ssh2_auth_password($connection, 'user', 'pass'); $stream = ssh2_exec($connection, $cmd[$i]); stream_set_blocking($stream, true); $stream_out = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO); echo stream_get_contents($stream_out); } 

Creé un bucle porque no pude obtener la salida para cada comando en la misma transmisión. Como supongo que php está terminando las conexiones ssh al final de cada flujo.

Lo que me gustaría lograr es ejecutar varios comandos y obtener la salida en la misma secuencia (si es posible).

Estoy editando la publicación para responder a las sugerencias hechas por @Melvin Koopmans y @LSerni.

si cambio el código como sugerido (esto fue algo que también intenté antes) el segundo comando devuelve un error. aquí está la salida cli: el guión cambió:

 $cmds = array ('sh run int te 1/1', 'sh run int te 1/2'); $connection = ssh2_connect('10.1.1.1', 22); ssh2_auth_password($connection, 'user', 'pass'); foreach ($cmds as $cmd) { $stream = ssh2_exec( $connection, $cmd ); stream_set_blocking( $stream, true ); $stream_out = ssh2_fetch_stream( $stream, SSH2_STREAM_STDIO ); echo stream_get_contents($stream_out);} 

la salida de cli

 interface TenGigabitEthernet1/1 description trunk switchport trunk allowed vlan 1,2,3,4,5,6,10 switchport mode trunk auto qos trust storm-control broadcast include multicast storm-control broadcast level 1.00 spanning-tree guard loop service-policy input AutoQos-4.0-Input-Policy service-policy output AutoQos-4.0-Output-Policy ip dhcp snooping trust end PHP Warning: ssh2_exec(): Unable to request a channel from remote host in C:\Users\SMS\Downloads\php_scripts\ssh.php on line 13 PHP Warning: stream_set_blocking() expects parameter 1 to be resource, boolean given in C:\Users\SMS\Downloads\php_scripts\ssh.php on line 14 PHP Warning: ssh2_fetch_stream() expects parameter 1 to be resource, boolean given in C:\Users\SMS\Downloads\php_scripts\ssh.php on line 15 PHP Warning: stream_get_contents() expects parameter 1 to be resource, null given in C:\Users\SMS\Downloads\php_scripts\ssh.php on line 16 

Solo obtengo la salida del primer comando “sh run int te 1/1”.

Estás repitiendo la etapa de conexión. Pruebe esto en su lugar:

 $cmds = array ('sh run int te 1/1', 'sh run int te 1/2'); $connection = ssh2_connect('10.1.1.1', 22); ssh2_auth_password($connection, 'user', 'pass'); foreach ($cmds as $cmd) { $stream = ssh2_exec($connection, $cmd); stream_set_blocking($stream, true); $stream_out = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO); echo stream_get_contents($stream_out); } 

Probé ahora en una máquina Ubuntu (14.04-LTS) y funciona:

 I say 'who', answer was: lserni :0 Jan 21 11:25 (console) I say 'date', answer was: Thu Feb 16 09:55:52 CET 2017 

… bueno, aparte del hecho de que olvidé un inicio de sesión de consola abierta en esa máquina 🙁

No recomendaría iniciar una nueva conexión en cada ciclo, en su lugar establezca primero la conexión, luego realice un ciclo sobre una matriz de comandos y envíe la salida a una matriz. Al igual que:

 $cmds = [ 'ls', 'ps ux' ]; $connection = ssh2_connect( '127.0.0.1', 22 ); ssh2_auth_password( $connection, 'username', 'password' ); $output = []; foreach ($cmds as $cmd) { $stream = ssh2_exec( $connection, $cmd ); stream_set_blocking( $stream, true ); $stream_out = ssh2_fetch_stream( $stream, SSH2_STREAM_STDIO ); $output[] = stream_get_contents($stream_out); } 

Esto impulsará toda la salida a la matriz $output .

Ahora puede recorrer más de $ salida, o puede elegir dar la salida de la clave del comando yoru para que pueda acceder a ella:

 $output[$cmd] = stream_get_contents($stream_out); 

Y luego, por ejemplo, call: $output['ls']