Создание простого интерфейса командной строки (CLI) с использованием сервера Python (TCP Sock) и нескольких сценариев - PullRequest
0 голосов
/ 29 апреля 2010

У меня есть блок Linux, и я хочу иметь возможность подключиться к нему через telnet (порт 77557) и выполнить несколько необходимых команд без необходимости доступа ко всему блоку Linux. Итак, у меня есть сервер, который прослушивает этот порт и выводит введенную команду на экран. (пока)

Telnet 192.168.1.100 77557<br /> Trying 192.168.1.100...<br /> Connected to 192.168.1.100.<br /> Escape character is '^]'.<br /></p> <pre><code>hello<br /> You typed: "hello"<br />

ТЕПЕРЬ:

Я хочу создать много команд, каждая из которых принимает несколько аргументов и имеет коды ошибок. Кто-нибудь делал это раньше? Было бы здорово, если бы я мог при инициализации сервера проходить через каждый каталог и выполните файл init .py и, в свою очередь, файл init .py каждого вызова команды в основной шаблон lib API (например, RegisterMe ()) и зарегистрируйтесь на сервере в качестве функции обратного вызова. По крайней мере, так я бы сделал это на C / C ++.

Но я хочу лучший Pythonic способ сделать это.

/ cmd /
/ cmd / myreboot /
/cmd/myreboot/ini.py (примечание подчеркивание не показывают по какой-то причине)
/ cmd / mylist /
/cmd/mylist/init.py
... и т. д.

IN: /cmd/myreboot/__ini__.py:
из myMainCommand импортировать RegisterMe
RegisterMe (name = "reboot", args = Arglist, использовании = "Используйте это для перезагрузки окна", desc = "blabla")

Итак, повторяя это, вы создаете список команд, и когда вы вводите команду в сеансе telnet, сервер просматривает список, сопоставляет команду и передает аргументы этой команде, и команда выполняет работу и печатает команду. успех или неудача в stdout.

Thx

Ответы [ 2 ]

0 голосов
/ 30 апреля 2010

Я бы создал это приложение, используя комбинацию модулей cmd2 и RPyC .

0 голосов
/ 29 апреля 2010

Веб-сервер Twisted делает что-то вроде того, что вы хотите сделать. Общий подход заключается в том, чтобы загружаемый файл Python определял объект с конкретным именем в глобальном пространстве имен загруженного модуля. После загрузки модуля сервер проверяет наличие этого объекта, проверяет, что он наследуется от правильного типа (и, следовательно, имеет необходимый интерфейс), а затем использует его для обработки запрошенного URL-адреса. В вашем случае, тот же подход, вероятно, будет работать очень хорошо.

Увидев имя команды, импортируйте модуль на лету (ознакомьтесь с документацией встроенной функции импорта, чтобы узнать, как это сделать), найдите экземпляр «команды», а затем используйте его для анализа списка аргументов, выполнить обработку и вернуть код результата.

Вероятно, не потребуется особой предварительной обработки каталога при запуске, хотя вы, безусловно, могли бы сделать это, если бы предпочли загрузку на лету.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...