マクロは陰で使うもの。生産性を上げても給料は上がらず仕事が増えるだけなので仕事をサボろう!

Tera Term マクロでコマンド実行処理の記述を簡略化するテクニック

目次

コマンド実行処理を単純に記述すると長い

Tera Term マクロでコマンド実行するためには、対象機器の CLI プロンプトを待ち受けてからコマンドを送信する必要があるため、1コマンド当たり最低2行は記述が必要になります。実際には受信バッファのクリアやログをきれいにするために改行を挟むなどの処理も入ってくるため1コマンド当たり4,5行になる場合もあります。

機器の状態確認コマンドログの取得を行う場合、実行コマンド数は10~数十個になることも良くあるため、単純にすべてのコマンドについてコマンド実行処理を記述するとマクロが長くなり保守性が低くなります。

この記事ではこのコマンド実行処理の記述を簡略化するためのテクニックを紹介します。

動作確認環境

  • Tera Term Version 4.104

【結論】コマンドリストを保存した配列とfor文を組み合わせる

結論からいうとコマンドリストを格納した配列繰り返し処理である for 文を組み合わせて使用することで、コマンド実行処理の記述を簡略化できます。

以下は、10個のコマンドを実行するためのマクロの記述です。

; コマンド数を示す変数とコマンドリストを格納した配列の定義
commandNumber = 10
strdim commandlist commandNumber
commandlist[0] = 'terminal length 0'
commandlist[1] = 'show clock'
commandlist[2] = 'show inventory'
commandlist[3] = 'show version'
commandlist[4] = 'show processes cpu history'
commandlist[5] = 'show processes memory sorted'
commandlist[6] = 'show environment all'
commandlist[7] = 'show running-config'
commandlist[8] = 'show startup-config'
commandlist[9] = 'show logging'

; コマンド実行
for i 0 (commandNumber - 1)
 ; 配列の要素が空なら処理をスキップする
 strcompare commandlist[i] ''
 if result = 0 continue
 
 ;各コマンドに対する処理
 sendln                     ;改行送信
 waitregex prompt_privilege ;特権EXECモードのプロンプトを待つ
 flushrecv                  ;受信バッファを空にする
 sendln commandlist[i]      ;コマンド送信
next

上記はマクロ全体ではなく、この記事のテーマの本質部分のみ抜き出しています。

① コマンドリストを格納した配列の定義

配列」は名前と「添え字」と呼ばれる通し番号の付いた複数の箱のまとまりです。

画像:配列のイメージ

配列には変数定義時に指定した数分の値を格納することができ、添え字の番号は 0 から開始されます。配列に格納できる値の数は「要素数」と呼ばれます。例えば要素数が10の配列の添え字は 0-9 になります。

配列の定義方法は格納する値が文字列なのか数値なのかによって微妙に異なりますが、今回必要な文字列を格納する配列を定義する場合は以下のように行います。

文字列型の配列の定義
  • strdim <配列名> <要素数>
補足
  • <配列名>:配列の名前。命名規則は変数と同様
  • <要素数>:配列の要素数を 1-65536 の範囲内の整数で指定

以下のマクロ例では要素数が 10 の配列を定義しています。(要素数を変数で指定)

; コマンド数を示す変数とコマンドリストを格納した配列の定義
commandNumber = 10
strdim commandlist commandNumber

上のように配列を定義した場合、以下の10個の値を格納できる箱(配列の要素)が出来上がります。[]内の数字は配列の添え字です。これらの各要素には変数と同様に値を格納することができます。

  • commandlist[0]
  • commandlist[1]
  • commandlist[2]
  • commandlist[3]
  • commandlist[4]
  • commandlist[5]
  • commandlist[6]
  • commandlist[7]
  • commandlist[8]
  • commandlist[9]

この配列を利用して以下のように配列の各要素に実行コマンドを格納します。

; コマンド数を示す変数とコマンドリストを格納した配列の定義
commandNumber = 10
strdim commandlist commandNumber
commandlist[0] = 'terminal length 0'
commandlist[1] = 'show clock'
commandlist[2] = 'show inventory'
commandlist[3] = 'show version'
commandlist[4] = 'show processes cpu history'
commandlist[5] = 'show processes memory sorted'
commandlist[6] = 'show environment all'
commandlist[7] = 'show running-config'
commandlist[8] = 'show startup-config'
commandlist[9] = 'show logging'

② for文を使用して配列の各要素に対して処理を行う

配列の添え字は連続した整数値のため、for 文で使用する変数と配列の添え字を対応付けることで for 文の繰り返し処理にて各配列要素を対象とした処理を行うことができます。

配列の添え字の範囲は「0 から(要素数-1)」になるため、for 文の変数の範囲も合わせて「0 から(要素数-1)」にします。この記事では配列の要素数(=実行コマンドの数)を変数 commandNumber に格納しているため、この変数を利用して以下のような記述になります。

; コマンド実行
for i 0 (commandNumber - 1)
 ; 各コマンドに対する処理
next

上の for 文では変数 i を使用して繰り返し処理をしているため、for 文の中では commandlist[i] と記述することにより i 番目のコマンドを使用することができます。

また、値が設定されていない配列要素があった場合にも対応できるよう、for 文の最初で配列要素が空でないかをチェックし、空の場合はその要素に対する処理をスキップするために continue を実行するようにしています。

; コマンド実行
for i 0 (commandNumber - 1)
 ; 配列の要素が空なら処理をスキップする
 strcompare commandlist[i] ''
 if result = 0 continue
 
 ;各コマンドに対する処理

next

コマンド実行処理も追加すると for 文の内容は以下のようになります。

; コマンド実行
for i 0 (commandNumber - 1)
 ; 配列の要素が空なら処理をスキップする
 strcompare commandlist[i] ''
 if result = 0 continue
 
 ;各コマンドに対する処理
 sendln                     ;改行送信
 waitregex prompt_privilege ;特権EXECモードのプロンプトを待つ
 flushrecv                  ;受信バッファを空にする
 sendln commandlist[i]      ;コマンド送信
next

以上で配列とfor文を使用したコマンド実行処理は完成です。

コマンド数を増やしたい場合は配列の要素数を増やせばOK

この記事のマクロ例では配列の要素数を 10 にしているため、実行できるコマンドは最大で 10 個になります。より多くのコマンドを実行したい場合は配列定義時の要素数をより多く設定します。この記事のマクロ例だと変数 commandNumber の値を 10 より大きくします。

【マクロ例】Telnet ログインしてコマンド実行するマクロ

以下は Cisco 機器に Telnet ログインしてコマンドを実行するマクロの例です。

;;=========================================
;; (1)変数定義パート
;;=========================================
hostname = 'MyRouter'
address = '10.1.1.1'
vtypass = 'admin'
username = 'admin'
userpass = 'admin'
enablepass = 'admin'
sprintf2 prompt_user '^%s.*>' hostname
sprintf2 prompt_privilege  '^%s.*#' hostname
commandNumber = 10
strdim commandlist commandNumber
commandlist[0] = 'terminal length 0'
commandlist[1] = 'show clock'
commandlist[2] = 'show inventory'
commandlist[3] = 'show version'
commandlist[4] = 'show processes cpu history'
commandlist[5] = 'show processes memory sorted'
commandlist[6] = 'show environment all'
commandlist[7] = 'show running-config'
commandlist[8] = 'show startup-config'
commandlist[9] = 'show logging'

;;=========================================
;; (2) メイン処理パート
;;=========================================
; Telnet接続
sprintf2 connectcommand '%s:23 /nossh /T=1' address
connect connectcommand

; プロンプト待ち受け
wait 'Username' 'Password:'

; 認証方式別にログイン処理を行う
if result = 1 then
 ; ユーザ認証の場合の処理を記述
 sendln username
 wait 'Password:'
 sendln userpass
elseif result = 2 then
 ; パスワード認証の場合の処理を記述
 sendln vtypass
endif

; 特権EXECモードに移行
sendln
waitregex prompt_user
sendln 'enable'
wait 'Password:'
sendln enablepass

; コマンド実行
for i 0 (commandNumber - 1)
 ; 配列の要素が空なら処理をスキップする
 strcompare commandlist[i] ''
 if result = 0 continue
 
 ;各コマンドに対する処理
 sendln
 waitregex prompt_privilege
 flushrecv
 sendln commandlist[i] 
next

まとめ

CHECK!
  • 配列は名前と通し番号(添え字)が付いた箱のまとまり
  • 配列とfor文を組み合わせて使うと各配列要素に対する処理を実行することができる
  • 配列とfor文を使用するとコマンド実行処理の記述を簡素化することができる

この記事では別の記事で説明しているテクニックを理解していることを前提にしている部分もあります。よくわからない点があった場合は以下に記載している記事リストをチェックしてみてください。


Tera Term マクロ関連記事リスト


Amazon で買えるおすすめアイテム(アフィリエイト)

ブログ始めるなら 【アフィリエイトリンク】

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

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

目次