本サイトはプロモーションを含みます。

CSVファイルを使ってTera Termマクロにパラメータを渡す方法

複数のサーバやネットワーク機器に連続して接続させたい場合に役に立つ方法をご紹介します。

タイトルの通りなのですが、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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

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