LoginSignup
12
11

More than 5 years have passed since last update.

新人育成に便利?Telnet練習用サーバを書いてみた

Posted at

新人にTelnetでサーバやらNW機器の操作を経験させたいが、VMでLinuxを動かすだけならともかく、ロードバランサなどを用意するのは大変である。そんなわけでPythonのsocketserverを使ってTelnet接続をシミュレートする練習用サーバを書いてみた。

適当なコマンドを入力したら、それに応じた出力をするようif文で書いておき、TeraTermなどのターミナルで接続する。

if command == "exit":
  sys.exit()

elif command == "ls":
  self.write("bin     etc     proc    usr     dev     home\r\n")

ちゃんとTelnetプロトコルを喋るので、現場で使ってるターミナルで使えるし、マクロなどの実験台としてもいい。

server.py
import sys
import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):

    prompt = "$ "

    def command(self,command):
        print(command)
        if command == "exit":
            sys.exit()

        elif command == "ls":
            self.write("bin     etc     proc    usr     dev     home\r\n")

        elif command == "ls -l":
            self.write("drwxr-xr-x+ 1 t.uehara Domain Users      0 3月 19 11:14 bin\r\n")
            self.write("drwxr-xr-x+ 1 t.uehara Domain Users      0 3月 19 11:14 etc\r\n")
            self.write("drwxr-xr-x+ 1 t.uehara Domain Users      0 3月 19 11:14 proc\r\n")
            self.write("drwxr-xr-x+ 1 t.uehara Domain Users      0 3月 19 11:14 usr\r\n")
            self.write("drwxr-xr-x+ 1 t.uehara Domain Users      0 3月 19 11:14 dev\r\n")
            self.write("drwxr-xr-x+ 1 t.uehara Domain Users      0 3月 19 11:14 home\r\n")

    def write(self,str):
        self.request.sendall(bytes(str,"UTF-8"))

    def handle(self):

        buff = []

        while True:
            self.data = self.request.recv(1024)

            if self.data == bytes("\r\x00","UTF-8"): # 改行
                self.write("\r\n")
                self.command("".join(buff))
                del buff[:]
                self.write(self.prompt)
            elif self.data == bytes("\x03","UTF-8"): # Ctrl+C
                sys.exit()
            else:
                self.request.sendall(self.data)
                try:
                    buff.append(self.data.decode("UTF-8"))
                except UnicodeDecodeError:
                    print(self.data)

if __name__ == "__main__":

    HOST, PORT = "localhost", 23

    server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
    server.serve_forever()

ちなみに本来であれば、Telnet接続する際のコマンドなんかも解釈させたいところだが、今のところオウム返しさせている。独自に拡張させたい場合は、下記のサイトが参考になる。

コマンドヒストリーとかTab補完も無理。うちの職場はZshなんでぇ~という方にも、この練習台は向かない。でも、SSH版は密かに作ってみたかったり。

12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11