Как правильно настроить и закрыть сессию S SH с помощью paramiko - PullRequest
0 голосов
/ 26 мая 2020

У меня есть устройство Onion Omega2, работающее как linux сервер, который имеет поток UART от чипа Arduino. Через терминал на моем ноутбуке я могу подключиться через S SH и передавать данные с UART, поступающие в устройство. Затем я попытался создать оболочку S SH в Python с помощью Paramiko. Код, показанный ниже:

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 передача также прерывистая при формировании соединения S SH на терминале с использованием: ssh root@192.xxx.x.x.

Перезапуск Omega 2 исправляет это, однако, поскольку я могу неоднократно подключаться через терминал без каких-либо проблем, я полагаю, проблема должна быть связана с закрытием сеанса в коде python. Или неправильно настроил. Просмотрев документы paramiko и изо всех сил стараясь настроить его правильно, я все еще получаю ту же проблему. Есть идеи относительно того, что могло быть причиной этого?

1 Ответ

0 голосов
/ 26 мая 2020

Я обнаружил, что ошибка связана не с конфигурацией S SH, а скорее с закрытием команды экрана перед закрытием канала. это было сделано путем отправки CTRL-A, затем k, затем y. channel.send("\x01"); channel.send("k"); channel.send("y");

\ x01 представляет CTRL-A. Без этого повторного запуска программа вызывает создание второго экрана, и они оба борются за поток UART. Решение было найдено со ссылкой на: Python Paramiko отправляет CTRL + C в оболочку s sh и предоставляет второй метод решения проблемы.

...