Найти - Пользователи
Полная версия: paramiko.Transport
Начало » Python для экспертов » paramiko.Transport
1
shadowonline
Помогите разобраться, что не так в примере.
Нашёл пример (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
odnochlen
Надо пользоваться тегом code.
shadowonline
odnochlen
Надо пользоваться тегом code.

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

А это, понял )))
shadowonline
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
shadowonline
В общем разобрался. Вот рабочий код.

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)

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

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

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB