DLinkルーターとのtelnet通信用のスクリプトが必要です


1

私はこのスクリプトを使ってtelnetを通して私のルータに接続しようとしています:

#!/usr/bin/expect -f

set timeout 20

# router user name
set name "admin"

# router password
set pass "admin"

# router IP address
set routerip "192.168.1.1"

# Read command as arg to this script
set routercmd "cat /var/1.leases" 

# start telnet
spawn telnet $routerip

# send username & password
expect "username:"
send -- "$name\n"
expect "password:"
send -- "$pass\n"

# get out of ISP's  Stupid menu program, go to shell
expect "TBS>>"
send --  "sh\n"

# execute command
expect -re ".*\$"
send -- "$routercmd\n"

# exit
send -- "^D"

これで、スクリプトは send -- "sh\n" 部。次のようなシェルプロンプトが表示されます。 ~ $ (ティルダスペースドルスペース)。しかし、これ以降はコマンドを発行できません。それ以降は基本的に動作しません。

誰もがその理由を言うことができますか?彼らが私がしているいくつかの間違いですか?

回答:


0

はい。私はそれを割った。それは間違ったパターンマッチングで何かをしなければなりませんでした。 expect コードの最後の行に追加します。

私がしたことは、まず第一に、を使用して記録されたスクリプトを生成することでした autoexpect。このツールはあなたのセッションを記録し、それに基づいてスクリプトを生成するために使用されます。そうするために、私は最初に autoexpect パッケージ(で利用可能 expect-dev Debianベースのシステムにパッケージ化してから)

sudo apt-get install expect-dev          #Since I'm on Ubuntu
autoexpect telnet 192.168.1.1

autoexpect 自動的にスクリプトが生成されました。このスクリプトを実行すると、コマンドが実行されてルーターで実行されるまでスクリプトは実行されていましたが、終了できませんでした。このスクリプトからヒントを得てexpectのmanページを読むと、パターン認識に問題があることがわかりました。私はついにスクリプトをそれに応じて修正しました、そしてこれはついにうまくいくものです:

#I am mentioning here only the end part of the complete script which was faulty
# execute command
expect "~ \$ "
send -- "$routercmd\r"

expect "~ \$ "
send -- "exit\r"

expect -- "TBS>>"
send -- "exit\r"

expect -- "*Are you sure to logout?*" 
send -- "y"
expect eof

だから、学んだ教訓は私たちが使うべきだということでした autoexpect 自動的にスクリプトを生成します。それからそれらの自動生成されたスクリプトに何らかの欠陥があるなら、それはおそらく最も間違ったパターン認識による expect 部。

私の場合、本質的に問題のある部分は次のとおりです。

expect -re ".*\$"    #WRONG
expect "~ \$ "       #RIGHT

障害のある部分は、あなたが連絡しているセッションに完全に依存します。 telnet経由でメールサーバーに連絡すると、異なる出力が返されるので、それに合わせて一致させる必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.