重新建立的多跳SSH连接交互shell

问题描述 投票:0回答:1

我从哪里主机“A”我需要通过主机“B”和“C” ssh到主机“d”用例(我想能够解决应用到尽可能多的中间宿主越好):

A ==>乙==>ç==> d

一旦建立了连接到d,我想运行命令[“COMM1”,“COMM2”,“comm3”]的列表,并接收响应为[“输出1”,“输出2”,“输出3”],在主机A.我想出了是,一旦你到达主办d唯一的策略:

  1. 执行connection.invoke_shell()
  2. 在发送COMM1,轮询输出的通道,收集响应,并将其插入一个空列表
  3. 附近connection.invoke_shell创建的信道()
  4. 建立一个新的交互shell通道
  5. 重复步骤1至5 COMM2和comm3

当我开发的意识到,试图重新建立交互shell通道将导致引发EOFError。我有预感,在步骤3中关闭通道终止整个SSH会话从主机A到主机D.一路

它是,但是,势在必行,否则关闭通道,并开始一个新的交互shell为每一个命令,你会读出信道的全输出(包含所有3个命令的输出)作为文本的一个大块,你然后在使用屏幕抓取,这是不理想的处理。除了上面的算法?如果是的话怎么能与的paramiko实现它,为什么我得到EOFError异常?

我也试图实现这种使用面料。它曾与一些设备,但不是思科的。其原因是,Fabric使用的paramiko也未通过一些Cisco设备(直视client.exec_command)所支持的SSH远程命令执行功能。因此交互式会话是唯一的出路。

paramiko openssh ssh-tunnel
1个回答
0
投票

为简单起见,可以考虑无跳情况:

$ ssh -i key user@host 'echo command; echo control'
command
control
$ ssh -i key user@host 'echo command; echo control' >/dev/null
$ ssh -i key user@host 'echo command; echo 1>&2 control' >/dev/null
control

换句话说,我们有两个输出通道...

© www.soinside.com 2019 - 2024. All rights reserved.