ネットワーク

TeratermマクロでCSVから複数台へ一括SSHログインする

機器が10台、20台とあると、1台ずつ手作業でログインするのは現実的ではありません。接続先の一覧をCSVに書いておき、Teratermマクロで順番に接続する方法をまとめます。

ファイル構成

macro.ttl
connect.csv

connect.csv の中身

Test-FW,192.168.101.220,test-user,test-password
Test-L3,192.168.101.221,test-user,test-password
Test-SW,192.168.101.222,test-user,test-password

左から「ホスト名, IPアドレス, ユーザ名, パスワード」の順です。

コード

csvfile = 'connect.csv'
separator = ','

getdir Dir
csvfile_path = ''
strconcat csvfile_path Dir
strconcat csvfile_path '\'
strconcat csvfile_path csvfile

; 読み取り専用で開く
fileopen fh csvfile_path 0 1

while 1
  IP = ''
  USER = ''
  PASSWD = ''
  HOSTNAME = ''

  ; 1行読み込む。末尾に達したらループを抜ける
  filereadln fh buf
  if result then
    break
  endif

  ; カンマで分割する
  strsplit buf separator

  HOSTNAME = groupmatchstr1
  IP       = groupmatchstr2
  USER     = groupmatchstr3
  PASSWD   = groupmatchstr4

  ; プロンプトを組み立てる
  prompt_user = ''
  strconcat prompt_user HOSTNAME
  strconcat prompt_user '>'

  prompt_enable = ''
  strconcat prompt_enable HOSTNAME
  strconcat prompt_enable '#'

  ; SSH接続
  sprintf2 conbuf '%s:22 /ssh /auth=password /user=%s /passwd=%s' IP USER PASSWD
  connect conbuf

  ; 接続確認
  testlink
  pause 2
  if result <> 2 then
    sprintf2 errmsg '%s への接続に失敗しました' HOSTNAME
    messagebox errmsg "接続エラー"
    continue
  endif

  ; ここで機器ごとの処理を行う

  ; 切断して次の機器へ
  disconnect 0
  pause 1
endwhile

fileclose fh

strsplitの使い方

strsplit <文字列> <区切り文字>

分割された値は、先頭から groupmatchstr1groupmatchstr2groupmatchstr3... に自動的に格納されます。分割された個数は result に入ります。

strsplit buf ','
; result に 4 が入る
; groupmatchstr1 = Test-FW
; groupmatchstr2 = 192.168.101.220
; groupmatchstr3 = test-user
; groupmatchstr4 = test-password

つまずきポイント

ループの先頭で変数を初期化する。
strconcat は変数の後ろに追加するため、初期化を忘れると2周目のプロンプトが Test-FWTest-L3# のようになります。

CSVの最終行に改行を入れない。
末尾に空行があると、空文字のまま接続を試みてエラーになります。

1台終わるごとに切断する。
disconnect 0 を入れないと、接続したまま次の connect が呼ばれて失敗します。

CSVに列数が足りない行があると止まる。
カンマの数が合っているか確認してください。列数を検証するなら次のように書きます。

strsplit buf separator
if result <> 4 then
  messagebox "CSVの形式が不正です" "エラー"
  continue
endif

パスワードの扱いについて

このCSVにはパスワードが平文で入ります。共有フォルダやバージョン管理には置かないでください。作業が終わったらCSVを削除するか、パスワード欄を空にしておくことをおすすめします。

パスワードを1回だけ手入力して全機器に使い回す構成にすれば、ファイルに残さずに済みます。

passwordbox 'パスワードを入力してください' '一括接続'
PASSWD = inputstr

CSVからはパスワード列を削除し、この PASSWD を使ってください。

関連記事

-ネットワーク