telnetlib 사용법

dingdong·2022년 1월 14일
0

PYTHON SESSION CONNECTOR

목록 보기
1/2

Python 으로 telnet 원격(텔넷 서버)으로 접속하여 제어 하고 싶다면
Python 기본 라이브러리인 telnetlib 사용 방법을 간략하게 소개해보려고 한다.

Python이 설치 되어있다면 telnetlib을 따로 설치할 필요없다.

공식 문서

telnetlib github

예제 전체 코드


>>> import telnetlib
>>> import socket



>>> HOST = '127.0.0.1'      # telnet으로 접속할 대상
>>> PORT = '23'             # telnet port: 23
>>> SESSION_TIMEOUT = None
>>> session = telnetlib.Telnet(HOST, PORT, SESSION_TIMEOUT)
>>>


>>> def nego(sock, cmd, opt):
        if cmd == telnetlib.WILL and opt == telnetlib.ECHO:
            sock.sendall(telnetlib.IAC + telnetlib.DO + telnetlib.ECHO)
        elif cmd in (telnetlib.DO, telnetlib.DONT):
            sock.sendall(telnetlib.IAC + telnetlib.WONT + opt)
        elif cmd in (telnetlib.WILL, telnetlib.WONT):
            sock.sendall(telnetlib.IAC + telnetlib.DONT + opt)

>>> session.set_option_negotiation_callback(nego)
>>>


>>> session.write('show interface summary'.encode('ascii') + b"\n")
>>>
    
 
>>> msgs = []
>>> while True:
    msgs += [session.read_eager().decode('ascii')]
    if msgs[-1] == '':
        break
        
        
>>> 
>>> 

>>> 
>>> print(''.join(msgs))
show interface summary

 *: interface is up
 IHQ: pkts in input hold queue     IQD: pkts dropped from input queue
 OHQ: pkts in output hold queue    OQD: pkts dropped from output queue
 RXBS: rx rate (bits/sec)          RXPS: rx rate (pkts/sec)
 TXBS: tx rate (bits/sec)          TXPS: tx rate (pkts/sec)
 TRTL: throttle count

  Interface                   IHQ       IQD       OHQ       OQD      RXBS      RXPS      TXBS      TXPS      TRTL
-----------------------------------------------------------------------------------------------------------------
* GigabitEthernet1              0         0         0         0         0         0         0         0         0
  GigabitEthernet2              0         0         0         0         0         0         0         0         0
  GigabitEthernet3              0         0         0         0         0         0         0         0         0
  GigabitEthernet4              0         0         0         0         0         0         0         0         0
  GigabitEthernet5              0         0         0         0         0         0         0         0         0
  GigabitEthernet6              0         0         0         0         0         0         0         0         0
  GigabitEthernet7              0         0         0         0         0         0         0         0         0
* GigabitEthernet8              0         0         0         0      4000         8         0         0         0
* Loopback0                     0         0         0         0         0         0         0         0         0
* Loopback1                     0         0         0         0         0         0         0         0         0
* Loopback2                     0         0         0         0         0         0         0         0         0
IOSXE#
>>>
>>>



>>> session.close()
>>>

1) telnet session 접속

  • HOST : 접속할 IP
  • PORT : TCP port
    • 23
    • Remote Console를 이용해서 사용할 경우, 그에 맞는 port 번호를 사용
  • SESSION_TIMEOUT : 세션의 타임아웃 값
    None, int
    • None 일 경우,
      접속한 텔넷 서버에서 연결을 끊을 때까지 세션을 유지
      아니면 망 상황이 안 좋아서 끊길때까지 유지
    • Int 일 경우,
      세션 유지하는 시간을 숫자로 입력

session = telnetlib.Telnet(HOST, PORT, SESSION_TIMEOUT)

2) 입력시 Telnet option 과정에 대해서 정의를 해줌

  • write 할 데이터 전송시 Nego 하는 방법을 정의해줌
  • IAC (Interrupt As Command): IAC 명령을 사용해야지 뒤에 BIT를 명령으로 인식함.
    • Ex) telnetlib.DO 만 보내면 단순히 string 인 줄 안다.
  • DO : 접속한 서버(원격)에게 옵션을 사용하자고 요청
  • WILL : LOCAL 에서 옵션을 사용하겠다고 보냄
  • DONT : 접속한 서버(원격)에게 옵션을 사용하지말자고 요청
  • DONT : 접속한 서버(원격)에게 옵션을 사용하지하지 말자고 보냄
  • WONT : LOCAL 에서 옵션을 사용하지않는다고 보냄
  • ECHO : 접속한 서버(원격)가 확인차원에서 한번더 데이터를 보냄
왜 Nego 사용?
  • 현재 제가 사용중인 IOS 에서는 nego option을 사용하지 않아도 입력한 데이터에 대해서
    읽어올때 정상적으로 데이터를 가지고 왔음.
  • 하지만 특정 텔넷 서버에 경우는 nego option 이 필요한 경우가 있어서 남겨 보았음.
  • nego option 이 필요한 텔넷 서버에서 nego option을 안 할 경우, 서버로 부터 write 한 데이터를 받지 못했음.
>>> def nego(sock, cmd, opt):
        if cmd == telnetlib.WILL and opt == telnetlib.ECHO:
            sock.sendall(telnetlib.IAC + telnetlib.DO + telnetlib.ECHO)
        elif cmd in (telnetlib.DO, telnetlib.DONT):
            sock.sendall(telnetlib.IAC + telnetlib.WONT + opt)
        elif cmd in (telnetlib.WILL, telnetlib.WONT):
            sock.sendall(telnetlib.IAC + telnetlib.DONT + opt)

>>> session.set_option_negotiation_callback(nego)
>>>

3) 텔넷서버에 데이터 입력

  • bytes 타입으로 전달 해줘야됨
  • 문자열에 끝에는 텔넷서버가 인식하는 command 명령의 끝이라는 것을 알려는 문자를 넣어줘야됩니다.
    • \n : new line
>>> session.write('show interface summary'.encode('ascii') + b"\n")
>>>

4) 텔넷서버에 데이터 읽기

  • read_eager() :
    • telnetlib에서 데이터를 읽는 방법 중 하나입니다.
    • 세션 연결이 닫히면 EOFError를 발생
    • 데이터가 없으면 b''를 반환합니다.
>>> msgs = []
>>> while True:
    msgs += [session.read_eager().decode('ascii')]
    if msgs[-1] == '':
        break
        
>>> print(''.join(msgs))

5) 텔넷 세션 끊기

session.close()
profile
자동화 개발

0개의 댓글