2017-02-16 133 views
0

我想建立一个ssh脚本在主机上运行多个命令。我的目标是获得每个命令的输出。我的目标主机是一个思科路由器,并为以下脚本执行更多的命令我需要运行它为我要执行每个命令这不是一个非常优雅的解决方案。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连接。

我想实现的是执行几个命令并获取输出在同一个流(如果posible)。

我在编辑帖子以回答@Melvin Koopmans和@LSerni所提出的要求。

如果我改变代码作为sugested(这是someting我也试过)第二个命令返回一个错误。这里是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);} 

输出从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 

我只得到第一个命令 “SH运行INT TE 1/1” 输出。

+0

莫非你不会用“&&”撞击数组,以便它自动执行一个接一个的所有命令? –

回答

0

您正在重复连接阶段。从事实,我忘了

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 

...当然,除了:试试这个:

$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)上,和它的作品该机器上打开控制台登录:-(

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[$cmd] = stream_get_contents($stream_out); 

然后,例如,拨打:$output['ls']