TeraTermマクロの接続方法まとめ

# 本記事で出来ること
TeraTermマクロを使用して機器へのログインを自動化することができます。
* 必要最低限の接続方法＝＞「TeraTermマクロでSSHログイン」
* ホスト名やユーザを選択できるようにする＝＞「TeraTermマクロでSSHログイン」以降の項目  

を参照してください。

# TeraTermマクロでSSHログイン
```:Login.ttl
;########################################################################################
;############################      TeraTermでログインする       ##########################
;########################################################################################

IPADDR = 'xx.xx.xx.xx' ;接続先IPアドレス
USERNAME = 'ユーザ名'
USERPASS = 'ユーザパスワード'
portnum = '22' ;接続ポート

msg = IPADDR 
strconcat msg ':portnum /ssh /auth=password /user='
strconcat msg USERNAME
strconcat msg ' /passwd='
strconcat msg USERPASS
strconcat msg inputstr
connect msg

; 接続判定（接続して10秒以内にプロンプトが表示されない場合もマクロ終了） 
timeout = 10 
wait '#' '$'
if result = 0 then 
  end 
endif

dispstr #$1b"[8;35;150t"  ;ウィンドウサイズを横：35 縦150にする

end ;終了
```

## EC2へSSHログイン
以下部分を注意する
* USERPASSがない
* pemキーを指定する
* 「auth」を「publickey」に変更する
* ログインユーザーはデフォルトでは「ec2-user」
```:EC2_Login.ttl
IPADDR = 'xx.xx.xx.xx' ;接続先IPアドレス
portnum = '22' ;接続ポート
PEMKEY = 'C:\<path>\pemキー名.pem'

msg = IPADDR 
strconcat msg ':portnum /ssh2 /auth=publickey /user=ec2-user'
strconcat msg ' /keyfile='
strconcat msg PEMKEY
connect msg

end ;終了
```

# ホストを選択する
１． ホスト管理テキストを作成
```:host.txt
ホスト名,IPアドレス

(例)
Zabbix,192.168.1.1
Router,192.168.1.2
Swtich,10.1.1.1
```

２．ホストを選択できるようにする
```:Login.ttl
;########################################################################################
;########################        ログインホストを選択する      ############################
;########################################################################################
;ホスト管理テキストのファイル指定
filename = './host.txt'
separator = ',' ;ホスト名とIPをファイルから区別するための基準に「,」を使用

;*****************ホスト名のリスト数を取得する***********************
;ファイルを開く
fileopen fh filename 0

;ファイルの行数＝ホスト数取得
host_amount = 0
while 1
    ; 一行読み込み
    filereadln fh line
    if result=1 then 
          break
    endif
    host_amount = host_amount + 1
endwhile
; ファイルクローズ
fileclose fh


;*****************ホスト名とIPのリストを作成***********************
strdim hostname_list host_amount
strdim ip_list host_amount


;*****************ホスト名とIPリストの値取得***********************
;ファイルを開く
fileopen fh filename 0
;ホスト名とIPのリストをファイルから取得する
i = 0

while 1
    ; 一行読み込み
    filereadln fh line
	if result=1 then 
    	  break
	endif
    ;カンマ「,」で分割する
    strsplit line separator
    
    ;分割した結果をホスト名とIPアドレスのリストに格納する
	hostname_list[i] = groupmatchstr1
	ip_list[i] = groupmatchstr2

	i = i + 1
endwhile
; ファイルクローズ
fileclose fh


;*****************ホスト名を選択する***********************
listbox '--------------ホストを選択してください--------------' 'ホスト選択' hostname_list

;listboxの選択をキャンセルした場合はマクロを終了する
if result=-1 then
	exit 
endif

IPADDR = ip_list[result]     ; 接続先ホストのIPアドレス
```

IPADDRを直書きしていた部分を削除する
```:Login.ttl
;削除行
IPADDR = 'xx.xx.xx.xx' ;接続先IPアドレス
```

# ユーザを選択
ユーザのパスワードを暗号化する。
暗号化するにあたってdatファイルを作成する。
datファイルから、ログイン時にユーザを選択できるようにする
## ユーザのパスワードを暗号化する
１．ユーザパスワード暗号化用の新しいマクロを作成する
```:Make_Pass.ttl
; ユーザ名指定
msg = "ユーザ名を入力してください。"
title = 'パスワードファイル作成のユーザ名指定'

inputbox msg title
username = inputstr


;パスワードファイル指定
passwdfile = 'passwd.dat'    ; パスワード暗号化ファイル

;パスワードファイル作成
getpassword passwdfile username userpasswd  ; パスワード暗号化ファイルからパスワード取得
```

２．作成したMake_Pass.ttlを実行する
ユーザ名とパスワードを記載する

## ユーザを選択できるようにする
```:Login.ttl
;########################################################################################
;#######################      ユーザ名(USERNAME)を選択する   ###############################
;########################################################################################
passwdfile = './passwd.dat'    ; パスワード暗号化ファイル
separator = '='


;*****************ホスト名のリスト数を取得する***********************
;ファイルを開く
fileopen fh passwdfile 0

;ファイルの行数＝ユーザ数取得
user_amount = -1 ;最初の一行は考えないため
while 1
    ; 一行読み込み
    filereadln fh line
	if result=1 then 
    	  break
	endif
	user_amount = user_amount + 1
endwhile
; ファイルクローズ
fileclose fh


;*****************ユーザ名のリストを作成***********************
strdim username_list user_amount


;*****************ホスト名とIPリストの値取得***********************
;ファイルを開く
fileopen fh passwdfile 0

;パスワード暗号化ファイルからユーザ名を取得する
i = -1
while 1
    ; 一行読み込み
    filereadln fh line
	if result=1 then 
    	  break
	endif
	if i<>-1 then
	    strsplit line separator
		username_list[i] = groupmatchstr1
	endif
	i = i + 1
endwhile
; ファイルクローズ
fileclose fh


;*****************ユーザ名を選択する***********************
listbox '--------------ユーザを選択してください--------------' 'ユーザ選択' username_list

;listboxの選択をキャンセルした場合はマクロを終了する
if result=-1 then
	exit 
endif

USERNAME= username_list[result]     ; 接続する際に使用するユーザ名
```

USERNAMEを直書きしていた部分を削除する
```:Login.ttl
;削除行
USERNAME = 'ユーザ名'
```

パスワードを直書きしていた部分を変更する
```:Login.ttl
;変更前
USERPASS = 'ユーザパスワード'

;変更後
getpassword passwdfile USERNAME USERPASS ; パスワード暗号化ファイルからパスワード取得
```

# ログを保存する
## 1. フォルダを指定して保存
特定のフォルダに「yyyymmdd_hhmmss_IPアドレス.log」で保存する
```ter:Login.ttl
;*******************ログファイル名の設定 *******************************
LOGSPATH = 'C:\Users\test\logs\' ;ログ保存先指定 
getdate LOG_NAME '%Y%m%d_%H%M%S_&h.log'
strconcat LOGSPATH LOG_NAME
;*******************END ログファイル名の設定*******************************
```

## 2. 日付「yyyymmdd」ファルダの中に保存
Login.ttlと同じ階層の「logs」フォルダ内の「yyyymmdd」ファルダの中に「yyyymmdd_hhmmss_IPアドレス.log」で保存する
```:階層イメージ
├ Login.tti
├ hostname.txt
├ logs/
    └ yyyymmdd/
    │ 　  └ yyyymmdd_hhmmss_ホスト名(IPアドレス).log
    │
    └ 20220505/
     　   └ 20220505_120030_192.168.1.1.log
```
logsフォルダは既に存在しているとします。
```:Login.ttl
;*******************ログファイル名の設定 *******************************
getdate DATE 'logs\%Y%m%d'
foldersearch DATE  ;yyyymmddフォルダが存在するか判定

;yyyymmddフォルダが存在しなかったら作成する
if result = 0 then
	foldercreate DATE
endif

LOGSPATH = 'C:\Users\test\' ;ログ保存先指定 
strconcat LOGSPATH DATE
getdate LOG_NAME '\%Y%m%d_%H%M%S_&h.log'
strconcat LOGSPATH LOG_NAME
;*******************END ログファイル名の設定*******************************
```

## 【必須】ログを開始する設定を入れる
dispstr #$1b"[8;35;150t"の直後に記載する
```
dispstr #$1b"[8;35;150t"

; ログ取得開始 
logopen LOGSPATH 1 1
```

# ホストとユーザを選択・ログ保存版Login.ttl
```:Login.ttl
;================================================= 
; Filename    : Login.ttl 
; Description : SSH Auto login 
; Author      : Name
; Created     : yyyy/mm/dd 
; modified    : 
;================================================= 

;########################################################################################
;########################        ログインホストを選択する      ############################
;########################################################################################
;ホスト管理テキストのファイル指定
filename = './host.txt'
separator = ',' ;ホスト名とIPをファイルから区別するための基準に「,」を使用

;*****************ホスト名のリスト数を取得する***********************
;ファイルを開く
fileopen fh filename 0

;ファイルの行数＝ホスト数取得
host_amount = 0
while 1
    ; 一行読み込み
    filereadln fh line
    if result=1 then 
          break
    endif
    host_amount = host_amount + 1
endwhile
; ファイルクローズ
fileclose fh


;*****************ホスト名とIPのリストを作成***********************
strdim hostname_list host_amount
strdim ip_list host_amount


;*****************ホスト名とIPリストの値取得***********************
;ファイルを開く
fileopen fh filename 0
;ホスト名とIPのリストをファイルから取得する
i = 0

while 1
    ; 一行読み込み
    filereadln fh line
	if result=1 then 
    	  break
	endif
    ;カンマ「,」で分割する
    strsplit line separator
    
    ;分割した結果をホスト名とIPアドレスのリストに格納する
	hostname_list[i] = groupmatchstr1
	ip_list[i] = groupmatchstr2

	i = i + 1
endwhile
; ファイルクローズ
fileclose fh


;*****************ホスト名を選択する***********************
listbox '--------------ホストを選択してください--------------' 'ホスト選択' hostname_list

;listboxの選択をキャンセルした場合はマクロを終了する
if result=-1 then
	exit 
endif

IPADDR = ip_list[result]     ; 接続先ホストのIPアドレス

;########################################################################################
;#######################      ユーザ名(USERNAME)を選択する   ###############################
;########################################################################################
passwdfile = './passwd.dat'    ; パスワード暗号化ファイル
separator = '='


;*****************ホスト名のリスト数を取得する***********************
;ファイルを開く
fileopen fh passwdfile 0

;ファイルの行数＝ユーザ数取得
user_amount = -1 ;最初の一行は考えないため
while 1
    ; 一行読み込み
    filereadln fh line
	if result=1 then 
    	  break
	endif
	user_amount = user_amount + 1
endwhile
; ファイルクローズ
fileclose fh


;*****************ユーザ名のリストを作成***********************
strdim username_list user_amount


;*****************ホスト名とIPリストの値取得***********************
;ファイルを開く
fileopen fh passwdfile 0

;パスワード暗号化ファイルからユーザ名を取得する
i = -1
while 1
    ; 一行読み込み
    filereadln fh line
	if result=1 then 
    	  break
	endif
	if i<>-1 then
	    strsplit line separator
		username_list[i] = groupmatchstr1
	endif
	i = i + 1
endwhile
; ファイルクローズ
fileclose fh


;*****************ユーザ名を選択する***********************
listbox '--------------ユーザを選択してください--------------' 'ユーザ選択' username_list

;listboxの選択をキャンセルした場合はマクロを終了する
if result=-1 then
	exit 
endif

USERNAME= username_list[result]     ; 接続する際に使用するユーザ名


;########################################################################################
;############################      TeraTermでログインする       ##########################
;########################################################################################
getpassword passwdfile USERNAME USERPASS ; パスワード暗号化ファイルからパスワード取得
portnum = '22' ;接続ポート

;*******************ログファイル名の設定 *******************************
getdate DATE 'logs\%Y%m%d'
foldersearch DATE  ;yyyymmddフォルダが存在するか判定

;yyyymmddフォルダが存在しなかったら作成する
if result = 0 then
	foldercreate DATE
endif

LOGSPATH = 'C:\Users\test\' ;ログ保存先指定 
strconcat LOGSPATH DATE
getdate LOG_NAME '\%Y%m%d_%H%M%S_&h.log'
strconcat LOGSPATH LOG_NAME
;*******************END ログファイル名の設定*******************************

msg = IPADDR 
strconcat msg ':portnum /ssh /auth=password /user='
strconcat msg USERNAME
strconcat msg ' /passwd='
strconcat msg USERPASS
strconcat msg inputstr
connect msg

; 接続判定（接続して10秒以内にプロンプトが表示されない場合もマクロ終了） 
timeout = 10 
wait '#' '$'
if result = 0 then 
  end 
endif

dispstr #$1b"[8;35;150t"  ;ウィンドウサイズを横：35 縦150にする

; ログ取得開始 
logopen LOGSPATH 1 1

end ;終了
```

# ログイン後
```:Login.ttl
wait '文字列が表示されるまで待機'
sendln '文字列を入力する'

(例)
wait '#' '$'   ;複数設定可能　#または$が表示されるまで待機
sendln 'hostname'
```