PHP SSH несколько команд

Я пытаюсь создать сценарий SSH для запуска нескольких команд на хосте. Моя цель — получить вывод каждой команды. Моим целевым хостом является маршрутизатор Cisco, и для следующего скрипта для выполнения более одной команды мне нужно выполнить ее для каждой команды, которую я хочу выполнить, что не очень элегантное решение.

$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); }

Я создал цикл, потому что мне не удалось получить выходные данные для каждой команды в одном потоке. Так как я предполагаю, что php завершает ssh-соединения в конце каждого потока.

Чего я хотел бы добиться, так это выполнить несколько команд и получить выходные данные в одном потоке (если это возможно).

Я редактирую пост, чтобы ответить на предложения, сделанные @Melvin Koopmans и @LSerni.

если я изменяю код как sugested (это было что-то, что я тоже пробовал раньше), вторая команда возвращает ошибку. Вот результат Cli:
скрипт изменился:

$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);}

выход из кли

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

Я получаю вывод только из первой команды «sh run int te 1/1».

0

Решение

Вы повторяете этап подключения. Попробуйте это вместо этого:

$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);
}

Я тестировал сейчас на машине с Ubuntu (14.04-LTS), и она работает:

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

…ну, кроме того, что я забыл открыть консольную учетную запись на этой машине 🙁

0

Другие решения

Я не рекомендовал бы инициировать новое соединение в каждом цикле, вместо этого сначала установите соединение, затем выполните цикл по массиву команд и перенесите вывод в массив. Вот так:

$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);
}

Это подтолкнет весь вывод в массив $output,

Теперь вы можете зацикливаться на $ output, или вы можете дать выходу ключ команды yoru, чтобы вы могли получить к нему доступ:

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

А потом, например, позвоните: $output['ls']

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector