SSH и exec каналы с оболочкой python

Мы реализовали оболочку python для наших аппаратных устройств, которая состоит исключительно из модуля python cmd во встроенном linux. Оболочка нашего (не-root) пользователя имеет путь к этой оболочке python в / etc / passwd и / etc / shadow. Пример кода ниже:

#!/usr/bin/env python

import cmd

class OurCmdProcessor(cmd.Cmd, object):

def __init__(self):
    cmd.Cmd.__init__(self)

    ...

def cmdloop(self, intro = None):
    """Command loop.
       Overrides cmd class cmdloop() method.
    """
    signal.signal(signal.SIGINT, self._sigint_handler)
    try:
        cmd.Cmd.cmdloop(self, intro = intro)
    except:
        print("{} v2 exception!".format(branding))
        #traceback.print_exc(file=sys.stdout)
        sys.stdout.flush()

        # This *exits* the cmd shell on exception
        self.do_EOF()

def do_help(self):
        print("Here is some help text!")

etc...

Ранее один из наших клиентов использовал SSH.NET для выдачи команд командной строки с помощью функции RunCommand этой библиотеки, которая устанавливает стандартный запрос exec SSH для прохождения через соединение SSH, а затем анализирует выходное и возвращаемое значение. (т.е. запрос канала, успешное завершение канала, команда отправки и т. д.

Теперь этот вызов не работает, вероятно, потому что мы перешли с / bin / sh на эту оболочку python. Что работает, так это использование объекта SSH Shell этой библиотеки для отправки команд, помещая текст команды, за которым следует новая строка, а затем сканируя вывод.

Я спрашиваю: возможно ли реализовать что-то в этой оболочке для обработки стандартной команды SSH 'exec', которую выдает эта библиотека, или выполняет часть вывода оболочки, полученного после выполнения команды ПОСЛЕ отправки запроса оболочки SSH включить значение выхода уже? Мы не хотим включать значения выхода как часть вывода команды для печати.

Мы используем DropHear SSH-сервер на нашем встроенном устройстве Linux.

1 ответ

Решение

Для работы в этом режиме ваш скрипт Python должен иметь возможность анализировать аргументы командной строки так же, как он анализирует аргументы, переданные в интерактивном режиме вашему Cmd пример.

То есть:

./yourpython -c "some command"

должен работать идентично:

./yourpython <<EOF
some command
EOF

... и должен иметь статус выхода, который отражает успешность последней команды, которая должна быть выполнена.


Это эквивалентно тому, как ssh hostname 'some command' работает "${SHELL:-sh}" -c 'some command' на удаленном хосте.

Другие вопросы по тегам