読者です 読者をやめる 読者になる 読者になる

telnetlibのTelnetでコマンド実行結果だけを取得する。

Python

Pythonの標準ライブラリであるtelnetlibを使用する時に特定のコマンドの実行結果のみが欲しかったので試してみました。read_until()だけでは実行コマンドやその後のプロンプトを読み飛ばす事が難しかったので、"ゴミ\n欲しい結果\nゴミ"という形で取得してスライシングで'欲しい結果'のみを抽出しています。

ソースコード

# -*- coding:utf-8 -*-
import getpass
import sys
import telnetlib

HOST = "192.168.1.13"
user = raw_input("Enter your remote account: ")
password = getpass.getpass()

tn = telnetlib.Telnet(HOST)

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

tn.read_until('~$ ') # コマンドを実行する直前まで読み飛ばす
tn.write("ls\n")
result = tn.read_until('~$ ') # lsコマンド結果とゴミを格納
tn.write("exit\n")

tL = result.split("\n")[1:-1] # コマンドとプロンプトを削除
for line in tL:
    print line

実行結果

目的であるlsコマンドの実行結果だけを取得する事ができました。

macbook:~ ox$ python fuga.py 
Enter your remote account:  ox 
Password: 
Desktop    Downloads  Music     Public     Videos
Documents  Examples   Pictures  Templates

real_all()で取得すると?

Python標準ライブラリのサンプルのようにread_all()を使用して結果を取得した場合、allの名前の通り、最後に実行したread_until()からEOFまで全て取得されてしまいます。この状態から切り出すのは面倒くさいので、read_until()をうまく利用してできるだけゴミを減らすといいと思います。

ソース

import getpass
import sys
import telnetlib

HOST = "192.168.1.13"
user = raw_input("Enter your remote account: ")
password = getpass.getpass()

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()

実行結果

macbook:~ ox$ python hoge.py 
Enter your remote account: ox
Password: 

Last login: Mon Jul  4 22:42:15 JST 2011 from 192.168.1.10 on pts/2
ls
exit
Linux ubuntu-vm 2.6.32-32-generic #62-Ubuntu SMP Wed Apr 20 21:54:21 UTC 2011 i686 GNU/Linux
Ubuntu 10.04.2 LTS

Welcome to Ubuntu!
 * Documentation:  https://help.ubuntu.com/

  System information as of Mon Jul  4 22:42:26 JST 2011

  System load:  0.14               Processes:           139
  Usage of /:   25.6% of 18.97GB   Users logged in:     1
  Memory usage: 44%                IP address for eth1: 192.168.1.13
  Swap usage:   0%

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

0 packages can be updated.
0 updates are security updates.

ox@ubuntu-vm:~$ ls
Desktop    Downloads  Music     Public     Videos
Documents  Examples   Pictures  Templates
ox@ubuntu-vm:~$ exit
logout