【问题标题】:How to correctly configure and close an SSH session with paramiko如何使用 paramiko 正确配置和关闭 SSH 会话
【发布时间】:2020-09-12 17:12:39
【问题描述】:

我有一个 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");

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

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

【问题讨论】:

    标签: python ssh paramiko


    【解决方案1】:

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

    \x01 代表 CTRL-A。如果不重新运行程序,则会创建第二个屏幕,并且它们都会争夺 UART 流。参考:Python Paramiko send CTRL+C to an ssh shell找到了解决方案,并提供了解决问题的第二种方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-29
      • 2021-12-12
      • 2013-05-11
      • 2011-07-21
      • 2019-10-27
      • 2020-08-16
      • 1970-01-01
      • 2010-12-27
      相关资源
      最近更新 更多