如何使用 paramiko 正确配置和关闭 SSH 会话

How to correctly configure and close an SSH session with paramiko

我有一个 Onion Omega2 设备充当 linux 服务器,它具有来自 Arduino 芯片的 UART 流。通过笔记本电脑上的终端,我可以通过 SSH 连接并将来自 UART 的数据流式传输到设备中。然后我尝试使用 Paramiko 在 Python 中创建 SSH shell。代码如下:

import paramiko

def ssh_comm(ip, usr, passwd):
    client = paramiko.SSHClient();
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy());

    client.connect(ip, username=usr, password=passwd);
    channel = client.invoke_shell();

    channel.send("screen /dev/ttyS1 9600 \n");
    print("/n");
    points = 0;
    while points < 100:
        if channel.recv_ready():
            print(channel.recv(1024));
            points = points + 1;
    channel.shutdown(2);
    client.close();
    return;

ssh_comm("192.xxx.x.x", "root", "password");

第一次连接时连接良好,所有数据都流回我的笔记本电脑。然而,当我让 shell 关闭然后重新打开它时,我时不时地只收到一些从 Omega2 返回的数据包。 (虽然它仍然连接良好)通过 python 连接后,在终端上使用 ssh root@192.xxx.x.x 形成 SSH 连接时,传输也是间歇性的。

重新启动 Omega 2 解决了这个问题,但是因为我可以通过终端反复连接而没有任何问题,我相信问题一定与关闭 python 代码中的会话有关。或者没有正确配置它。查看了 paramiko 文档并尽力正确配置它后,我仍然遇到同样的问题。关于可能导致它的原因有什么想法吗?

我发现错误与SSH配置无关,而是在关闭频道之前没有关闭screen命令。这是通过发送 CTRL-A 然后 k 然后 y 来完成的。 channel.send("\x01"); channel.send("k"); channel.send("y");

\x01 代表 CTRL-A。没有这个 re-运行 程序会导致创建第二个屏幕,并且它们都在争夺 UART 流。解决方案参考: 并提供了第二种解决问题的方法。