テラターム自動ログインマクロ.ttl


#■テラタームマクロにて自動ログイン
Linux・Unixにこだわらず，テラタームマクロを用いてログインできるプログラムを作成した．
##今回のプログラム内容

* 自動ログイン
* 自動ログ出力
* ログインユーザ名・パスワードを隠せる
* 2回目以降のログインを使い回せる

※Telnet接続限定

##ディレクトリ構造
![1.ディレクトリ構造.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/7d48a6bb-c205-e99b-5389-5d4a7a86c175.jpeg "1.ディレクトリ構造.jpg")

[Qiita](https://github.com/chesscommands/WindowsPrograms/tree/master/teratermLoginMacro20160901 "Qiita")にてプログラムを公開している.
　※このページの一番下にプログラムを貼り付けたが，最新版はQiita先を参照すること．
上記のディレクトリ構造の通りに展開してくれれば使えるようになる．

##別途用意する物
###テラタームそのもの
login20160901.ttlファイルをテラタームマクロで読み込み，実行する必要がある．
![3.マクロファイル読み込み.png](https://qiita-image-store.s3.amazonaws.com/0/82414/05f1db2f-7dd2-1913-f6b6-4de0d4859385.png "3.マクロファイル読み込み.png")

そのとき，テラタームのバージョンは4.74以降が必要になる．
![4.テラタームのバージョン.png](https://qiita-image-store.s3.amazonaws.com/0/82414/387bd4a2-034d-8380-f928-fcac0b61622b.png "4.テラタームのバージョン.png")

###logディレクトリ
ディレクトリがありさえすればいい．
※自動ログ出力ディレクトリ
　ファイル名：年月日時分秒_teraterm.log

###dataディレクトリ
ディレクトリがありさえすればいい．
※ログインユーザ名・パスワードを隠蔽したファイルの格納先
　ファイル名：password.dat

###datディレクトリ
datディレクトリ配下のdatlogin.txtファイルを作成してもらう必要がある．
以下，テキストファイル内容例
![2.datloginテキスト.png](https://qiita-image-store.s3.amazonaws.com/0/82414/70d54121-5e81-a517-8c2d-c97d9f061b1b.png "2.datloginテキスト.png")

1行目：タイトル（1文字目の★記号は必須）
8行目：1行目のタイトルと紐付く（2文字目以降全く同じであること）
9行目：ログイン先のIPアドレス（HOSTSの名前を用いてもOK）
10行目：ログイン先のログイン名を引き出すキー（ログイン名である必要は無い）
11行目：ログイン先のパスワードを引き出すキー（パスワードである必要は無い）
12行目：0固定
13行目：ログイン先の文字コード（1を記入後に文字コードを指定する）
　　　　※文字コードにこだわりが無ければ0だけを記入する（SJISになる）．
　　　　※今回のマクロプログラムはEUC-jp・SJIS・UTF8の3種類に対応している．
注意：datlogin.txtファイルを開いている状態ではマクロが動かないため閉じること．

##利用手順
###1．マクロファイルの読み込み
![5.マクロファイル読み込み.png](https://qiita-image-store.s3.amazonaws.com/0/82414/979fc427-30cc-a934-cbc3-4a56a75382f1.png "5.マクロファイル読み込み.png")

###2．ログインサーバの選択
![6.ログインサーバの選択.png](https://qiita-image-store.s3.amazonaws.com/0/82414/db4ed098-11bd-d4ef-decf-2ba4697c54e8.png "6.ログインサーバの選択.png")
※datlogin.txtファイルの★記号が付いた連続行を読み込む．
マクロ利用ユーザは，そこから先頭の番号（2文字目）をテキストボックスに打ち込み，OKボタンを押下する．

###3．ログインユーザ名の入力
![7.user.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/1032789c-ad6a-2f1b-9c79-c37cfc29976f.jpeg "7.user.jpg")
※datlogin.txtファイルに記入している文字列が表示される（10行目）．

###4．ログインパスワードの入力
![8.pass.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/05e9994d-3f98-d1ce-5d9e-bfde412f88a3.jpeg "8.pass.jpg")
※datlogin.txtファイルに記入している文字列が表示される（11行目）．

###5．ログイン完了
![9.ログイン後の画面.png](https://qiita-image-store.s3.amazonaws.com/0/82414/dc7696f9-7168-05e4-74aa-9f91aa136cf0.png "9.ログイン後の画面.png")
![10.dateコマンド.png](https://qiita-image-store.s3.amazonaws.com/0/82414/f8ac06bf-635c-4a05-3ccd-688b85660053.png "10.dateコマンド.png")

#■作業完了後
##ログの出力
![12.ログ.png](https://qiita-image-store.s3.amazonaws.com/0/82414/99dbe116-a158-6c4f-3c72-890c5ac56f1e.png "12.ログ.png")
logディレクトリ配下にログが出力される．不要であれば削除すること．
※TERATERM.INIファイルに，ログ出力先を記入していない場合に限る．

#■ログイン失敗
![11.err.png](https://qiita-image-store.s3.amazonaws.com/0/82414/79501b22-a9a7-6233-fa55-1cbfcc8be1ae.png "11.err.png")
エラー画面が表示され，テラタームマクロが終了される・・・はず．



#■プログラム
※20160903時点

```teraterm:login20160901.ttl
;***********************************************************************
;
;プログラム名：サーバ一覧からの選択後自動ログイン実施
;機能名　　　：テラタームログインマクロ
;ファイル名　：login20160901.tll
;文字コード　：-
;機能概要　　：サーバにテラタームを用いてログインするときに使用する.
;　　　　　　　一度ログインに成功した場合二度目以降は一覧から選ぶ
;　　　　　　　だけでログインが完了する.
;　　　　　　　ログイン先の文字コードも選択可能
;呼び出し形式：テラタームマクロから呼び出す
;戻り値　　　：キーボードからの入力を受け付ければ正常終了
;　　　　　　　入力を受け付けない場合バグがある.手動でテラタームごと終了すること.そしてマクロを直すか手動でログインし直す.
;
;ディレクトリ構造：
;　　　　　　　テラタームマクロ（本ファイル）.ttl
;　　　　　　　　　|
;　　　　　　　　　|---dat/
;　　　　　　　　　|　　　datlogin.txt　←ログイン用サーバ情報
;　　　　　　　　　|
;　　　　　　　　　|---data/
;　　　　　　　　　|　　　password.dat　←ログイン後に生成される
;　　　　　　　　　|
;　　　　　　　　　|---log/
;　　　　　　　　　　　　 [年月日時分秒]_teraterm.log　←ログイン後に生成される
;
;作成者　　　：20160901　chesscommands
;改版履歴　　：20160901　chesscommands　新規作成　　　　　　　　　R1.0
;　　　　　　：20160903　chesscommands　インデント追加　　　　　　R1.1
;
;***********************************************************************

getdir mcrodir_onDir
; ■ログインサーバを選択する
logintxtname = ''
makepath aaa mcrodir_onDir '¥dat¥datlogin.txt'
filesearch aaa
if 0 = result then
	messagebox mcrodir_onDir 'debug'
	messagebox 'file not' 'exit'
	end
endif
mcrodir_datlogin = mcrodir_onDir
strconcat mcrodir_datlogin '¥dat'
setdir mcrodir_datlogin
fileopen fhandle 'datlogin.txt' 0
if 0 > fhandle then
	messagebox 'file not' 'exit'
	end
endif
show -1
txtTitleline = ''
txtline = ''
:loop
	filereadln fhandle line
	if 1 = result goto fclose
	txtline = line
	code2str starStr 33178
	strmatch txtline starStr
	if 0 < result then
		strconcat txtTitleline txtline
		strconcat txtTitleline #13#10
	endif
goto loop
:fclose
fileclose fhandle
inputbox txtTitleline 'serverSelect'
str2int serverNumber inputstr
if 1 <> result then
	exit
endif
mcrodir_datlogin = mcrodir_onDir
strconcat mcrodir_datlogin '¥dat'
setdir mcrodir_datlogin
fileopen fhandle 'datlogin.txt' 0
if 0 > fhandle then
	messagebox 'file not' 'exit'
	end
endif
txtTitleline = ''
txtline = ''
:loopSecond
	filereadln fhandle line
	if 1 = result goto fclose
	txtline = line
	str2int serverTitleLine txtline
	if serverNumber = serverTitleLine then
		goto loopexit
	endif
goto loopSecond
:loopexit
filereadln fhandle rline
filereadln fhandle uline
filereadln fhandle pline
filereadln fhandle cline
filereadln fhandle eline
fileclose fhandle
mozjiicode = 'sjis'
str2int streline eline
if 1 = result then
	if 1 = streline then
		strlen eline
		if 1 < result then
			strcopy eline 2 result eeline
			strcompare eeline 'EUC-JP'
			if 0 = result then
				mozjiicode = 'EUC'
			endif
			strcompare eeline 'Shift_JIS'
			if 0 = result then
				mozjiicode = 'SJIS'
			endif
			strcompare eeline 'UTF-8'
			if 0 = result then
				mozjiicode = 'UTF8'
			endif
		endif
	endif
	mozjiicode = 'SJIS'
endif
tellnet = ':23 /nossh /T=1 /NOLOG '
strconcat tellnet ' /KR='
strconcat tellnet mozjiicode
strconcat tellnet ' /KT='
strconcat tellnet mozjiicode
connectionserver = rline
strconcat connectionserver tellnet
connect connectionserver
; ■現在のリンク及び接続の状態を確認する
testlink
if 2 <> result then
	messagebox 'link err' 'exit'
	end
endif
showtt -1
; ■その他
enablekeyb 0
timeout = 5
getver version '4.74'
if 0 > result then
	messagebox 'ver old' 'exit'
	goto err_END
endif
goto gotoJump
:err_END
testlink
if 0 <> result then
	closett
endif
end
:gotoJump
; ■ログを記録する
getdate logfileYmHHSlog '%Y%m%d%H%M%S_teraterm.log'
mcrodir_log = mcrodir_onDir
logtxtname = ''
strconcat logtxtname logfileYmHHSlog
strconcat mcrodir_log '¥log'
changedir mcrodir_log
logopen logtxtname 0 0 0 0 9
; ■パスワードファイルを読み込む
mcrodir_datFile = ''
mcrodir_datFile = mcrodir_onDir
strconcat mcrodir_data '¥data'
strconcat mcrodir_datFile mcrodir_data
setdir mcrodir_datFile
UsernamePrompt = 'login:'
UserIDname = 'ユーザ名（'
strconcat UserIDname rline
strconcat UserIDname '）のKey（'
strconcat UserIDname uline
strconcat UserIDname '）'
getpassword 'password.dat' UserIDname Username
PasswordPrompt = 'Password:'
PasswordKey = 'パスワード（'
strconcat PasswordKey rline
strconcat PasswordKey '）のKey（'
strconcat PasswordKey pline
strconcat PasswordKey '）'
getpassword 'password.dat' PasswordKey Password
wait UsernamePrompt
sendln Username
wait PasswordPrompt
sendln Password
settitle txtline
logpause
; ■1行取得
pause 2
sendln
flushrecv
sendln
recvln
waitregex '.*[^%]+.*[%]{1}.*' '.*[^$]+.*[$]{1}.*' '.*[^#]+.*[#]{1}.*' '[^.]*＼$[^.]*' '[^.]*#[^.]*'
prompt = matchstr
if 5 < result then
	messagebox 'err' 'exit'
	goto err_END
endif
if 1 > result then
	messagebox 'err' 'exit'
	goto err_END
endif
sendln
strtrim prompt ''
flushrecv
sendln
wait prompt
if 1 <> result then
	messagebox 'err' 'exit'
	goto err_END
endif
;sendln ' set -o ignoreeof'
;sendln ' tabs -4'
;sendln ' alias hostname="uname -a"'
;sendln ' alias tarview="tar tvf "'
wait prompt
sendln 
wait prompt
logstart
sendln 
wait prompt
clearscreen 1
str2int strcline cline
if 1 = result then
	if 1 = strcline then
		strlen cline
		if 1 < result then
			strcopy cline 2 result ccline
			sendln 'cd 'ccline
			sendln
		endif
	endif
endif
str2int streline eline
if 1 = result then
	if 1 = streline then
		strlen eline
		if 1 < result then
			strcopy eline 2 result eeline
			strcompare eeline 'EUC-JP'
			if 0 = result then
				callmenu 54011
				callmenu 54111
			endif
			strcompare eeline 'Shift_JIS'
			if 0 = result then
				callmenu 54010
				callmenu 54110
			endif
			strcompare eeline 'UTF-8'
			if 0 = result then
				callmenu 54013
				callmenu 54113
			endif
		endif
	endif
	mozjiicode = 'SJIS'
endif
wait prompt
enablekeyb 1
sendln 'date'
showtt 1
```