2013-06-21 4 views
1

Я не программист, но хотел бы использовать Python для автоматизации некоторых административных целей. Первое приложение после «Hello world», которое я пытался создать, - это интерактивный ssh-клиент. Я прочитал некоторую документацию и статьи и решил, что это будет самый простой способ использовать модуль paramiko, но, к сожалению, у меня возникла проблема: Мои приложения запрашивают у вас некоторую необходимую информацию, такую ​​как ip-адрес сервера, имя пользователя, пароль. После этого он устанавливает соединение с определенным сервером и предоставляет вам cli на вашем экране. Для эмуляции процесса ввода команды я использую цикл while. К сожалению, мое приложение работает только с первой введенной вами командой. При попытке ввода второй команды появляется ошибка:Python interactive ssh client using paramiko

Traceback (most recent call last): 
    File "C:\Python27\Tests\ssh_client.py", line 53, in <module> 
    client.execute_command(command) 
    File "C:\Python27\Tests\ssh_client.py", line 26, in execute_command 
    stdin,stdout,stderr = self.connection.exec_command(command) 
    File "C:\Python27\lib\site-packages\paramiko\client.py", line 343, in exec_command 
    chan.exec_command(command) 
AttributeError: 'NoneType' object has no attribute 'exec_command' 

код в программе (Windows 7):

import paramiko 

SERVER = raw_input('Please enter an ip address of remote host: ') 
USER = raw_input('Please enter your username: ') 
PASSWORD = raw_input('Please enter your password: ') 

class MYSSHClient(): 

    def __init__(self, server=SERVER, username=USER, password=PASSWORD): 
     self.server = server 
     self.username = username 
     self.password = password 
     self.connection = None 
     self.result = '' 
     self.is_error = False 


    def do_connect(self): 
     self.connection = paramiko.SSHClient() 
     self.connection.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
     self.connection.connect(self.server, username=self.username, password=self.password) 

    def execute_command(self, command): 
     if command: 
      print command    
      stdin,stdout,stderr = self.connection.exec_command(command) 
      stdin.close() 
      error = str(stderr.read()) 
      if error: 
       self.is_error = True 
       self.result = error 
       print 'error' 
      else: 
       self.is_error = False 
       self.result = str(stdout.read()) 
       print 'no error' 

      print self.result 


     else: 
      print "no command was entered" 

    def do_close(self): 
     self.connection.close() 

if __name__ == '__main__': 
    client = MYSSHClient() 
    client.do_connect() 
    while 1: 
     command = raw_input('cli: ') 
     if command == 'q': break 
     client.execute_command(command) 
    client.do_close() 

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

Я был бы очень признателен, если бы кто-нибудь мог сказать мне, что я делаю неправильно, или дать мне ссылку на аналогичную проблему, где я могу найти решение.

Заранее благодарим за любую помощь.

ответ

0

К сожалению, я не нашел способ решить мою проблему с помощью модуля paramiko, но я нашел такой модуль, как Exscript. Простой код приведен ниже:

from Exscript.util.interact import read_login 
from Exscript.protocols import SSH2 


account = read_login() 
conn = SSH2()      
conn.connect('192.168.1.1')  
conn.login(account) 


while True: 
    command = raw_input('cli: ') 
    if command == 'q': break 
    conn.execute(command) 
    print conn.response 



conn.send('quit\r')    
conn.close() 
0

Пожалуйста, используйте для модуля pxssh это очень полезно для вашего приложения, если работа для окон Python: How can remote from my local pc to remoteA to remoteb to remote c using Paramiko этот пример очень полезно для вас Python - Pxssh - Getting an password refused error when trying to login to a remote server

я думаю, что у проверить ваши настройки сервера в удаленной машине хозяина

+0

Как я понимаю, pexpect работает только для операционных систем на базе UNIX. В любом случае я попытался установить его и при создании import pxssh увидеть ошибку. Критический модуль не найден. Вероятно, эта операционная система не поддерживает . Pexpect предназначен для UNIX-подобных операционных систем. – HFFreeway

0

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

Я бы порекомендовал вам взглянуть на ткань, которая делает именно то, что вы хотите: автоматизировать задачи на локальных или удаленных хостах. Может быть немного проще, поскольку вам не нужно реализовывать логику подключения и выполнения команд.

Ткань документация: http://docs.fabfile.org/en/1.6/

+0

Если это действительно парамико не поддерживает несколько команд? – HFFreeway

+0

Как вы можете видеть в учебнике, ткань поддерживает несколько способов (локальный, run, sudo, execute ...) для запуска нескольких команд в файле. – malte

+0

Учебное пособие: http://docs.fabfile.org/en/1.6/tutorial.html – malte