Как выполнять команды на удаленном сервере с помощью Python?

Этот вопрос связан с другим: Как использовать сокеты для отправки пользователя и пароля на панель разработчика с помощью ssh

Я хочу подключиться к devboard, чтобы выполнить скрипт. Все выходные данные этого скрипта я хочу отправить на машину Elasticsearch.

Я могу подключиться к devboard (см. ИЗОБРАЖЕНИЕ ниже), используя свой ноутбук, на котором установлен Elasticsearch. Но когда я хочу отправить данные на доску разработки, скрипт ничего не показывает. Что я делаю:

  • Как только вы найдете mendel @ undefined-eft: ~ $, отправьте команду: cd coral / tflite / python / examples / classification / Auto_benchmark \ n

Что я делаю неправильно?

import paramiko
import os

#Server's data
IP = '172.16.2.47'
PORT = 22
USER = 'mendel'
PASSWORD = 'mendel'


ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname = IP, port=PORT, username = USER, password = PASSWORD)

channel = ssh.invoke_shell() #to get a dedicated channel

channel_data = str()
host = str()

while True:
    if channel.recv_ready(): #is there data to be read?
       channel_data += channel.recv(9999).decode("utf-8")
       os.system('clear')
       print(channel_data)

#ONLY WORKS UNTIL HERE!!!

    else:
        continue

    if channel_data.endswith('mendel@undefined-eft:~$'):
        channel.send('cd coral/tflite/python/examples/classification/Auto_benchmark\n')
        channel_data += channel.recv(9999).decode("utf-8")
        print(channel_data)

ИЗОБРАЖЕНИЕ

введите здесь описание изображения

РЕДАКТИРОВАТЬ

channel = ssh.invoke_shell() #to get a dedicated channel

channel_data = str()
host = str()

while True:
    if channel.recv_ready(): #is there data to be read?
       channel_data += channel.recv(9999).decode("utf-8")
       os.system('clear')
       print(channel_data)

    else:
        continue

    if channel_data.endswith('mendel@undefined-eft:~$ '):#it is good to send commands
       channel.send('cd coral/tflite/python/examples/classification/Auto_benchmark\n')
       #channel_data += channel.recv(9999).decode("utf-8")
       #print(channel_data)
    elif channel_data.endswith('mendel@undefined-eft:~/coral/tflite/python/examples/classification/Auto_benchmark$ '):
         channel.send('ls -l\n') #python3 auto_benchmark.py')
         channel_data += channel.recv(9999).decode("utf-8")
         print(channel_data)

введите здесь описание изображения


person Aizzaac    schedule 16.06.2020    source источник
comment
@Nam Vu Можно ли использовать json в этом скрипте? как вы это делали в своем C ++ для отправки изображений?   -  person Aizzaac    schedule 17.06.2020


Ответы (1)


Я думаю, тебе нужно изменить

if channel_data.endswith('mendel@undefined-eft:~$'):

to

if channel_data.endswith('mendel@undefined-eft:~$ '):

согласно вашей подсказке. Обратите внимание на пробел после :~$

person JGK    schedule 17.06.2020
comment
Проклятие! Ты прав! как ты это заметил? У меня другая проблема ... когда я выполняю 'ls -l', он никогда не прекращает выполнение. Вы знаете, как я могу улучшить свой код? Я выложу это. - person Aizzaac; 17.06.2020
comment
Это правда, потому что оператор elif channel_data.endswith('mendel@undefined-eft:~/coral/tflite/python/examples/classification/Auto_benchmark$ '): в цикле while True: соответствует на каждой итерации. Было бы проще, если бы вы прояснили свою проблему, то есть что вы хотите делать в сеансе ssh. - person JGK; 17.06.2020
comment
Что ж, я хочу отправить данные с панели разработчика на сервер (ELasticsearch). На панели разработки у меня есть скрипт, который выполняет классификацию изображений (я хочу отправить эти данные на сервер Elasticsearch). Но код, который я опубликовал, находится вне платы разработчика (он находится в моем ноутбуке). Итак, я хочу подключиться к панели разработки и выполнить скрипт. Есть другой способ сделать это? - person Aizzaac; 17.06.2020
comment
Почему бы вам не попробовать что-то вроде stackoverflow.com/questions/19900754/ Это намного проще. - person JGK; 18.06.2020