Search code examples
pythontelnettelnetlib

Python multiple telnet sessions


I need to build a script to get the telnet output of as many hosts as possible and save them to a separate file for each host. The script should run as a daemon.

For the moment i have a function that encapsulates the logic for do it for a single host with telnetlib, but i do not how to proceed. I planned to open a process (multiprocessing.Process) for each host but i suspect it's going to be a resource waste and it must to exist a better way :)

def TelnetLogSaver(hostname,ip,filename):   
    # open files and telnet sessions
    f = open(filename,"a")
    tn = telnetlib.Telnet(ip,23,TIMEOUT)

    # login
    e = tn.read_until("Login: ")
    tn.write(USER+"\n")
    # and password
    e = tn.read_until("Password: ")
    tn.write(PASSWORD+"\n")

    # Connected. Start infinite loop to save messages log
    while True:
        e = tn.read_until(PROMPT,TIMEOUT)
        if e is not "":
            f.write(datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S"))
            f.write(e)
            f.flush()

        # avoid session timeout
        tn.write("\n")
        e = tn.read_until(PROMPT

Solution

  • I believe the following should do what your require, I took your original code and made it into a type of thread:

    import threading
    import telnetlib
    import datetime
    import sys
    # Global Variable Declarations
    TIMEOUT = 30
    USER = "Noel"
    PROMPT = "Noel"
    
    
    class listener(threading.Thread):
        def __init__(self, filename, ip):
            # Have to make a call to the super classes' __init__ method
            super(listener, self).__init__()
            self.f = open(filename,"a")
            try:
                self.tn = telnetlib.Telnet(ip, 23, TIMEOUT)
            except:
                print "Bad Connection"
                sys.exit(0)
    
        def run(self):
            # login
            e = self.tn.read_until("Login: ")
            self.tn.write(USER+"\n")
            # and password
            e = self.tn.read_until("Password: ")
            self.tn.write(PASSWORD+"\n")
            while True:
                e = self.tn.read_until(PROMPT, TIMEOUT)
                if e is not "":
                    self.f.write(datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S"))
                    self.f.write(e.strip())
                    self.f.flush()
    
                # avoid session timeout
                self.tn.write("\n")
    
    
    if __name__ == "__main__":
        # Things to listen to is a dictionary of hosts and files to output
        # to, to add more things to listen to just add an extra entry into
        # the things_to_listen_to in the format: host : outputfile
        things_to_listen_to = {"localhost" :"localhost_output.txt"}
        # Thread holder is going to hold all the threads we are going to start
        thread_holder = []
        for host, file in things_to_listen_to.iteritems():
            thread_holder.append(listener(file, host))
        for thread in thread_holder:
            thread.run()
    

    Hope this helps, if you have any problem update your question or leave a comment.