本サイトはプロモーションを含みます。

Cisco機器にログインしてコマンド打ってログ取得するマクロを3分で書く

TeraTermマクロは作業を効率化させる事が目的であって、マクロを書く事が趣味でない限り楽をする必要があります。

ぼくは数年前からTeraTermマクロを機能ごとにファイルに分割してincludeさせる、という方式をとっていて、最近になってそれをttmlという名前でgithubへ公開するようになりました。1日かけて一生懸命マクロを書いている人にはttmlを使うように推奨していますが、いまひとつ反応が良くないので、ttmlの使い方について解説させてください。

用意するもの

最初にttmlをデスクトップにダウンロードしてください。zip形式なので、それを展開します。展開すると「ttml-master」というフォルダができあがるはずです。つぎに実行したいコマンドを書いたファイルを用意します。ファイル名はcisco.txtとでもしておきます。たとえば、次のような内容のファイルです。

show clock
show version
show running-config
show startup-config
show interface
show interfaces status
show log

このファイルを先ほど展開したttmlフォルダ直下にあるcmdというフォルダ内に保存してください。

コンソールログインしてログ取得するマクロを3分で書く

必要なのは次の情報です。

  • ログインするCisco機器のホスト名
  • ログイン、enableパスワード
  • シリアルコンソールのポート番号

template.ttlをコピーして編集する

ttmlフォルダ直下に「template.ttl」があるので、これをコピーして「console.ttl」という名前で保存します。コピーしたらこのファイルを編集してください。

; マクロファイルを'ttml'ディレクトリ直下に置く場合はこのまま
; マクロファイルを'ttml'ディレクトリ以外に置く場合は'ttml'へのフルパスを記述する
; ttmldir = ''
getdir ttmldir

;;;;;; ここは編集しないこと
setdir ttmldir
include 'conf\default.ttl'
; ログファイルの拡張子、COMポート番号など共通設定はshared.ttlで再定義してください
include 'conf\shared.ttl'
;;;;; ここまで

;エラーメッセージを表示させない場合はコメントを外してください
;nomessage_flag = 1

;sshログイン方法を選択する(初期値はパスワード認証)
;チャレンジレスポンスはSSH_AUTH_CHALLANGE
;ssh_auth_type = SSH_AUTH_PASSWORD
;ssh_auth_type = SSH_AUTH_CHALLANGE


;;;IPアドレス用配列を確保(初期値は4)
;maxip = 4
strdim targetip maxip
; 接続先IPアドレス(telnet.ttlとssh.ttlでは必須)
; 複数のIPアドレスを設定している機器へ接続する場合、すべてのIPアドレスを登録すると、接続に失敗した際に順に接続を試みます
;targetip[0] = ''
;targetip[1] = ''
;targetip[2] = ''
;targetip[3] = ''

;;;ここにログイン処理を書く
; ログインユーザー名(ssh.ttlとtelnet.ttlでは必須、comlogin.ttlはオプション)
login_user = ''
; ログインパスワード(ssh.ttlとtelnet.ttlでは必須、comlogin.ttlはオプション)
login_password = ''
; ログイン後に表示されるプロンプト(comlogin.ttlとtelnet.ttlでは必須)
login_prompt = 'Router[>#]'

; 必要に応じてincludeする
; COMポート番号はconf\shared.ttlで設定することをおすすめします
; COMポートをここで設定する場合は次のコメントを外して設定してください
comport = 3
include 'mod\comlogin.ttl'
;include 'mod\ssh.ttl'
;include 'mod\telnet.ttl'

;;; Cisco機器でenableモードに入る場合
;enableパスワードを設定していない場合はコメントのままで大丈夫です
;enable_password = 'password'
;enableモードに入る場合はコメントを外してください
include 'mod\cisco\enable.ttl'

;;; CheckPoint Firewallでexpertモードに入る場合
;次のふたつのコメントを外すとexpertモードに入ります
;expert_password = 'password'
;include 'mod\checkpoint\expertmode.ttl'

;;;コマンドファイル関連
; コマンドファイル名(初期値はcmd.txt)
cmdfile = 'cisco.txt'
; コマンドファイルを読み込む場合は、コメントを外す
; このコメントを外したら、78行目でdo_loop_cmd.ttlをincludeする事を忘れないでください
include 'mod\open_cmdfile.ttl'


;;;ログ取得関連
logfile = 'logfile'
; ログファイルを取得する場合は、コメントを外す
include 'mod\open_logfile.ttl'


;;;コマンドファイルの内容を1行ずつ実行する場合はコメントを外す
; コマンド実行後に表示されるプロンプト(正規表現可)
; Cisco機器の場合はつぎのような設定をおすすめします(ホスト名は適宜修正してください)
;waitprompt = '^ホスト名(\([a-z]+(-.+)?\)?)?[>#]$'
waitprompt = '^Router(\([a-z]+(-.+)?\)?)?[>#]$'
include 'mod\do_loop_cmd.ttl'


;;;後処理
include 'mod\cleanup.ttl'

setexitcode EXIT_SUCCESS
end

修正内容1:ログインプロンプト

38行目でログイン後に表示されるプロンプトを設定します。ログイン後、既にenableモードに入っている可能性もあるので正規表現をつかって「>」と「#」のどちらでも対応できるようにしています。コンフィグモードへ入っている、という状況は想定していません。

修正内容2:ログイン処理

43~44行目で、シリアルポートの指定とコンソールログインするためのマクロを読み込んでいます。「comport = 3」のところは適宜修正し、43行目と44行目のコメントを外します。これでコンソールログインできます。

修正内容3:enableモードに入る

Cisco機器のコンフィグを表示させるためには、enableモードに入る必要があります。enableパスワードを設定している場合は50行目のコメントを外してパスワードを記述します。今回は初期化済みのCiscoルーターへログインするため50行目は無視しています。enableモードに入るためには52行目のコメントを外します。これでenableモードへ入ることができます。

修正内容4:コマンドファイルの指定

さきほど用意した「cisco.txt」を読み込むため、61行目のコメントを外してcisco.txtを指定します。併せて、64行目のコメントを外します。これで、cisco.txtを開く事が出来ます。

修正内容5:ログ取得

68行目のコメントを外してログファイル名を指定します。併せて70行目のコメントを外します。これでログ取得できます。

修正内容6:コマンド実行

修正内容4で指定したcisco.txtから1行読み出して送信するための処理です。待ち受けのためのプロンプトを77行目で指定します。今回はホスト名がRouterなので、76行目のおすすめ設定に従って設定しています。78行目のコメントを外すとコマンドを送信します。

なお、コマンドファイルに「terminal length 0」を書いていませんが、「–More–」を適切に処理するようになっているので、なくても大丈夫です。

「–More–」の処理方法については、次の記事で解説しています。

参考記事:TeraTermマクロで「–More–」を確実に処理する方法

実行してみます

慣れているせいもありますが、ぼくは1分ほどで修正を終えてマクロを実行しました。結果は次のようになります。

きちんと動いていますね。ログファイルも生成されてすべてのやり取りを記録しています。ログファイルは「ttml-master¥log」フォルダに日付と時刻入りで格納されています。

sshやtelnetでログインしたい場合は、45行目、46行目のコメントを外します。凝った処理でもしない限り、このようなマクロならば数分で作成できます。是非、活用してみてください。

いまいち良くわからない、もしくは改善案などありましたら、ここへのコメントかメールを頂けると嬉しいです。

9 COMMENTS

小岩 尋一

初めまして。
参考にしようとファイルのダウンロードを試みましたが、リンク切れでしたので、サンプルコードを掲載いただくか、再度ファイルをアップロードいただけると嬉しいです。

返信する
小岩 尋一

ありがとうございます。
ダウンロードできました。
参考にさせていただきます。

返信する
岩崎英樹

参考にさせていただきたいので、再度アップロードお願い出来ませんでしょうか。
リンクが切れています。

返信する
shj

リンク切れ報告ありがとうございます。
GitHubはリポジトリを失ってしまっていましたので、手元のバックアップファイルをこのサーバにアップロードしておきました。ダウンロードできようになっているはずです。

返信する
Yosio_DMZ

はじめまして、こちらのテンプレートを使って(壊して?)マクロを書こうと努力しています。

https://teraterm.jp/?p=643_self
で紹介されていた方法で

waitregex HOST_NAME
で「Hostname」#のWAITはうまくいっているようなのですが、reloadの後の確認「Proceed with reload? [confirm]」、再起動後の「Press RETURN to get started!」にうまく[RETURN]を返すことができません。

何か良い方法があればご教示いただけると幸いです。

PS.ガイドブックをKindleで購入しました、歴史パートが面白そうですね、ひと段落したら読んでみようと思います。

返信する
Yosio_DMZ

すいませんコマンドやメッセージで察してはいただけると思いますがCiscoルーターでの話です。

返信する
shj

Yosio_DMZさん初めまして。

waitregexを使っていらっしゃいますよね?
waitregexは次のようにして待ち受ける文字列を10個まで指定できます。

waitregex ‘hoge’ ‘foo’ ‘fuga’

変数resultには何番目の文字にマッチしたか番号が入ります。たとえば’foo’にマッチすればresultに「2」が入り、どれにもマッチせずタイムアウトしたら「0」が入ります(変数timeoutかmtimeoutが0よりも大きい場合)。
これを利用するとYosio_DMZさんのやりたい事を実現できるかと思います。
テストマクロを書いてみたので試してみてください。

==以下、テスト用マクロ==
regexstr1 = “^Switch(¥(([a-z]+(-.+)?)?¥))?[>#]$”
regexstr2 = “Proceed with reload\? \[confirm\]”
regexstr3 = “Press RETURN to get started\!”

timeout = 10
while 1
waitregex regexstr1 regexstr2 regexstr3

if result == 1 then
; regexstr1にマッチしたときの処理
messagebox matchstr ‘match’
elseif result == 2 then
; regexstr2にマッチしたときの処理
messagebox matchstr ‘match’
elseif result == 3 then
; regexstr3にマッチしたときの処理
messagebox matchstr ‘match’
elseif result == 0 then
; タイムアウトしたときの処理
messagebox ‘timeout’ ‘timeout’
else
; ここは通らないはず
messagebox result ‘Unknown’
endif
endwhile

返信する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)