PHP SSH多个命令

时间:2017-02-16 08:40:18

标签: php ssh

我正在尝试构建一个ssh脚本来在主机上运行多个命令。我的目标是获得每个命令的输出。我的目标主机是一个cisco路由器,并且对于以下脚本来执行更多那个命令,我需要为我想要执行的每个命令运行它,这不是一个非常优雅的解决方案。

Manifest

我创建了一个循环,因为我无法在同一个流中获取每个命令的输出。因为我猜php正在终止每个流末尾的ssh连接。

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

我正在编辑帖子以回答@Melvin Koopmans和@LSerni所做的消息。

如果我将代码更改为sugested(这是我以前也尝试过的),第二个命令会返回错误。这是cli输出: 脚本改变了:

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

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

我只收到第一个命令的输出&#34; sh run int te 1/1&#34;。

2 个答案:

答案 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

......好吧,除了忘记在那台机器上打开控制台登录这一事实: - (

答案 1 :(得分: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']