2017-02-16 5 views
0

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

$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 (это было что-то, что я также пробовал раньше), вторая команда возвращает ошибку. вот выход кли: сценарий изменился:

$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 

Я только получаю выход из первой команды «ш запустить ИНТ тэ 1/1».

+0

Могли вы не будете разрушать массив с помощью «&&», чтобы он автоматически выполнял все команды один за другим? –

ответ

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.

Теперь вы можете перебирает $ выхода, или вы можете выбрать, чтобы дать выводит ключ Yoru команд, так что вы можете получить доступ к нему:

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

И потом, к примеру, звоните: $output['ls']

Смежные вопросы