Парамико и "удаленный питон" - PullRequest
1 голос
/ 05 июля 2011

Я хотел бы иметь возможность управлять удаленным интерпретатором Python через соединение SSH и управлять им из самого Python.

У меня есть базовый шаблон:

ssh.connect(servername, serverport, username,  key_filename=key_filename)

transport = ssh.get_transport()
channel = transport.open_session()

channel.exec_command(PATH_TO_EXEC)

while True:
    r, w, e = select.select([channel], [], [], 1)
    if channel in r:
        try:
            if channel.recv_ready():
                x = channel.recv(64)
            elif channel.recv_stderr_ready():
                x = channel.recv_stderr(64)
            else:
                continue

            if len(x) == 0:
                print '\r\n*** EOF\r\n',
                break
            sys.stdout.write(x)
            sys.stdout.flush()
        except socket.timeout:
            pass

который позволяет мне общаться с удаленным приложением с pdb: channel.set("command\n").

. Он отлично работает с bash, с gdb, но я ничего не могу сделать, чтобы получить выходной поток изpython (v2)

Как Python обрабатывает свой поток вывода, почему мой код не работает с ним?

Ответы [ 2 ]

2 голосов
/ 05 июля 2011

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

2 голосов
/ 05 июля 2011

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

Если вы хотите контролировать выполнение скриптовна удаленных машинах через python вы можете попробовать Fabric .С их сайта:

Fabric - это библиотека Python (2.5 или выше) и инструмент командной строки для оптимизации использования SSH для развертывания приложений или задач системного администрирования.Он предоставляет базовый набор операций для выполнения локальных или удаленных команд оболочки (обычно или через sudo) и загрузки / выгрузки файлов, а также вспомогательные функции, такие как запрос работающего пользователя для ввода или прерывание выполнения.

Если вы хотите управлять удаленными процессами и интегрировать их вывод в поток вашей основной программы, вы можете использовать многопроцессорный модуль .От PEP 371 :

Пакет также предоставляет функции сервера и клиента (processing.Manager) для обеспечения удаленного совместного использования и управления объектами и задачами, так что приложения могут не только использовать несколькоядра на локальной машине, но также распределяет объекты и задачи по кластеру сетевых машин.

...