Telnet cisco комутатор, използващ python

Извършвам telnet към cisco комутатор чрез скрипт на python. Кодът е както следва:

#!/usr/bin/python
import getpass
import sys
import telnetlib

HOST = "10.203.4.1"
user = raw_input("Enter your remote account: ")
password = getpass.getpass()

tn = telnetlib.Telnet(HOST)

tn.read_until("login: ")
tn.write(user + "\n")
if password:
  tn.read_until("Password: ")
  tn.write(password + "\n")

tn.write("vt100\n")
tn.write("ls\n")
tn.write("exit\n")
print tn.read_all()

Просто затваря след стартиране на скрипта. Как мога да разреша това?


person deep    schedule 30.10.2013    source източник
comment
Може би Cisco пише Username: или Login:, но вашият код чака login:. Използвайте print, за да напишете на екрана повече информация за вас - като сега ще изчакам 'login:' и т.н.   -  person furas    schedule 30.10.2013


Отговори (5)


Ето по-просто решение:

import pexpect
import getpass

HOST = "10.203.4.1"
user = raw_input("Enter your remote account: ")
password = getpass.getpass()

child = pexpect.spawn ('telnet '+HOST)
child.expect ('Username: ')
child.sendline (user)
child.expect ('Password: ')
child.sendline (password)
# If the hostname of the router is set to "deep"
# then the prompt now would be "deep>"
routerHostname = "deep" #example - can be different
child.expect (routerHostname+'>')
child.sendline ('enable')

и т.н.

person Sudipta Chatterjee    schedule 30.10.2013
comment
Моля, можете ли да обясните последните 3 реда по-подробно. или какво, ако името на хоста е нещо друго. Моля, можете ли да уточните. Благодаря ти - person deep; 30.10.2013
comment
Така че трябва да мислите за това, докато влизате в рутера чрез telnet. Уверете се, че можете да направите telnet 10.203.4.1 от командния ред, след което трябва да получите подканата Username:, след това подканата Password: и т.н. Ако успешно влезете, ще можете да видите следващата подкана, която получавате през telnet. В моята програма по-горе ръчно задавам името на хоста на "deep" - можете да използвате каквото искате. Следващият child.expect всъщност очаква да види подкана с името на хоста в него. - person Sudipta Chatterjee; 30.10.2013
comment
Има ли някакъв метод за получаване на името на хоста от комутатора чрез pexpect? Благодаря. - person deep; 08.01.2015

Трябва да погледнете Trigger: https://trigger.readthedocs.org/en/latest/

Това е набор от инструменти за автоматизация за взаимодействие с мрежови устройства, като рутери/суичове на Cisco:

from trigger.cmds import Commando

class ShowClock(Commando):
    """Execute 'show clock' on a list of Cisco devices."""
    vendors = ['cisco']
    commands = ['show clock']

if __name__ == '__main__':
    device_list = ['foo1-abc.net.aol.com', 'foo2-xyz.net.aol.com']
    showclock = ShowClock(devices=device_list)
    showclock.run() # Commando exposes this to start the event loop

    print '\nResults:'
    print showclock.results

Проверете документите за повече информация: https://trigger.readthedocs.org/en/latest/

person Italo Rossi    schedule 30.10.2013

Първо, моля, обмислете използването на нещо различно от telnet. SSH е страхотен спад в замяната. Второ, за да направите този питон, използвайте библиотека, наречена pexpect, за да направите точно това. Последният ред ще използва командата .interact(), за да получи контрол отново.

person Back2Basics    schedule 30.10.2013
comment
Ssh портът е изключен на комутатора Cisco. - person deep; 30.10.2013
comment
Някои устройства не поддържат telnet поради наследени причини. Понякога тези наследени причини са присъщи на корпоративната култура. Аааа... Технология. - person jathanism; 07.02.2015

Cisco Python Telnet скрипт за Cisco рутер и комутатори най-добрият и прост скрипт за телнет и конфигуриране на устройства от ниво 3.

import getpass
import sys
import telnetlib

HOST = "YOUR ROUTER IP ADDRESS"
user = raw_input("Enter your telnet username: ")
password = getpass.getpass()

tn = telnetlib.Telnet(HOST)

tn.read_until("Username: ")
tn.write(user + "\n")
if password:
tn.read_until("Password: ")
tn.write(password + "\n")


 tn.write("exit\n")

  print tn.read_all()

връзка за кода: Изтеглете скрипта тук

стъпки:

  1. Крайно устройство с инсталиран python и свържете крайното устройство към рутер

  2. Конфигуриране на telnet и база данни с потребителско име и парола

  3. Стартирайте скрипт на python

person Aniruddh Kadam    schedule 13.02.2018

Написах подобен код и получих подобна грешка. След това направих кода гласов, за да знам къде правя грешка. Това, което стигнах до извода е: „Използването на функцията read_all() не е добра идея през цялото време. Тя чете безкрайно и създава впечатление като прекъснат режим. Опитайте да я замените с подкана на устройството, последвана от таймер по време на четене. И опитайте да я отпечатате, за да видите дали кодът улови желания изход"

import telnetlib
import os
import sys

host = raw_input("Enter the VG IP : ")
user = "cisco"
password = "cisco"
#cmd = raw_input("Enter the command you want to feed : ")
cmd1 = "term len 0"
cmd = "show clock"
pingable = False

response = os.system("ping -c 2 " + host)
if response == 0:
    pingable = True
    print(host, "is Pingable", pingable)
else:
    print(host, "is un-Pingable", pingable)

if(pingable):
    tn = telnetlib.Telnet(host)
    banner = tn.read_until("Username:", 5)
    tn.write(user + "\n")
    print(banner)
    tn.read_until("Password:", 5)
    tn.write(password1 + "\n")
    prompt = tn.read_until("#")
    print("I am logged in\n\n")
    print(prompt)
    tn.write(cmd1 + b"\n")
    output1 = tn.read_until("#",5)
    print("my first cmd output is :", output1, "\n")
    tn.write(cmd + "\n")
    output1 = tn.read_until("#",5)
    print("My 2nd cmd is feeded here", output1)
    tn.write("show version\n")
    output1 = tn.read_until("more-- ",5)
    print("version info : ", output1)
    tn.write("exit\n")

else:
    print(host, "is unpingable")
person binod gupta    schedule 03.05.2019