2

我正在使用 Paramiko 连接到远程 Cisco 路由器和交换机。连接到这些设备时,我希望能够在进入“配置”模式时关闭回声。这样,我可以向远程系统发出命令并避免看到它们返回(从而只专注于查找错误消息)。

我正在执行以下命令来获取 Cisco 设备的 shell:

    self.chan = self.transport.open_session()
    self.chan.get_pty()
    self.chan.invoke_shell()

现在,我希望能够为 pty 获取 paramiko 的文件描述符并发出如下内容:

    fd = self.chan.fileno()
    old = termios.tcgetattr(fd)
    old[3] = old[3] | termios.ECHO
    termios.tcsetattr(fd, termios.TCSADRAIN, old)

但是,termios阻塞了 chan.fileno() 返回的文件描述符。

我见过的大多数关闭回声的建议都需要在远程机器上发出 bash 命令,例如“stty -echo”,但 Cisco 路由器没有运行 bash。

4

1 回答 1

1

在花了很多时间之后,我最终回到了pxssh库。这个库明确有一种关闭回声的方法:

    connection.setecho(False)

...这正是我所需要的。它还(通过父模块pexpect)有一种方法可以使用完全相同的库基础设施来处理 telnet(不幸的是,这在 Cisco 世界中仍然经常需要),因此您可以拥有一个使用 telnet 或 ssh 的连接对象以完全相同的方式工作。

虽然 Paramiko 看起来像一个更干净、维护得更好的库,但 Paramiko 社区的共识似乎是,如果你想停止回显,你需要告诉远程系统不要回显。但是当远程系统不是 linux/bash 进程时,这变得困难或不可能。Pxssh 是您对 ssh 会话进行更细粒度控制所需的库。

于 2013-04-17T17:01:23.973 回答