2011-07-05 4 views
1

Я хотел бы иметь возможность управлять удаленным интерпретатором Python по SSH-соединению и управлять им с самого Python.Paramiko и «remote 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 обрабатывать свой выходной поток, почему мой код не работает с Это?

+0

первые ответы предоставляют очень интересные альтернативы 'paramiko', но мне было бы интересно понять, что здесь не так, если у кого есть ключ ... – Kevin

ответ

2

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

+0

Это не академическое упражнение; 'pushy' над SSH выглядит очень интересно, я попробую! – Kevin

+0

это именно то, что я искал, это много :) – Kevin

2

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

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

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

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

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

+0

это определенно удаленный контроль процессов, который я ищу, я буду попробуйте! – Kevin

+0

Я второй голос за Ткань. Это было очень полезно в производственной среде. –