Windows/TeraTermマクロでログイン、画面色とサイズ変更

TeraTermマクロって便利ですよね(2017-03-03、追記:2020-01-04)


特に今回の課題だった
画面の「背景の色」は設定ファイルを分けるのが一般的なようですが、
以下は設定とマクロを1ファイルにまとめたい偏屈(It's me.)向けの例です。


ログインして、背景色変えて、画面サイズも変えるマクロ

以下をテキストにコピペして、変数は書き換えて、
拡張子を「.ttl」に変更して、
ttpmacro.exeで実行します。

username2 への切り替えは要らなければ、後半は削除すればOK。

;
; username1 でログインして、username2 へ切り替える(su -)までのマクロ
; 背景色だけ、デフォルト設定を上書きする
;
;--- ホスト名、ID、パス、ファイルの場所を設定する -------------------
;  各変数を自環境に合わせて変更してください。
;  username2, prompt_user2 はログイン後に su で切り替わる場合です。
;  tempfile は一時作業用ファイルなので適当な名前で良いです。
hostname = '127.0.0.1'
username1 = 'loginuser'
username2 = 'root'
prompt_user1 = '$ '
prompt_user2 = '# '
default_ini = 'C:\Program Files (x86)\teraterm\TERATERM.INI'
tempfile =  'my_teraterm_tmp_file.ini'

; 文字の RGB、背景の RGB の順。
;   以下だと文字白(255,255,255)、背景青(0,0,55)
VTColor='255,255,255,0,0,55'

; 画面のサイズ。Yが縦軸、Xが横軸(文字数)です。
screen_y=30
screen_x=100

;--- デフォルト設定を複製、自分用設定で上書きする -------------------
getdir temp_ini
strconcat temp_ini tempfile

fileopen fdef default_ini 0 1
if result != 0 then
   messagebox "can not open default init" "open error"
   exit
endif
;filedelete temp_ini
fileopen ftmp temp_ini 0
if result != 0 then
   messagebox "can not open temp file" "open error"
   exit
endif

while 1
    hit=0
    filereadln fdef line
    if result=1  break
    strsplit line '=' 9
  
    ; 画面の背景色を変える。ほんとは Bold/Blink/URL も変えると良い。
    strcompare groupmatchstr1 "VTColor"
    if result=0 then
       string = 'VTColor='
       strconcat string VTColor
       filewriteln ftmp string
       hit = 1
    endif

    ; ほかにも変える場合は、こんな感じ
    strcompare groupmatchstr1 "MouseCursor"
    if result=0 then
       filewriteln ftmp "MouseCursor=hand"
    endif
    
    if hit=0 then
       filewriteln ftmp line
    endif
endwhile

fileclose fdef
fileclose ftmp

;---サーバへ接続---------------------
string = hostname
strconcat string ' /ssh /2 /auth=password /user='
strconcat string username1
strconcat string ' /ask4passwd'
strconcat string ' /F='
strconcat string temp_ini

connect string
filedelete temp_ini

;---ログイン成功後、画面サイズを変える-----------------------
wait prompt_user1

sprintf #$1b"[8;%d;%dt" screen_y screen_x
dispstr inputstr
 
;---ここからはおまけ。 su で username2 へ-----------------------
string = "export LANG=C && su - "
strconcat string username2
sendln string

wait "Password: "
passwordbox username2 'Enter:'
sendln inputstr

;---ユーザ変更成功後、任意のコマンド実行------------
wait prompt_user2

;以上です。
;あとは、好きなコマンドがあれば実行してください。
sendln 'yes  | while read Iam; do echo yes; done | head -5'
wait prompt_user2
sendln '# ... here we go!'

;おわり

やっぱり案の定、長いマクロになっちゃいましたが、
一回書けば、あとでどうとでも応用できるのがマクロの素敵なところです。

以下、余談です。

マクロの作成例

TeraTermのヘルプファイルで、
TTLコマンドリファレンスに様々な作成例が書いてあります。
ログインだと、connect の項目を見ると基本形が分かります。

dispstrとか今回初めて使ったのですが、
これも「徐々に画面のサイズを変える例」が書いてあって分かり易かったです。

このマクロの概要

今回のマクロをふわっと説明すると、
TeraTermの設定ファイルを connetct 実行時に読み込んでいます(例ではtemp_ini)。
このメモの最初に書いた「設定ファイルを分ける」というのは、
自分でTeraTerm作業中に使った・更新した設定を「[設定]-[設定の保存]」で残しておいて、
あとはマクロ内のconnect時に読み込むとか、手動で読み込む([設定]-[設定の読み込み])とかするイメージです。
それがわざわざ、fileopenやらwhileやら、ややこしいことになっている理由は
遊び心です設定ファイルとマクロの2つを持ちまわるのが面倒ならば、
設定ファイル自体をマクロの実行直前に作ってしまえばいいじゃない、
という事情からです。

設定をデフォルトから変えたい場合(今回のVTColor)は上書きして、
設定ファイル上には残らない情報(ウィンドウサイズ)は、
マクロの方で送信すれば良いかと。

あとは
コマンドプロンプトを待つところ(例では wait prompt_user1 など)は
上手くいかないなら、いっそシェル変数 PS1(詳細はman sh 参照)
を「$」とか「#」とか扱いやすいやつに変更してから waitすれば楽かと。
(もし、~/.bashrc なり ~/.cshrcなりのシェル設定で変える、のができない環境なら
マクロ内で適当な秒数 pauseしてから sendlnでPS1を上書きする、とか?)
それに関連して、「export LANG=C」しているのも同じ理由で
「パスワード:」みたいな日本語表記を避けて確実に「Password:」でwaitしたかったからです。

ウィンドウサイズを変える話(制御シーケンス)

ウィンドウサイズを変える例の補足をすると、
この sprintf & dispstr の部分は制御シーケンスを飛ばしています。*1
サーバに 「ESC(=文字コード0x1b) + コマンド」 を飛ばすことで特殊な命令を実行するやつです。

これはこれで話が長くなるので、別途メモしますが、
使ってみる例としてはechoやprintfコマンドで「printf '\033[31mTEST\033[m\n'」のように赤い文字が表示できます。(033は8進数のESC)
TeraTermのログで(あるいはscriptコマンドで)、topやviの出力を記録すると混沌としてきますが、
「バイナリ(R)」オプションつきで出力すると、制御シーケンスが表示されて何が起こっているのかを追うことができると思います。

あとは、みなさんウィンドウの座標の話とかでもWeb検索しているので...

いつも決まった作業をするために複数のTeraTermを並べるとかなら、
マクロで窓の大きさと位置とログイン時のコマンドを入れておけば楽になる、とか

...その辺を追記しようと思ったのですが、TeraTermのヘルプにあったのでそちらをどうぞ [smile]
例として [MACROヘルプ]-[TTLコマンドリファレンス]-[通信コマンド]-[dispstr] の項、
あるいはキーワード dispstrで探せば早いかと。
ウィンドウのサイズやら位置やらを扱う「対応制御シーケンス」は DECSLPPですね。

パスワード保存は避けましょう

どういった作業環境であるか、条件によるのですが、
setpassword 等を使う場合は十分に気を付けましょう。
そのPCやら暗号化ファイルやら、覗き見や盗難紛失しないとは限らないので。
(ログイン失敗ならば、連続すると遅延やロックをかけられるけれど、
 ファイルならば好きなだけチャレンジできる。秒間に億万回とか、破るまで延々と)

TeraTermに限らず、パスワードは手入力で我慢することも一考しましょう。
特に趣味では無く、業務で使う場合は、
事故った時に責任問題になってしまうので・・・*2



*1 詳細はTeraTermのヘルプ「対応制御シーケンス」の項、DECSLPPを参照
*2 ・・・というのは、暗号化という言葉を過信しないようにしましょう、と。 IDとパスワードのセット、そのファイルのアクセス権限は制限できているのか、それらを Encrypt と Decrypt するTeraTerm はオープンソースなのは知っているのか・・・いや、勿論ファイル盗られたらどんな暗号だって(強度が違うだけで)全てアウトなんですが・・・とにかく、どう使えば安全なのかは使用者次第です。