2017年7月2日日曜日

リストから複数機器のログを取得するTeratermマクロ

ネットワーク機器はコマンドでログを取得するのが一般的と思います。

しかし、CiscoやJuniperなど、複数のメーカが混じっていたり、
作業の都度、複数機器に手動でログインしてコマンドを実行するのは、
大変手間が掛かります。

よって、ネットワーク環境に応じたTeratermマクロを、
作成・運用しているところも多いと思います。

どなたかが似たようなものを公開しているかと思いましたが、
以下機能のものは見つけられませんでしたので公開します。

■機能
・複数機器を一度にログ取得可能
・機器ごとに実行コマンドを定義可能
・機器ごとにアカウント、パスワードを定義可能
・機器ごとにプロンプトを定義可能
・機器ごとにSSH / Telnetを定義可能
・機器ごとにenableパスワードの有無を吸収可能
・ログファイルの格納先をマクロ実行時に指定できる
・ログファイル名にホスト名と日付が付与される
・ログイン先リストファイルは部分的にコメントアウトが可能
・ログインできない機器があってもマクロが停止しない

■説明
・マクロは以下の①~③の3点を全て同じフォルダに格納してください。
 ①Teratermマクロ
 ②ログイン先リストファイル
 ③コマンドリストファイル

・事前にTeratermのTCP/IP設定で、
「自動的にウインドウを閉じる」をOFFにしてください。

・ ログイン先リストファイルは、以下の特徴があります。
 - 環境に応じて変更してください。
 - 先頭に #  がある機器は処理がスキップ(コメントアウト)
 - enableパスワードが空白の機器は特権モードへの移行処理がスキップ
 - コマンドリスト列のファイルに列挙されたコマンドを取得する

・ コマンドリストファイル
 - Ciscoは「ter len 0」、Junosは「 | no-more」などを含めてください。

・ローカル環境で動作は確認していますが、自己責任でご利用ください。



■マクロ
①Teratermマクロ
 (この下の行からを拡張子 .ttl として保存してください。)

;##########################################
;設定
;##########################################

;ログ保存先の親フォルダ
logDir = 'C:\work\'

;ログイン先リストファイル名
listFile = 'list.csv'

;エラーログファイル名
errorFile = 'error.txt'

;リストファイル内のコメントアウト文字
commentMark = '#'

;SSH/Telnet接続時のタイムアウト(秒)
accessTimeout = '5'

;ログ取得時のタイムアウト(秒)
logTimeout = 120

;##########################################
;実行処理
;##########################################

;エラー数の初期化
errorCounter = 0

call MAKEDIRECTORY
call OPENLISTFILE
call MAIN
call CLOSELISTFILE
call ENDPROCESS
end

;##########################################
;サブルーチン
;##########################################

;---------------------------------------------------------
;フォルダ作成
;---------------------------------------------------------

:MAKEDIRECTORY

  inputbox 'ログ格納フォルダ名を入力してください:' ''

  ;空入力だったら終了
  strcompare inputstr ''
  if result = 0 then
    end
  endif

  mkdirName = inputstr

  ;フォルダ作成コマンド生成
  mkdir = 'cmd /c md '
  strconcat mkdir logDir
  strconcat mkdir mkdirName

  exec mkdir
  pause 1
return

;---------------------------------------------------------
;ループ処理
;---------------------------------------------------------
:MAIN

  ;ループ終了判定フラグ
  mainLoopEnd = 1

  while mainLoopEnd
    comment = 0
    timeoutChk = 0
    filereadln hosts line

    ;ログイン先リストファイルがEOFでなければ、ループ終了判定フラグをクリア
    if result then
      mainLoopEnd = 0
    endif

    if mainLoopEnd <> 0 then
      call GETPARAM
      ;コメントアウトでなければログイン処理へ
      if comment = 0 then
        call LOGIN
        if timeoutChk = 0 then
          log_1 = mkdirName
          call MAKELOGFILE
          call GETLOG
          call LOGOUT
        else
          call WRITEERROR
          call CONNECTTIMEOUT
        endif
      endif
    endif
  endwhile
return

;---------------------------------------------------------
;ログイン先リストファイルからパラメータ取得
;---------------------------------------------------------

:GETPARAM

  ;コメントアウトチェック
  strcopy line 1 1 commentOut
  strcompare commentOut commentMark

  ;一致したらループ処理へ戻る
  if result = 0 then
    comment = 1
      return
  endif

  ;ホスト名取得
  strscan line ','
  column = result-1
  strcopy line 1 column hostname
  strlen line
  column = column+2
  strcopy line column result line

  ;IPアドレス取得
  strscan line ','
  column = result-1
  strcopy line 1 column ipAddress
  strlen line
  column = column+2
  strcopy line column result line

  ;ログインユーザ取得
  strscan line ','
  column = result-1
  strcopy line 1 column user
  strlen line
  column = column+2
  strcopy line column result line

  ;ログインパスワード取得
  strscan line ','
  column = result-1
  strcopy line 1 column passwd
  strlen line
  column = column+2
  strcopy line column result line

  ;ログイン時のプロンプト取得
  strscan line ','
  column = result-1
  strcopy line 1 column promptLogin
  strlen line
  column = column+2
  strcopy line column result line

  ;enableパスワード取得
  strscan line ','
  column = result-1
  strcopy line 1 column enaPasswd
  strlen line
  column = column+2
  strcopy line column result line

  ;ログ取得時のプロンプト取得
  strscan line ','
  column = result-1
  strcopy line 1 column promptInput
  strlen line
  column = column+2
  strcopy line column result line

  ;アクセス方法取得
  strscan line ','
  column = result-1
  strcopy line 1 column access
  strlen line
  column = column+2
  strcopy line column result line

  ;コマンドリスト取得
  cmdList = line

return

;---------------------------------------------------------
;ログイン実行
;---------------------------------------------------------

:LOGIN

  ;接続方法がSSHだったらSSHのTeratermコマンドを生成
  strcompare access 'ssh'
  if result = 0 then

    sshCommand = ipAddress

    strconcat sshCommand ':22 /ssh /2 /auth=password /user='
    strconcat sshCommand user
    strconcat sshCommand ' /passwd='
    strconcat sshCommand passwd
    strconcat sshCommand ' /timeout='
    strconcat sshCommand accessTimeout

    connect sshCommand

  ;そうでなければtelnet
  else

    telnetCommand = ipAddress

    strconcat telnetCommand ':23 /nossh /timeout='
    strconcat telnetCommand accessTimeout

    connect telnetCommand

    ;ログイン時に待ち受ける文字列は必要に応じて追加する
    wait 'Username:'
    sendln user

    wait 'Password:'
    sendln passwd

  endif

  ;ログインアカウント送信後、ログイン時のプロンプトが返ってこなければタイムアウト
  wait promptLogin
  if result = 0 then
    timeoutMessage = '接続タイムアウト'
    timeoutChk = 1
    return
  endif

  ;enableパスワードが空でなければ特権モードにログイン

  strcompare enaPasswd ''
  if result = 1 then
    sendln 'en'
    wait 'Password:'
    sendln enaPasswd
    wait promptInput
  endif

return

;---------------------------------------------------------
;ログファイル作成
;---------------------------------------------------------

:MAKELOGFILE

  ;日付時刻取得
  getdate date
  strcopy date 1 4 datey
  strcopy date 6 2 datem
  strcopy date 9 2 dated

  ;時刻取得
  gettime hhmmss "-%H%M%S"

  logFile = logDir
  strconcat logFile mkdirName
  strconcat logFile '\'
  strconcat logFile hostname

  strconcat logFile '_'
  strconcat logFile datey
  strconcat logFile datem
  strconcat logFile dated

  strconcat logFile hhmmss
 
  strconcat logFile '.txt'

return

;---------------------------------------------------------
;ログ書き込み
;---------------------------------------------------------

:GETLOG

  logopen logFile 0 1
  timeout = logTimeout
  logLoopEnd = 1
  fileopen command cmdList 0
  while logLoopEnd
    comment = 0
    filereadln command line
    if result then
      logLoopEnd = 0
    endif

    ;コメントアウトチェック
    strcopy line 1 1 commentOut
    strcompare commentOut commentMark
    if result = 0 then
      comment = 1
    endif

    if comment = 0 then
      sendln line
      wait promptInput
    endif
  endwhile
  logclose
return

;---------------------------------------------------------
;ログアウト
;---------------------------------------------------------

:LOGOUT
  sendln 'quit'
  wait promptInput
return

;---------------------------------------------------------
;接続タイムアウト
;---------------------------------------------------------

:CONNECTTIMEOUT
  fileopen errorLog logFile 1
  filewrite errorLog hostname
  filewrite errorLog ':'
  filewrite errorLog timeoutMessage
  filewrite errorLog #13#10
  fileclose errorLog

  errorCounter = errorCounter + 1

return

;---------------------------------------------------------
;エラーログファイル生成
;---------------------------------------------------------

:WRITEERROR

  logFile = logDir
  strconcat logFile mkdirName
  strconcat logFile '\'
  strconcat logFile errorFile

return

;---------------------------------------------------------
;ログイン先リストファイルを開く
;---------------------------------------------------------

:OPENLISTFILE

  fileopen hosts listFile 0

return

;---------------------------------------------------------
;ログイン先リストファイルを閉じる
;---------------------------------------------------------

:CLOSELISTFILE

  fileclose hosts

return

;---------------------------------------------------------
;終了処理
;---------------------------------------------------------

:ENDPROCESS

  ;エラーメッセージ
  errorMessage = 'エラー数:'

  int2str str errorCounter
  strconcat errorMessage str
  messagebox errorMessage 'マクロ終了'

return

②ログイン先リストファイル
 (この下の行からをlist.csv として保存してください。)

#ホスト名,IPアドレス,ログインユーザ,ログインパスワード,ログイン時のプロンプト,enableパスワード(不要なら空白),ログ取得時のプロンプト,アクセス方法,コマンドリスト
R1,10.1.1.1,admin,testpw,R1>,enapw,R1#,ssh,cisco1.txt
R2,10.1.1.2,admin,testpw,R2>,enapw,R2#,ssh,cisco2.txt
R3,10.1.1.3,admin,testpw,R3>,enapw,R3#,telnet,cisco1.txt
R4,10.1.1.4,admin,testpw,R4#,,R4#,ssh,cisco2.txt

③コマンドリストファイル
 (この下の行からをcisco1.txt として保存してください。)
ter len 0
show run
show ver