複数のサーバやネットワーク機器に連続して接続させたい場合に役に立つ方法をご紹介します。
タイトルの通りなのですが、CSVファイルを使います。1行に1つづつ接続情報を記載したCSVファイルを使います。ここを読んでいる方の目的はハッキリしていると思いますので、余計な説明は飛ばして本題に入りましょう。
タップできる目次
CSVファイルの処理方法
今回は各レコードがカンマ(,)で区切られたフィールドを持つファイル形式を想定しています。別の文字でも構いませんが、カンマが一番無難だと思います。TeraTermマクロでフィールドを分割するためには strsplit コマンドを使います。
strsplit レコード セパレータ
レコードはCSVファイルから読み込んだ1行です。セパレータはカンマとなります。このコマンドを実行すると各フィールドの値がシステム変数groupmatchstr1 〜groupmatchstr9に格納されます。変数名から判りますが、フィールド数は9個までに限定されます。
たとえば次のようなレコードを想定します。
a,b,c
このレコードを処理するためには次のようにします。ファイルから読み込んで変数recordに格納しているものとします。
strsplit record ','
この結果、groupmatchstr1には「a」、groupmatchstr2には「b」、groupmatchstr3には「c」が格納されます。
CSVファイルを使ったサンプルマクロ
では少し実用的な例を紹介します。次のようなCSVファイルを用意します。最初のフィールドが接続先のIPアドレス、次がユーザー名、最後がパスワードです。ファイル名はsample.csvとしました。
192.168.2.1,taro,taropasswd 192.168.2.2,hanako,hanakopasswd
このCSVファイルを使ってsshログインするTeraTermマクロを次のように書いてみました。
csvfile = 'sample.csv' separator = ',' ; 読み取り専用でCSVファイルを開く fileopen fh csvfile 0 0 while 1 filereadln fh buf if result then break endif strsplit buf separator ip = groupmatchstr1 user = groupmatchstr2 passwd = groupmatchstr3 sprintf2 conbuf '%s /ssh /auth=password /user=%s /passwd=%s' ip user passwd connect conbuf ; 何か処理をする pause 1 sendln 'exit' endwhile fileclose fh end
さて、このマクロは最初の1回は成功しますが2回目は失敗します。何故か?それは完全に接続が切れる前に次のconnectを実行してしまうためです。
連続してconnectする方法
方法としてはふたつあります。
- 接続が切れるまで待つ
- 強制的に切断する
接続が切れるまで待つ方法
汎用性があるのは最初の「接続が切れるまで待つ」です。この方法はtestlinkで接続状況を調べて、接続している間は待機します。次のように書きます。
do ; 10ミリ秒待機 mpause 10 ; 接続状況を調べる testlink loop while result == 2 ; 接続している間ループする
強制的に切断する方法
unlinkコマンドを使うことにより、強制的に切断することができます。ただし、切断時にウィンドウが閉じるようにTeraTermの設定をおこなっている必要があります。
設定(s) – TCP/IPをクリックします。「自動的にウィンドウを閉じる」にチェックが入っていることを確認します。
この設定が入っていればunlinkの一行で切断が済み、次のconnectを実行することができます。
CSVファイルを使ったsshログインサンプルマクロ
切断が切れるまで待つバージョン
csvfile = 'sample.csv' separator = ',' ; 読み取り専用でCSVファイルを開く fileopen fh csvfile 0 0 while 1 filereadln fh buf if result then break endif strsplit buf separator ip = groupmatchstr1 user = groupmatchstr2 passwd = groupmatchstr3 sprintf2 conbuf '%s /ssh /auth=password /user=%s /passwd=%s' ip user passwd connect conbuf ; 何か処理をする pause 3 sendln 'exit' do mpause 10 testlink loop while result == 2 endwhile fileclose fh end
強制的に切断するバージョン
csvfile = 'sample.csv' separator = ',' ; 読み取り専用でCSVファイルを開く fileopen fh csvfile 0 0 while 1 filereadln fh buf if result then break endif strsplit buf separator ip = groupmatchstr1 user = groupmatchstr2 passwd = groupmatchstr3 sprintf2 conbuf '%s /ssh /auth=password /user=%s /passwd=%s' ip user passwd connect conbuf ; 何か処理をする pause 3 sendln 'exit' unlink endwhile fileclose fh end