マクロの作り方

はてブ数 2023/01/12 20:15 Macro::macro 作成
マクロを作ろうと思っても、どういう作り方をすればいいのか、環境の勉強から始めるのは大変な労力が必要です。
あとできちんと押さえておいた方がいいのは確かなのですが、学習とは真似から入るのが効率が良いと昔から決まっています。

既存流用

すでに提供されているマクロを流用する方法で新しいマクロを作るところから入りたいと思います。

次のリンクを参照してください。

Tera Term マクロとは

はてブ数 2024/03/26 18:31 Macro::macro 作成

Tera Term マクロとは

マクロ機能とは、別に用意されたテキストファイルに書かれたコマンド等を、上から順に 1 行ずつ解釈し、実行し、判断し、逐次進めていくタイプのインタプリタとも呼ばれるプログラム実行機能を指しますが、特に Tera Term に特化したものが Tera Term マクロです。

Tera Term 自体がネットワーク接続に用いるプログラムですが、その接続先等へ処理を追加したいときに便利なのがマクロ機能ですね。
Tera Term マクロファイルとは、Tera Term に行わせたいコマンドをそのままテキストファイルに記述したものです。
マクロファイルを指してマクロと呼ぶことも往々にしてあります。

ただ、文字列であるコマンドを逐一読み込んで処理を行うというのは、コンピュータにとって比較的コストの高い処理です。
コンピュータを使う人が、自分に使いやすいように少しの手間をかけて、多くの手間を省くような使い方をするのがマクロだと思います。

コマンドとは

Tera Term に限りませんが、実行させたい処理を小さく切り出したプログラムのことをコマンドと言っているような気がします。
直訳すると 命令 になりますが、コンピュータに行わせたい処理をひとまとめにしたプログラムと呼んだ方がしっくりきます。

たとえば、ネットワーク上のサーバに繋がるかどうかを確認するためのコマンドに ping がありますが、www.google.co.jp に ping を打つ命令……というよりは、ping での疎通確認処理と言った方がしっくりきます。

ping ならば、どのような応答が返ってくるか想像しやすいと思いますが、それを Tera Term マクロで実行させようとしたとき、ping コマンドは OS が管理しているので、OS への処理を行わせる exec というコマンドが必要になってきます。

ping コマンドは、相手から応答があったら戻り値が 0 で、無かったら 1 という挙動を示します。
この戻り値をみて、次にどう処理するのか……が、プログラムとしての腕の見せ所ですね。
たとえば、、、
・そのあとの処理を全部取りやめる?
・繋がるまで何回か繰り返す?
・それでも接続するか問い合わせる?
いずれも、ネットワーク環境によっては選ぶ可能性のある選択肢です。

2019/06/11(火)Tera Term ログイン自動化での注意点

Tera Term は便利なツールですが、使い方を誤ると大変危険なものになります。

危険な使い方について、なぜ危険なのかを解説しつつ、どういうタイミングで使えばいいのかを解説します。


結論から

パスワードの入力は、横着せずに毎回入力しましょう。
それが、たぶん一番安全です。

きっと一番なのは使わないことなんでしょうが…このサイトの意味がないですし、そもそも便利なツールでも「使いどころに注意してね」というスタンスなので、自己責任でお願いいたします。

要注意

使いどころに注意を要するものです。

/passwd オプション

コマンドラインでも、マクロの connect でも使える、オートログインに必須なスゴイやつですが、じつはオプション指定というのは OS 側で平文で管理されてます。

Tera Term の利用時、パスワードは毎回手で入力することが望ましいです。
たとえば Tera Term のログインマクロでホストへログインしたあと、コマンドプロンプトで以下を実行してみましょう。
command prompto> wmic process where "name = \"ttermpro.exe\"" get name,commandline
あなたの環境では、どう表示されたでしょうか。
私の環境(Windows 10 Pro)では、Tera Term で接続しているホスト名、ポート番号、アカウント、パスワード、全部表示されてしまいました。

一応、回避策はあるようです。
connect コマンドに対する既存の接続オプションの変数を connect_option と仮定して、次のように 2 ステップ踏むようにすると、Windows 側に表示されなくなりました。

sprintf2 connect_option "%s:port /auth=password /user=%s /passwd=%s" hostname username password

; launch Tera Term
connect '/DS'

; connect to server
connect connect_option

ただ、サンプルのログインマクロでは、このような段階を踏んだアクセス方法は記載されておらず、利用している人は少ないのではないかと個人的に思っています。


これくらい軽い動作でアカウント情報を出力できるなら、AD とかに仕込めたらアカウント抽出が捗りますね。
Tera Term ログインからでさえ省力化するなら、アクセス管理サーバがあってもきっと公開鍵を大量に配布して ssh もパスワードなしでログインしていることでしょう(憶測)。
そうでなくても、passwordbox コマンドでパスワードを暗号化したファイルをローカルに置いているに違いない!(妄想)

冗談はともかく、オプションを表示させるのは Windows 側の仕様なので、適切に回避するしかなさそうです。

passwordbox コマンド

こちらもオートログインでは非常に重要なコマンドですね。
入力されたパスワードを暗号化して、ファイルへ保存してくれます。
もちろん、次回の利用では復号化を行ってくれます。

passwordbox で作成したファイルのパスは、ご存知ですか?
また、それをテキストエディタで参照することができるのもご存知でしょうか。


ここで唐突に、某所で公開されていたソースコードを貼り付けます。
wfile =    'パスワード解析結果.txt'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; ファイル定義
:FileInput
inputbox 'パスワード DAT のパスを入力してください。' 'Path input'
pwdat = inputstr

strlen pwdat
if result = 0 then
	goto FileInput
endif

; ファイルの存在確認
filesearch pwdat
if result = 0 then
	sprintf2 msg 'ファイル %s がありません\n終了します' pwdat
	strspecial msg
	messagebox msg 'Error'
	exit
endif

; Passowrd file Open (ファイルハンドラ:fhPWDAT 読み取り専用)
fileopen fhPWDAT pwdat 0 1

; Write file open (ファイルハンドラ:fhWrDat)
fileopen fhWrDat wfile 0 0

; 上から順に変数へ格納
while 1
	filereadln fhPWDAT line
	if result = 1 then
		break
	endif

	;; 解析開始
	strscan line '='
	if result = 0 then
		; [定義部分]
		strscan line '['
		if result then
			pLpw = line
			strtrim pLpw '['
			strscan pLpw ']'
			if result then
				strtrim pLpw ']'
			endif
		endif
		filewriteln fhWrDat line
	else
		; パスワード識別子
		strsplit line '='
		PassName = groupmatchstr1 

		getpassword pwdat PassName pLpw

		sprintf2 msg '%s=%s' PassName pLpw
		filewriteln fhWrDat msg
	endif
endwhile

; File Clese
fileclose fhWrDat
fileclose fhPWDAT

上記のソースをコピペ後、「pw解除.ttl」等の適当な名前で、保存します。
ソースをオープンしているので、妙なコードが書かれていないか、ご自身で確認してください。

pw解除.ttl を実行しましょう。
パスワード解除


先ほど参照した passwordbox で作成したファイル 「.dat」 を、フルパスで指定してあげます。

すると、マクロが置いてあるフォルダに「パスワード解析結果.txt」というテキストファイルが作成されるので、開きます。

パスワードが復号化できたことを確認します。


…つまり、いくら暗号化されているとはいえ、ファイルが流出してしまえば解読は1瞬です。
メモにアカウントを書いているのと、あんまり変わりません。

passwordbox を使う場合は、くれぐれもファイルの流出にご注意ください。

対策としては、暗号化パスワードのファイルを暗号化アーカイブで保存しておくことでしょうか。
必要に応じて解凍→削除を行えば、それなりにパスワードを保護できるでしょう。

コマンドラインでファイルを暗号化できるアーカイバを導入して exec で指定することも一考の余地はありそうです。

なお、このブログは Tera Term がメインなので、他のターミナルエミュレータのことは分かりません。
繰り返しますが、スタンスとしては「使いどころに注意してね」と。