Переключатель Telnet cisco с использованием python

Я подключаюсь к коммутатору 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, чтобы написать на экране больше информации для вас - например, сейчас я буду ждать «логин:» и т. Д.   -  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 — отличная замена. Во-вторых, чтобы сделать этот pythonic, используйте библиотеку под названием 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 лучший и простой сценарий для подключения по telnet и настройки устройств уровня 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. Запустить питон-скрипт

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