Pythonでtelnet接続してみる
クライアント端末からサーバーと接続するとき、sshを使うことが多いと思います。
しかし、私の職場では、まだまだtelnetで接続するサーバーが多数を占めています。
TeraTerm のマクロでtelnet接続、コマンド実行して必要な情報を取得、表示していますが、
Pythonで接続できれば応用がきくので、実験してみました。
telnet接続プログラムの例は 20.14. telnetlib — Telnet クライアント — Python 2.7ja1 documentation にあります。
実験の準備
クライアントPCは Windows 7。サーバは Ubuntu Server 12.04 を使いました。telent を使うためには、telnetd をインストールします。
$ sudo apt-get install telnetd
インストールできたら、putty や poderosa などの接続プログラムを使い、 telnet 接続の動作確認しておきます。
プログラムと実行結果
import telnetlib
HOST = "192.168.11.201"  # your server
user = "bty"             # your username
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\n")
tn.write("exit\n")
print tn.read_all()
実行結果は以下のとおり。
ls -al exit Last login: Fri May 3 20:46:09 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 Fri May 3 20:46:23 JST 2013 System load: 0.25 Processes: 66 Usage of /: 18.7% of 5.98GB Users logged in: 1 Memory usage: 2% 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 [0m[01;34m.[0m drwxr-xr-x 3 root root 4096 1譛・16 16:24 [01;34m..[0m -rw------- 1 bty bty 1454 5譛・ 3 20:46 .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 [01;34m.cache[0m drwx------ 3 bty bty 4096 5譛・ 3 19:07 [01;34m.emacs.d[0m -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 [01;34mmy[0m bty@ub01:~$ exit 繝ュ繧ー繧「繧ヲ繝・
結果をみると、文字が化けており、文字に色を付けるためのエスケープシーケンスがそのまま表示されています。
修正プログラムと実行結果
文字化け対策
サーバーの文字コードは utf-8 なので、windows で表示できるように cp932(Shift_jis)に変換します。
エスケープシーケンス対策
正規表現を使ってエスケープシーケンス文字列を除去します。
文字に色を付けるには、たとえば [01;34m のように、
ESCキャラクタ、[、任意の文字列、[、0m
の順番に続いた文字列です。
Pythonの正規表現では r’\x1b\[.*?m\[?’と表現できます。
- \x1b
- キャラクターのエスケープにマッチ
- \[
- キャラクタ-の '['にマッチ
- .<
- 任意のキャラクターにマッチ
- ?
- 先行する正規表現の、0または一回の繰り返しにマッチ。 ab?は、’a’ または
 'ab’にマッチ
.*? の表現はちょっとわかりにくい。たとえば、文字列 <H1>title</H1> に対して、
<.*> と <.*?> がマッチする文字列は以下のようになる。
| 正規表現 | マッチする文字列 | |
| <.*> | <H1>title</H1> | 最長一致 | 
| <.*?> | <H1> | 最短一致 | 
修正したプログラム
# -*- 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)
#文字コードutf-8をcp932に変換
result2 = result1.decode('utf-8').encode('cp932')
print result2
結果は以下のとおり。
ls -al exit Last login: Fri May 3 22:10:48 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 Fri May 3 22:16:12 JST 2013 System load: 0.08 Processes: 66 Usage of /: 18.7% of 5.98GB Users logged in: 1 Memory usage: 2% 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 1478 5月 3 22:10 .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:~$ exit ログアウト
参考
20.14. telnetlib — Telnet クライアント — Python 2.7ja1 documentation
正規表現 HOWTO — Python 2.7ja1 documentation
| ![【送料無料】Pythonクックブック [ アレックス・マ-テリ ]](http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f8731%2f87311276.jpg%3f_ex%3d240x240&m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f8731%2f87311276.jpg%3f_ex%3d80x80)  【送料無料】Pythonクックブック [ アレックス・マ-テリ ] | 
