2013-07-22 2 views
0

"run config"출력을 라우터에서 가져 오는 데 Python telnetlib을 사용하고 있습니다. "show running-config"출력을 변수에 저장하는 방법. 변수를 인쇄하십시오. 내 요구 사항은 각각의 모든 출력을 콘솔에 표시 할 때 코드의 각 줄마다 실행됩니다.이 옵션을 사용하면 이러한 인쇄 문을 사용할 수 있습니다.telnetlib을 사용하여 CLI 명령을 실행하고 변수에 저장하십시오.

import telnetlib 
#import getpass 
ipaddr = "10.1.1.1" 
passwd = "abcd123" 
tn = telnetlib.Telnet(ipaddr) 
if Password: 
    try: 
      print (tn.write (password + "\n")) 
      print(tn.read_until("Router>")) 
      print(tn.write("enable\n")) 
      print(tn.read_until("Password:")) 
      print(tn.write(passwd + "\n")) 
      print(tn.read_until("Router#")) 
      print(tn.write("show clock\n")) 
      print(tn.read_until("#")) 
      print(tn.write("show running-config\n")) 
      print(tn.write("\040\n")) 
      print(tn.write("\040\n")) 
      print(tn.write("\040\n")) 
      print(tn.read_until("#")) 
      print(tn.write("logout\n")) 
      print(tn.read_until(">")) 
      print tn.close 
+0

모든 작업을 인쇄 할 필요는 없습니다. 대신 변수, 객체 또는 사전과 같은 항목에 저장 한 다음 나중에 인쇄 작업을 수행 할 수 있습니다. 그러나 사물의 외모로 보면 그것은 매우 거래 적으로 보이기 때문에 더 우아해질 수는 없습니다. 출력 샘플을 제공 할 수 있다면 가능할 수도 있습니다. – dilbert

답변

0

올바르게 이해하면 원격 콘솔에서 실행하는 각 명령의 출력을 로컬 콘솔에 출력하고 싶습니다. 나는 당신이 그것이 요구 사항이라고 말할 때를 제외하고 동기가 필요한 이유를 확신하지 못합니다. 요구 사항을 이해했는지 확인하는 것이 좋습니다. 어떤 경우에도 출력물을 출력해야한다는 요구 사항이 있기 때문에 입력을 인쇄 할 필요가 없습니다.

출력물을 변수에 저장하는 것이 좋습니다. 데이터에 대한 조치를 취하지 않는 한 데이터를 검색 할 수있는 이점이 없으며 데이터를 인쇄하면 작업 할 수 없습니다. 변수에 저장하면 인쇄되고 인쇄 될 수 있습니다. 나는 인간의 눈이 그것을 저장하는 데있어 차이를 말할 수있을 것이라고 생각하고 단편적인 것이 아니라 한꺼번에 그것을 쓰게 될 것이라고 의심한다.

원격 콘솔에 'Password :'가 있는지 평가하기 전에 텔넷 세션을 먼저 읽어야하기 때문에 쓰여진대로 try 블록이 실행되지 않습니다.

몇 가지 더 제안 :

첫째, 일시 정지 출력을 처리하는 것을 피하기 것, terminal length 0 물품.

둘째, 나는 게으르다. 나는 내가 개행 문자로 저장하는 리모트 유닛에 전달하는 것을 알고있다.

셋째, 항상 시간 초과를 지정하면 절대 오지 않을 수도있는 영원히 기다릴 위험이 있습니다.

넷째, Telnet.expect(list, [timeout])을 살펴보십시오. 나는 read_until보다 훨씬 유용하다는 것을 알았다. 여러 응답을 찾고 이에 따라 각각의 응답을 수행 할 수 있습니다. 오류 처리에 매우 유용합니다. 일치하는 항목의 인덱스 (일치하는 항목이없는 경우 -1)와 일치하는 텍스트 (일치하는 항목이없는 경우 버퍼의 모든 항목)를 나타내는 세 항목 튜플을 반환합니다.

다섯째, telnet 세션을위한 데코레이터를 작성하여 로그인하십시오. 원격 장치와 상호 작용할 때마다 적어도 한 번 이상 사용되고 새로운 펌웨어를로드하는 경우 더 많이 사용됩니다. 매번 작성하지 않고 재사용 할 수있는 함수 라이브러리를 개발하십시오. 게으르다.

import telnetlib 
import sys 

ipaddr = "10.1.1.1" 
passwd = "abcd123" 


def login(tn): 
    global passwd 
    passwd=passwd+'\n' 

    def error_check(tmp): 
    if tmp[0]==-1: 
     print "Unexpected response" 
     print "tmp[2] 
     sys.exit() 

    tmp=tn.expect(["Password:",], 5) 
    error_check(tmp) 
    tn.write(passwd) 
    tmp=expect([">",],5) 
    error_check(tmp) 
    tn.write('en\n') 
    tmp=expect(["Password", "#'],5) 
    error_check(tmp) 
    if tmp(0)==0: #if someone left enable unlocked, don't send a password 
    tn.write(passwd)   
    tmp=expect(["#',],5) 
    error_check(tmp)   

tn = telnetlib.Telnet(ipaddr) 
login(tn) 
tn.write('terminal length 0') 
tmp=expect(["#',],5) 
tn.write('sho clock') 
now=tn.expect(["#",], 5) 
print now 
tn.write('sho run') 
print run 
cfg=tn.expect(["#",], 5) 
tn.write("logout\n")) 
bye=tn.expect([">",], 5) 
print bye 
tn.close() 
관련 문제