Я не программист, но хотел бы использовать 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. Я пытался найти информацию в Интернете, но, к сожалению, не нашел решения.
Я был бы очень признателен, если бы кто-нибудь мог сказать мне, что я делаю неправильно, или дать мне ссылку на аналогичную проблему, где я могу найти решение.
Заранее благодарим за любую помощь.
Как я понимаю, pexpect работает только для операционных систем на базе UNIX. В любом случае я попытался установить его и при создании import pxssh увидеть ошибку. Критический модуль не найден. Вероятно, эта операционная система не поддерживает . Pexpect предназначен для UNIX-подобных операционных систем. – HFFreeway