Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 28, 2014 14:50:42

chipset
Зарегистрирован: 2014-06-28
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Python и сетевое оборудование

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
import telnetlib
def connect():
    user ="user"
    password ="pass"
    host = '172.29.114.141'
    tn = telnetlib.Telnet(host,23,15)
    tn.set_debuglevel(1)
    tn.read_until("Login:",5)
    tn.write(user+"\n")
    tn.read_until("Password:",5)
    tn.write(password+"\n")
    tn.read_until(">",5)
    tn.write("ena\n")
    tn.read_until("Password:",5)
    tn.write(user+"\n")
    tn.write("sh ver\n")
    tn.write("q\n")
    print tn.read_all()
    tn.close()
connect()
Хотел разбить на отдельные функции:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
import telnetlib
def connect():
    user ="user"
    password ="pass"
    host = '172.29.114.141'
    tn = telnetlib.Telnet(host,23,15)
    tn.set_debuglevel(1)
    tn.read_until("Login:",5)
    tn.write(user+"\n")
    tn.read_until("Password:",5)
    tn.write(password+"\n")
    tn.read_until(">",5)
    tn.write("ena\n")
    tn.read_until("Password:",5)
    tn.write(user+"\n")
#    tn.write("sh ver\n")
#    tn.write("q\n")
    print tn.read_all()
#    tn.close()
def comand():
    tn.write("sh ver\n")
    tn.write("sh inter port\n")
    print tn.read_all()
def disconnect():
    tn.close()
connect()
comand()
disconnect()
Так уже не работает. Подскажите как правильно открыть телнет сессию и дальше второй функцией выполнять команды уже в ней. И затем 3 функция которая сделает еще один телнет уже с этого устройства. Как сделать тоже самое едино без функций понятно.

Офлайн

#2 Июнь 28, 2014 15:23:01

ajib6ept
От: От: От: От: От: От: От: От:
Зарегистрирован: 2013-08-04
Сообщения: 297
Репутация: +  26  -
Профиль   Отправить e-mail  

Python и сетевое оборудование

Проблема в области видимости.
В функции connect() вы создали объект tn = telnetlib.Telnet(host,23,15) , а другие функции уже его не видят. Попробуйте вот так

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
import telnetlib
def connect():
    user ="user"
    password ="pass"
    host = '172.29.114.141'
    tn = telnetlib.Telnet(host,23,15)
    tn.set_debuglevel(1)
    tn.read_until("Login:",5)
    tn.write(user+"\n")
    tn.read_until("Password:",5)
    tn.write(password+"\n")
    tn.read_until(">",5)
    tn.write("ena\n")
    tn.read_until("Password:",5)
    tn.write(user+"\n")
#    tn.write("sh ver\n")
#    tn.write("q\n")
    print tn.read_all()
    return tn
#    tn.close()
def comand(tn):
    tn.write("sh ver\n")
    tn.write("sh inter port\n")
    print tn.read_all()
def disconnect(tn):
    tn.close()
tl = connect()
comand(tl)
disconnect(tl)



_________________________
Python golden rule: Do not PEP 8 unto others; only PEP 8 thy self.
Don't let PEP 8 make you insanely intolerant of other people's code.

Отредактировано ajib6ept (Июнь 28, 2014 15:24:00)

Офлайн

#3 Июнь 28, 2014 15:32:10

chipset
Зарегистрирован: 2014-06-28
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Python и сетевое оборудование

Так тоже не помогло:

 ./test.py
Traceback (most recent call last):
  File "./test.py", line 31, in <module>
    tl = connect()
  File "./test.py", line 22, in connect
    print tn.read_all()
  File "/usr/lib/python2.6/telnetlib.py", line 325, in read_all
    self.fill_rawq()
  File "/usr/lib/python2.6/telnetlib.py", line 516, in fill_rawq
    buf = self.sock.recv(50)
socket.timeout: timed out

Офлайн

#4 Июнь 29, 2014 07:10:05

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Python и сетевое оборудование

chipset
Так тоже не помогло:
У вас железка недоступна. Соединение по тайм-ауту закрылось.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#5 Июнь 30, 2014 09:16:00

chipset
Зарегистрирован: 2014-06-28
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Python и сетевое оборудование

Железка доступна первый вариант без функций по прежнему работает.

Офлайн

#6 Июнь 30, 2014 09:16:38

chipset
Зарегистрирован: 2014-06-28
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Python и сетевое оборудование

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
import telnetlib
def connect():
    user ="user"
    password ="pass"
    host = '172.29.114.141'
    tn = telnetlib.Telnet(host,23,15)
    tn.set_debuglevel(1)
    tn.read_until("Login:",5)
    tn.write(user+"\n")
    tn.read_until("Password:",5)
    tn.write(password+"\n")
    tn.read_until(">",5)
    tn.write("ena\n")
    tn.read_until("Password:",5)
    tn.write(user+"\n")
#    tn.write("sh ver\n")
#    tn.write("q\n")
#    print tn.read_all()
    return tn
#    tn.close()
def comand(tn):
    tn.write("sh ver\n")
    tn.write("sh inter port\n")
#    print tn.read_all()
def disconnect(tn):
    tn.close()
    print tn.read_all()
tl = connect()
comand(tl)
disconnect(tl)

Поправил так ошибок уже нет. Но выдает результат пустую строку.

Офлайн

#7 Июнь 30, 2014 16:40:39

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

Python и сетевое оборудование

Есть разница между:

    print tn.read_all()
    tn.close()
и
    tn.close()
    print tn.read_all()



Офлайн

#8 Июль 1, 2014 08:55:09

chipset
Зарегистрирован: 2014-06-28
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Python и сетевое оборудование

При таком варианте

print tn.read_all()
    tn.close()
возникают ошибки:
./raisecom.py 
Traceback (most recent call last):
  File "./test.py", line 35, in <module>
    disconnect(tn)
  File "./test.py", line 30, in disconnect
    print tl.read_all()
  File "/usr/lib/python2.6/telnetlib.py", line 325, in read_all
    self.fill_rawq()
  File "/usr/lib/python2.6/telnetlib.py", line 516, in fill_rawq
    buf = self.sock.recv(50)
socket.timeout: timed out
И оборудование при этом доступно. Если раскоментировано tn.set_debuglevel(1) то видно что отрабатывает скрипт. Не отрабатывает чтение print tn.read_all()

Отредактировано chipset (Июль 1, 2014 08:55:40)

Офлайн

#9 Июль 1, 2014 09:18:17

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

Python и сетевое оборудование

tn.read_all() ожидает, что сервер сам закроет соединение.
Попробуй как-нибудь так:

def comand(tn):
    tn.write("sh ver\n")
    tn.write("sh inter port\n")
    tn.write("q\n")



Отредактировано agalen (Июль 1, 2014 09:19:17)

Офлайн

#10 Июль 1, 2014 10:58:33

chipset
Зарегистрирован: 2014-06-28
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Python и сетевое оборудование

Вот так все норм. Спасибо.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version