機器が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 <文字列> <区切り文字>
分割された値は、先頭から groupmatchstr1、groupmatchstr2、groupmatchstr3... に自動的に格納されます。分割された個数は 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 を使ってください。