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

前回のPythonでtelnet接続してみるでPythonでtelent接続できることを確認した。結果が文字化けしていたが文字コード変換し、エスケープシーケンス文字列を除去できた。

でも、やっぱり必要な部分だけ表示できたほうが便利だ、ということで、ログインした直後のOSメッセージなどを除去してみることにした。

前回の結果をみれば一目瞭然だが、コマンドを発行したプロンプトから次ぎのプロンプト直前までを抽出すれば良さそうだ。telnetlibで得られた文字列を改行部分で分割し、それぞれの行からなるリストを処理する。

プログラム

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

import re
import telnetlib

HOST = "192.168.11.201"  # your server
user = "bty"             # your user name
password = "*****"       # your password

tn = telnetlib.Telnet(HOST)

tn.read_until("login: ")
tn.write(user + "\n")
if password:
    tn.read_until("Password: ")
    tn.write(password + "\n")

tn.write("ls -al\n")
tn.write("exit\n")

result = tn.read_all()

#エスケープシーケンスの除去する
r = re.compile(r'\x1b\[.*?m\[?')
result1 = re.sub(r,'',result)

#結果の文字列を改行部分で分解し、各行からなるリストを取得する
#lines = result1.split('\r\n')
lines = result1.splitlines()

#プロンプトから次のプロンプト直前までの行を抽出する
prompt = "bty@ub01:~$"   # your prompt
flg = None
lines2 = []

for line in lines:
    if flg == None:
        if prompt in line:
            flg = True
    else:
        if prompt in line:
            break;
        lines2.append(line)

#文字コードutf-8をcp932に変換して表示する
for line in lines2:
    print line.decode('utf-8').encode('cp932')

結果

合計 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  1998  5月  6 16:54 .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

参考

5. 組み込み型 — Python 2.7ja1 documentation

文字列メッソド str.split(), str.splitlines()

Python

Posted by skw