Linux SSH

マクロの作り方(改変)


マクロの改変

まずは考え方に慣れるために、サンプルの改変を行います。

ここでは、平田豊さんが用意されている ssh2login.ttl を改変させていただきます。

このサンプルマクロは Tera Term をインストールしたフォルダを開くと、あります。
これをメモ帳等のテキストエディタで開くと、以下の記載があります。

C:\Program Files (x86)\teraterm\ssh2login.ttl
; sample macro of Tera Term
;
; File: ssh2login.ttl
; Description: auto login with SSH2 protocol
; Environment: generic
; Update: 2004/12/4
; Author: Yutaka Hirata

username = 'nike'
hostname = '192.168.1.3'

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

msg = 'Enter password for user '
strconcat msg username
passwordbox msg 'Get password'

msg = hostname
strconcat msg ':22 /ssh /auth=password /user='
strconcat msg username
strconcat msg ' /passwd='
strconcat msg inputstr

connect msg

意味は、次の通りです。

C:\Program Files (x86)\teraterm\ssh2login.ttl
[コメントを指定する文字 ; を利用して、マクロの情報を記載する]
; sample macro of Tera Term
;
; File: ssh2login.ttl
; Description: auto login with SSH2 protocol
; Environment: generic
; Update: 2004/12/4
; Author: Yutaka Hirata

[変数 username へ、文字列 'nike' を代入する]
['~' や "~" で括られていない文字は、変数を意味する]
['~' や "~" で括られた文字や数字は、文字列を意味する]
username = 'nike'
[変数 hostname へ '192.168.1.3' を代入する]
hostname = '192.168.1.3'

[コメントを指定する文字 ; を利用して、段落を示す]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[変数 msg へ 'Enter password for user ' を代入する]
msg = 'Enter password for user '
[strconcat を使って、変数 msg に 'nike' を連結し、内容を 'Enter password for user nike' にする]
strconcat msg username
[passwordbox を使って、'nike' のパスワード入力ダイアログボックスを出力する]
[入力された文字列は、システム変数 inputstr に代入される]
passwordbox msg 'Get password'

[変数 msg へ hostname の内容 '192.168.1.3' を代入する。変数 msg の元の情報は上書きされて消える]
msg = hostname
[strconcat を使って、変数 msg に次々と情報を連結する]
strconcat msg ':22 /ssh /auth=password /user='
strconcat msg username
strconcat msg ' /passwd='
strconcat msg inputstr
[最終的に msg は '192.168.1.3:22 /ssh /auth=password /user=nike /passwd=***' となっている]

[connect に、変数 msg の内容を渡してホストへ接続する]
connect msg

これを改変して利用するため ss2login_kai.ttl として別名保存してください。

なお、便宜上、上記のマクロファイルに対する説明で 代入 という単語を利用しています。
これは、変数が数学における x = 1 と同じような使い方をするためです。

ただし、当サイトの他の記事では基本として 格納 という単語を利用しているためご留意ください。

コメント編集

まずは、コメントを適切に改変します。
上記説明のとおり、記号 ; から行末までは、コメントとして扱われ、マクロの実行に影響を与えません。

コメントですから実行内容に変化はありませんが、他の人が読んだときに理解の助けになります。

編集対象ファイル:C:\Program Files (x86)\teraterm\ssh2login_kai.ttl
; ssh2 login macro of Tera Term
;
; File: ssh2login_kai.ttl
; Description: auto login with SSH2 protocol
; Environment: generic
; Update: 2019/6/4
; Author: jimba
コメントは、マクロを作成する人が適宜書き換える、もしくは書き加えるようにしてください。

inputbox の利用

次に、文字列を入力するためのダイアログボックスを開ける inputbox を使って、ユーザ名を入力できるようにします。
出力されたダイアログボックスへ入力した内容は、システム変数 inputstr に代入されています。

Tera Term 言語のコマンド inputbox の詳細は inputbox を参照してください。

なお inputbox は、オプションに入力メッセージとタイトルが必須項目です。
いずれも文字列を与える必要があります。
inputbox 'ユーザ名を入力してください' 'アカウント入力'
上述のとおり、文字列は、クォーテーション ' またはダブルクォーテーション " で括ります。
括らない場合は、変数として扱われます。

上述のとおり inputbox を実行して入力された内容は、システム変数 inputstr に入ります。
inputstr を利用するコマンドを実行するたびに、内容は上書きされます。

inputstr は他のコマンドでも利用されるので、他の内容が入る前に別な変数へ入れておきます。

編集対象ファイル:C:\Program Files (x86)\teraterm\ssh2login_kai.ttl
inputbox 'ユーザ名を入力してください' 'アカウント入力'
username = inputstr

sprintf2 の利用

それから、ホスト名も inputbox を使って入力させようかと思うのですが、メッセージ部分をせっかくですから sprintf2 を使って変数指定してみます。

sprintf2 は、クォーテーションで括った文字列のなかに %s で指定して、その次のパラメータで文字列を指定できます。
sprintf2 コマンドの詳細は sprintf2 を参照してください。

編集対象ファイル:C:\Program Files (x86)\teraterm\ssh2login_kai.ttl
sprintf2 msg "%s でアクセスするホスト名を入力してください。" username
inputbox msg 'ホスト名入力'
hostname = inputstr
上記指定の意味としては、sprintf2 で生成した文字列型変数 msg を利用して、inputbox の第1パラメータに指定しています。
(第2パラメータは、シングルクォーテーションで括った文字列です。どちらでも指定可能です)
また、今回の inputbox 実行で上書きされた inputstr の内容を、文字列型変数 hostname に代入しています。

このような仕様なので、passwordbox に使っている msg も、以下の様に指定できます。

編集対象ファイル:C:\Program Files (x86)\teraterm\ssh2login_kai.ttl
sprintf2 msg "Enter password for user %s" username
passwordbox msg 'Get password'

passwordbox コマンドも、入力した文字列(パスワード)はシステム変数 inputstr に格納されます。
ですが、次に sprintf2 を利用して別な文字列型変数へ格納する予定なので、退避をしません。

ちなみに、数字を指定する場合は %d を使います。
%s は string (文字列)
%d は decimal (10進数)
と覚えると、応用が利くようになります。

本題に戻ります。

どうせなら、ごちゃごちゃと strconcat で書かれている部分を sprintf2 で書き直してみましょう。

編集対象ファイル:C:\Program Files (x86)\teraterm\ssh2login_kai.ttl
sprintf2 msg "%s:22 /ssh /auth=password /user=%s /passwd=%s" hostname username inputstr
はい、1行になりました。

最後に connect msg ですが、文字列型変数の名前などは流用しているので、これに手を加えられる部分がありません。
なので、そのまま利用します。

編集対象ファイル:C:\Program Files (x86)\teraterm\ssh2login_kai.ttl
connect msg

まとめ

上記の編集内容をまとめます。

C:\Program Files (x86)\teraterm\ssh2login_kai.ttl
; ssh2 login macro of Tera Term
;
; File: ssh2login_kai.ttl
; Description: auto login with SSH2 protocol
; Environment: generic
; Update: 2019/6/4
; Author: jimba

inputbox 'ユーザ名を入力してください' 'アカウント入力'
username = inputstr

sprintf2 msg "%s でアクセスするホスト名を入力してください。" username
inputbox msg 'ホスト名入力'
hostname = inputstr

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

sprintf2 msg "Enter password for user %s" username
passwordbox msg 'Get password'

sprintf2 msg "%s:22 /ssh /auth=password /user=%s /passwd=%s" hostname username inputstr

connect msg
ずいぶんとさっぱりしました。

このように、Tera Term マクロは、変数やコマンド、コマンドのオプション等といった 文字列(ワード) で構成されています。
基本的には、キーボードからすべての文字を入力しなければなりません*1

*1 : 補完機能等を備えたマクロエディタ等も存在しますが、最終的に作成するものはテキストファイルです。

注意喚起

実のところ、Tera Term 起動や connect コマンドの利用時、パスワードは毎回手で入力することが望ましいです。
たとえば Tera Term でホストへログインしたあと、コマンドプロンプトで以下を実行してみましょう。

上記の例でいうと /passwd= に続いて inputstr が平文で出力されます。
command prompto> wmic process where "name = \"ttermpro.exe\"" get name,commandline
これは Windows 側の仕様なので、回避するなら /passwd オプションを使用しないことが求められます。

改変に慣れるための例題

  • 変数名 msg を msg 以外に変更して動作を確認してみましょう。
  • ポート番号を入力できるように改変してみましょう。