我正在尝试构建一个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;。
答案 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']