YAMAHAルータで動くTELNET強制切断Luaスクリプトを書いてみた

YAMAHAのルータをTELNETで設定しているときに、ついうっかりターミナルウインドウを閉じてしまったり
設定中のマシンのネットワーク設定をいじくってTELNETが切れてしまったりすると
ルータ側ではまだセッションが残っていて、すぐに再接続しようとすると


MacBook-Pro:~ oreore$ telnet 192.168.100.1
Trying 192.168.100.1...
Connected to 192.168.100.1.
Escape character is '^]'.

Error: Other user logged in by telnet.Connection closed by foreign host.
MacBook-Pro:~ oreore$


みたいに蹴られちゃって、無操作でのタイムアウト(デフォルト300秒)待たないと操作できないという悲しい事態に遭遇する。
もちろん、login timerコマンドで無操作タイムアウト時間を短くしたり、別途ユーザ名をつくってそっちからログインしたり
いろいろ回避策があるにはあるのだけど


login timerを短くすれば調べ物してる間にいちいちタイムアウトで切断されて欝陶しいし
ユーザ名を別につくるとPasswordだのUsernameだのPasswordだのって何度もログイン時に聞いてきて鬱陶しいし


めんどいなーと思っていたところでNVR500(と他2機種ぐらい)ではLuaスクリプトというプログラミング言語が使えることを思い出したので
これを使って、ログイン出来なくて困っている状態を検知して幽霊セッションを自動ログアウトさせようと思いついた。


動きとしては、
まず、Luaスクリプトでルータのログを監視させる。
2つ目のセッションを張ろうとして蹴られたときはログに「Login failed for TELNET: IPアドレス」とでるので、これを察知したら
disconnect user /telnetコマンドを打ち込んでやってセッションを全部切る。


いろいろあって完成したLUAスクリプトはこちら。

while (true) do


rtn, str = rt.syslogwatch("Login failed for TELNET: 192.168.100.%d+")


rt.command("console info on")
rt.syslog("info", "[LUA] Kick ALL Telnet Connection after 7 seconds." )
rt.command("console info off")
rt.sleep(7)
rt.command("disconnect user /telnet")


end

とりあえず説明


1,効果を発生させるのが1度きりならループはいらないらしいのだが、それでは困るのでループ。
2,SYSLOGWATCHでログ監視してLogin failed for TELNET: 192.168.100.なんとかが出力されたら次へ進む。
 IPをある程度指定しているのは、パスワードミスってLogin Failedになったときもこのログが出るようなので、外部からアタックされてて自分が蹴り落とされるのを防ぐため。
3,console info onというコマンドを発行。SYSLOGに記録されたメッセージがコンソールに出る。
 このスクリプトのバグで予期せぬログアウトが起こると困るので、既存セッションにメッセージを表示させるためにこれを実行。
4,ログに7秒後に全部切るからな、と出力。英語間違ってるかも。というのはいいとして(3)のconsole info on効果によって誤作動の場合はそのメッセージが利用者のコンソールに出る。
 この7秒でlua use offとかterminate lua 1とか入れることができればキャンセルできる。
5,console info off。そのままにしとくと次回ログイン時も操作中にログがばしばし出てきて鬱陶しいので。普段console info onで使っている場合はこれをカットのこと。
6,7秒待つ。
7,disconnect user /telnetとしてTELNET接続セッションを全部切る。


というようなことをやれば、間違ってEXITせずにウインドウを閉じても
telnetで再接続したとき、一度は蹴られるけど、それをトリガーにして
このスクリプトが7秒後にセッションオールクリアしてくれるので
300秒待たずとも安心して作業続行できるというわけですね。


LUAスクリプトのルータ本体へのコピー方法や、ルータ起動時にこのスクリプトを起動させておく方法に関しては他のページをあたってください。


プロい人にコンソールケーブルでやればこんなことで悩まずに済むぜとか言われそうなんだけど、そんなこと知るかカス。