Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 20, 2012 12:44:31

shadowonline
Зарегистрирован: 2012-08-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

paramiko.Transport

Помогите разобраться, что не так в примере.
Нашёл пример (http://www.minvolai.com/blog/2009/09/how-to-ssh-in-python-using-paramiko/) работы с транспортным объектом из paramiko:

import paramiko
hostname, port, username, password = ('host', 22, ‘user’, ‘pw’)
paramiko.util.log_to_file('trans.log')
nbytes = 100
trans = paramiko.Transport((hostname, int(port)))
trans.connect(username = username, password = password)
session = trans.open_channel('session')
#Once the channel is established, we can execute only one command. To execute another command, we need to create another channel
session.exec_command('sh run')
exit_status = session.recv_exit_status()

stdout_data =
stderr_data =

while session.recv_ready():
stdout_data.append(session.recv(nbytes))
stdout_data = “”.join(stdout_data)

while session.recv_stderr_ready():
stderr_data.append(session.recv_stderr(nbytes))
stderr_data = “”.join(stderr_data)

print (“exit status ”, exit_status)
print (“output”)
print (stdout_data)
print (“error”)
print (stderr_data)

При исполнении вылетает ошибка (не пойму чего ему не хватает):

Traceback (most recent call last):
File “D:\Install\Python\Project\ASAClient\ASAClient.py”, line 124, in <module>
session = trans.open_channel('session')
File “C:\Python32\lib\site-packages\paramiko\transport.py”, line 718, in open_channel
assert(isinstance(kind,bytes))
AssertionError

Офлайн

#2 Авг. 20, 2012 14:23:32

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

paramiko.Transport

Надо пользоваться тегом code.

Офлайн

#3 Авг. 20, 2012 15:45:03

shadowonline
Зарегистрирован: 2012-08-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

paramiko.Transport

odnochlen
Надо пользоваться тегом code.

Извиняюсь за свою непонятливость, в каком именно месте нужно его использовать?
Можно пример кода?

Офлайн

#4 Авг. 20, 2012 21:18:35

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

paramiko.Transport

Вы копируете пример для второго питона и запускаете на третьем. Перед использованием библиотеки принято смотреть, поддерживает ли она вашу версию языка.



Офлайн

#5 Авг. 21, 2012 02:57:22

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

paramiko.Transport

shadowonline
в каком именно месте нужно его использовать?
В окне редактирования поста есть кнопочка.

Офлайн

#6 Авг. 21, 2012 08:15:43

shadowonline
Зарегистрирован: 2012-08-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

paramiko.Transport

odnochlen
shadowonline
в каком именно месте нужно его использовать?
В окне редактирования поста есть кнопочка.

А это, понял )))

Офлайн

#7 Авг. 21, 2012 08:28:18

shadowonline
Зарегистрирован: 2012-08-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

paramiko.Transport

fata1ex
Вы копируете пример для второго питона и запускаете на третьем. Перед использованием библиотеки принято смотреть, поддерживает ли она вашу версию языка.

Ну вообще он у меня без проблем подключается по SSH и работает по следующему примеру:

import paramiko
hostname, port, username, password = ('host', 22, 'user', 'pw')
# setup logging
paramiko.util.log_to_file('demo_ssh.log')
ssh = paramiko.SSHClient()
#ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname = hostname, port = port, username = username, password = password)
#Авторизация
stdin, stdout, stderr = ssh.exec_command(b"en")
stdin.write(password)
stdin.flush()
stdin, stdout, stderr = ssh.exec_command(b"show run")
print('out ', stdout.read().splitlines())
print('err ', stderr.read().splitlines())
stdin.write('show shun\n')
stdin.flush()
print('out ', stdout.read().splitlines())
print('err ', stderr.read().splitlines())
ssh.close()

По этому думаю что данный случай тоже должен работать(возможно просто чего-то не хватает).

Скачать paramiko для python 3 можно здесь (не официальный релиз):
https://github.com/goertzenator/paramiko
https://github.com/goertzenator/pycrypto

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

Офлайн

#8 Авг. 21, 2012 09:19:37

shadowonline
Зарегистрирован: 2012-08-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

paramiko.Transport

В общем разобрался. Вот рабочий код.

import paramiko
hostname, port, username, password = ('host', 22, 'user', 'pw')
paramiko.util.log_to_file('trans.log')
nbytes = 100
trans = paramiko.Transport((hostname, int(port)))
trans.connect(username = username, password = password)
session = trans.open_channel(b'session')
#Once the channel is established, we can execute only one command.  To execute another command, we need to create another channel
session.exec_command(b'sh run')
exit_status = session.recv_exit_status()
stdout_data = []
stderr_data = []
 
while session.recv_ready():
    stdout_data.append(session.recv(nbytes))
    #stdout_data = b''.join(stdout_data)
 
while session.recv_stderr_ready():
    stderr_data.append(session.recv_stderr(nbytes))
    #stderr_data = "".join(stderr_data)
 
print ("exit status ", exit_status)
print ("output")
print (stdout_data)
print ("error")
print (stderr_data)

Оказалось все просто. )

Офлайн

#9 Авг. 21, 2012 16:08:38

shadowonline
Зарегистрирован: 2012-08-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

paramiko.Transport

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

Может кто подскажет пример, как можно наладить общение с консолью через paramiko без разрыва соединения и обрезания приглашения (router> или router#) для ввода команд?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version