Pythonでtelnet接続してみる(その4)

2013/05/12

これまでのtelnet接続の実験で使えることがわかってきたので、class化してみようと思った。

メソッドは、「接続」、「コマンド実行」、「切断」の3つ。

classの中で、エスケープシーケンス文字列の除去、文字コード変換を処理して、リモートホストからの受信した文字列を返すようにした。

コマンド実行のメソッドを作ったので、"ls -al" と “df" のコマンドを続けて実行させてみた。

徐々にだが使えるプログラムに近づいてきた。エラー処理が何にもないけど。プロフェッショナルな人との違いはエラー処理にあるんだと思う。

プログラム

# -*- coding: utf-8 -*-

import re
import telnetlib

class MyTelnet(object):
    def __init__(self, host, user, pswd, prompt):
        self.host = host
        self.user = user
        self.pswd = pswd
        self.prompt = prompt

    def connect(self):
        self.tn = telnetlib.Telnet(self.host)
        self.tn.read_until("login: ")
        self.tn.write(self.user + "\n")
        self.tn.read_until("Password: ")
        self.tn.write(self.pswd + "\n")
        res = self.tn.read_until(self.prompt)
        return self.cvtstr(res)

    def action(self, cmd):
        self.tn.write(cmd + "\n")
        res = self.tn.read_until(self.prompt)
        return self.cvtstr(res)

    def disconnect(self):
        self.tn.write("exit\n")
        res = self.tn.read_all()
        return self.cvtstr(res)

    def cvtstr(self, s):
        #エスケープシーケンスの除去
        r = re.compile(r'\x1b\[.*?m\[?')
        s = re.sub(r,'',s)
        #文字コードutf-8をcp932に変換
        return s.decode('utf-8').encode('cp932')


if __name__ == '__main__':
    HOST = "192.168.11.201"  # your server
    USER = "bty"             # your user name
    PASSWORD = "*******"     # your password
    PROMPT = "bty@ub01:~$"   # your prompt

    tn = MyTelnet(HOST, USER, PASSWORD, PROMPT)

    res = tn.connect()
    print res,

    res = tn.action("ls -al")
    print res,

    res = tn.action("df")
    print res,

    res = tn.disconnect()
    print res

実行結果

Last login: Sat May 11 12:44:46 JST 2013 from 192.168.11.19 on pts/1
Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-23-generic-pae i686)

 * Documentation:  https://help.ubuntu.com/

  System information as of Sat May 11 12:45:06 JST 2013

  System load:  0.2               Processes:           65
  Usage of /:   18.8% of 5.98GB   Users logged in:     1
  Memory usage: 1%                IP address for eth0: 192.168.11.201
  Swap usage:   0%

  Graph this data and manage this system at https://landscape.canonical.com/

bty@ub01:~$  ls -al
合計 44
drwxr-xr-x 5 bty  bty  4096  1月 16 22:00 .
drwxr-xr-x 3 root root 4096  1月 16 16:24 ..
-rw------- 1 bty  bty  2564  5月 11 12:25 .bash_history
-rw-r--r-- 1 bty  bty   220  1月 16 16:24 .bash_logout
-rw-r--r-- 1 bty  bty  3574  1月 16 16:35 .bashrc
drwx------ 2 bty  bty  4096  1月 16 16:26 .cache
drwx------ 3 bty  bty  4096  5月  3 19:07 .emacs.d
-rw------- 1 bty  bty    35  1月 16 16:28 .lesshst
-rw-r--r-- 1 bty  bty   675  1月 16 16:24 .profile
-rw------- 1 bty  bty  3897  1月 16 22:00 .viminfo
drwxrwxr-x 3 bty  bty  4096  1月 16 17:48 my
bty@ub01:~$  df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1        6272596 1176244   4781832  20% /
udev             1023496       4   1023492   1% /dev
tmpfs             412308     280    412028   1% /run
none                5120       0      5120   0% /run/lock
none             1030768       0   1030768   0% /run/shm
bty@ub01:~$  exit
ログアウト

参考

20.14. telnetlib — Telnet クライアント — Python 2.7ja1 documentation

▼初めてPythonに出会ったとき、この本を読んで勉強しました。B5サイズなので、鞄に入れてもかさばらず、通勤のとき、電車で読んでました。初心者向けの読みやすい説明で、Pythonの全体像をつかむのに便利です。「電池が付属しています("Battery Included")」のキャッチフレーズ通り、Pythonには多くのライブラリーがあり、簡単なスクリプトを書くことで、これまで自分には不可能と思っていたことが、できるとわかって感動しました。

【送料無料】みんなのPython第3版 [ 柴田淳 ]

【送料無料】みんなのPython第3版 [ 柴田淳 ]
価格:2,940円(税込、送料込)

Python

Posted by skw