在同一个shell中通过ssh2_exec执行多个CLI命令

时间:2017-09-08 12:57:54

标签: php ssh

我一直在尝试使用PHP的ssh2_exec命令在远程设备上执行两个或多个命令,但它似乎无法执行命令,等待响应和执行另一个。

我需要运行的第二个命令必须位于第一个命令的上下文中,因此必须在同一个shell中执行。我的意思是这样的

FWEFW # config system admin

此命令将带我进入" context"。结果将是:

FWEFW (admin) # 

从这里开始,我想运行第二个可以设置密码的命令或(管理员)的其他字段

FWEFW (admin) # set password 'abcde'

这是我迄今为止所做的尝试:

$stream = ssh2_exec($con, 'config system admin');
stream_set_blocking($stream, TRUE);
$output = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO);

// After this, what can I do to stay in the same shell and execute the second command after "config system admin"?

1 个答案:

答案 0 :(得分:0)

经过很多挫折后,我得出以下结论:

当您需要运行单个命令时,ssh2_exec命令很有用。就我而言,我需要在获得我需要的结果之前在同一个会话中运行多个命令。为了做到这一点,我就是这样做的:

创建交互式shell

$shell = ssh2_shell($connection, 'xterm', NULL, 400, 400, SSH2_TERM_UNIT_CHARS)

执行第一个命令

fwrite($shell, 'command 1' . PHP_EOL); // Don't forget PHP_EOL => /n

等待整个流

stream_set_blocking($shell, TRUE);

运行第二个命令

fwrite($shell, 'command 2' . PHP_EOL);

等等。我用四个命令测试了它,它运行得很好。

执行完所有命令后,您可以通过“访问shell”

来检索结果
$data = "";
$buf  = NULL;

while (! feof($shell))
{
    $buf = fread($shell, 4096);
    $data .= $buf;
}

fclose($shell);

您需要的数据现在存储在$ data变量中。 请注意,如果您的shell卡在提示符处(大多数情况下是这种情况),循环将永远运行,直到抛出超时错误。

为了解决这个问题,我必须运行'exit'命令才能退出shell。