Search code examples
pythontelnetlib

telnetlib read_until can't work as not sure what hostname to expect


My program requires telnet to a list of suspect devices, however all of their hostnames are different, they do however, follow a suit every time which I shall enclose below.

My issue is that the telnetlib requires a read_until argument before it attempts to enter a username, in my instance I don't know what that hostname is.

I tried saving a read_all as a variable and reading that, in the hope of extracting the hostname but the command hangs as expected

Code

import telnetlib
username = 'admin'
password = 'password'

text = []
def telnet2():
    tn = telnetlib.Telnet('10.10.10.199')
    tn.write(username + "\r\n")
    if password:
      tn.read_until('Password: ')
      tn.write(password + '\r\n')
      tn.write('enable \r\n')
      tn.write('show poe status \r\n')
      tn.write('show mac-address-table \r\n')
      tn.write('exit \r\n')
    text.append(tn.read_all())

telnet2()

Possible Hostnames

Switch_100-110

Extra

In this instance the hostname is Switch_109 but I wouldn't know that if I hadn't manually connected to check.

** Error messages **

`File "connect2.py", line 18, in telnet2
    print(tn.read_all())
  File "/usr/lib/python2.7/telnetlib.py", line 385, in read_all
    self.fill_rawq()
  File "/usr/lib/python2.7/telnetlib.py", line 576, in fill_rawq
    buf = self.sock.recv(50)`

Solution

  • I ended up having to include a sleep and increasing the debug buffer size to accommodate for the amount of data the buffer was receiving, this may not work 100% for myself as the mac-address-table will change throughout the day when users connect, however I am merely looking for one single MAC address that is on a separate interface from the end users so it will be OK

    import time
    import telnetlib
    username = 'admin'
    password = 'password'
    
    text = []
    my_text = ''
    def telnet2():
        tn = telnetlib.Telnet('10.10.10.199')
        tn.read_until('switch_')
        tn.write(username + "\r\n")
        if password:
          tn.read_until('Password: ')
          tn.write(password + '\r\n')
          tn.write('enable \r\n')
          tn.write('show poe status \r\n')
          time.sleep(1)
          tn.write('\r\n')
          tn.write('enable \r\n')
          tn.write('show mac-address-table \r\n')
          tn.write('\r\n')
          time.sleep(2) # handy for not overloading the buffer straight away/accommodating for time delay due to latency
          tn.write('exit \r\n')
          tn.write('exit \r\n')
          my_text = tn.set_debuglevel(40000) # by changing the debuglevel it will take in more data
          my_text = tn.read_all()
          print(my_text)
    
    telnet2()