1. HOME
  2. テックブログ
  3. teratermマクロを使った多機能ssh自動ログインできるマクロを作ってみた

teratermマクロを使った多機能ssh自動ログインできるマクロを作ってみた

2023/09/06 テクノロジー

ssh接続先のサーバーが多々あると、接続情報を確認してサーバーへ接続するのが大変です。。。

今回は、Windowsにて、teratermマクロを使って、自動的にsshでログインするマクロを紹介したいと思います。

今回紹介するマクロは、特徴として以下が挙げられます。

  • サーバー情報はファイル名に記載。 →わかりやすい&編集しやすい!
  • 多段ssh対応。(現状2段まで対応可。)
  • コンソールに表示された結果をログに残すことが可能。
  • ログイン後、好きな定型コマンドを実行可。
      例1: サーバーのOS情報や、CPU、メモリ、ディスク容量などをログイン時に表示
      例2: 好きなaliasの設定等も可能。(わざわざ1サーバーごとに、~/.bashrcとか設定しなくても共通で設定可能。)
      例3: 好きなシェルでログイン可能。(わざわざサーバー個別でシェルを設定しなくてもOK。)

▼構成

teratermマクロを入れるフォルダ/ファイル構成です。

SSH(フォルダ名。なんでも良い。)
 ├サーバー情報を書いたファイル名1.ttl
 ├サーバー情報を書いたファイル名2.ttl
   ・・・
 ├サーバー情報を書いたファイル名n.ttl
 ├zzz_template_00start.inc (共通マクロ本体。名前は何でも良いが、ファイル名順にしたときに一番下にくるように、ファイル名の最初に「zzz」を付けているだけ。)
 ├logs (ログが格納されるフォルダ。最初に手動で作成してください。)
 └Data (SSHの秘密鍵(.keyファイル)や、暗号化されたパスワード(.datファイル)を格納するフォルダ。)

上記構成に従い、logsフォルダと、Dataフォルダを手動で作成してください。

▼準備

●共通マクロ本体

共通マクロ本体のソースを以下のようにテキストで作成します。


再度スクリプト見てみると、、、いろいろ穴がありますが。。。一応簡単にコメントしておきます。

216行目

logopen LOGFULLPATH 0 1 0 1 1

ログの書き込みの仕方を指定できますので、タイムスタンプあり/なし、バイナリ/テキスト、などご自身で好きな設定にしてください。

252行目

sendln "ssh -i ./.ssh/id_rsa " USERNAME "@" HOSTADDR2 "; exit"

多段SSHする際の秘密鍵ファイル名を固定値にしてます。必要に応じて、各々の環境に合わせて修正してください。あと、ここでパスフレーズが必要な場合は、その処理も追記する必要がありますね。。。

323行目

;; Linux自動判定
	OSchoice='U'
	sendln "uname -a"
	wait  "Linux" "FreeBSD" "Solaris" "SunOS"
	;messagebox result "wait"
	if result < 2 Then
		OSchoice='L'
	endif
	if result >= 3 Then
		; Solaris
		OSchoice='S'
	endif

OSの自動判定をしてますが、必要に応じてここも追記してあげてください。

337行目

;; bash 切替
	SHell=0 ; 0:bash, 1:zsh, 2:other
	sendln "echo $SHELL"
	timeout = 5
	wait   "/bin/bash" "/bin/zsh" "/bin/tcsh" "/bin/csh" "/bin/sh"
	If result = 2 Then
		SHell=1
	elseif result >= 3 Then
		SHell=2
	elseif result = 0 Then
		SHell=0
	endif

	; bash try
	If SHell >= 1 Then
		timeout = 5
		sendln "which bash"
		wait   "not found" "/bin/bash"

		If result = 2 Then
			sendln "bash && exit"
			SHell=0 
		endif
	endif

	; zsh try
	If SHell >= 2 Then
		timeout = 5
		sendln "which zsh"
		wait   "not found" "/bin/zsh"
		
		If result = 2 Then
			sendln "zsh;exit"
			SHell=1
		endif
	endif

ここではデフォルトbash、第二候補にzshを指定するようにしてますが、ここもお好みに合わせて設定してみてください。

374行目

;; 共通マクロをインクルード

sendln "export PATH=./:$PATH:/sbin:~/bin"
;;sendln 'alias iconvs="iconv -f SJIS -t UTF-8 "; alias iconve="iconv -f EUC-JP -t UTF-8 "'

strcompare OSchoice 'L'
if result = 0 Then
	;; Linux
	sendln "export LANG=ja_JP.UTF-8;\"
・・・(略)・・・
	sendln "sysctl -a 2>/dev/null|egrep '(hw.model|hw.ncpu|physmem)' ;df -hT;\"
endif

ここから415行目まで、自分で好きなコマンドを実行させてます。(サーバー情報取得だったり、alias設定だったり。)ここもお好みに合わせて設定してみてください。

●秘密鍵

秘密鍵が必要な場合は、Dataフォルダの直下に、秘密鍵を置きます。

拡張子は.keyで、ここではデフォルトで、id_rsa.keyという名前を使うように設定されてます。

サーバーごとにこの鍵の名前を変更可能です。

●サーバー情報を書いたファイル

サーバー情報を書いたファイル名n.ttl の中身は以下です。

;; マクロ実行ディレクトリ
getdir CURRENTDIR
;; SSH-AutoLoginマクロをインクルード
sprintf2 INCFILE '%s\zzz_template_00start.inc' CURRENTDIR
include  INCFILE

;; マクロ終了 
end

たったこれだけです。
これをテキストで作成するだけです。

あとは、ファイル名を命名規則に従って、設定するだけです。

<サーバー情報を書いたファイルの命名規則>

名前_RIP(,Port)_sudoYN(.PassDAT)_KeyNY(.KeyFile)_rootYN(.USER.USER2)(_hub-IP_KeyNY_USER).ttl

※括弧()は、省略可能です。
※基本、区切り文字はアンダーバー「_」です。

<解説>

名前 : ここはアンダーバー以外なら何書いても良いです。わかりやすい日本語名とか書くと良いでしょう。

RIP : 接続先サーバーの、リアルIPアドレス、または名前解決できるホスト名(FQDN名)など。

Port : sshポートです。デフォルトは22で省略可能。

sudoYN : rootになるときに、sudoを使う(sudoY)か、「su -」を使う(sudoN)か、を指定します。rootにならない場合は、何を設定しても影響ありません。

PassDAT : パスワードを格納する.datファイル名を拡張子なしで指定します。省略した場合、デフォルトはpass1が指定されています。

KeyNY : 秘密鍵が使ったsshログイン(KeyY)か、パスワードを使ったログイン(KeyN)かを指定します。

USER : サーバーにsshログインするユーザー名を指定します。省略時はデフォルトでec2-userになってます。rootで直接sshする場合は、ここをrootに設定する必要があります。

USER2 : ログインしたユーザーと違うユーザーにスイッチしたい場合は、ここにユーザーを指定します。

hub-IP : 多段sshする場合の踏み台となるサーバーのIPアドレス、またはホスト名を指定します。

KeyNY : 多段sshする場合の踏み台となるサーバーで、秘密鍵が使ったsshログイン(KeyY)か、パスワードを使ったログイン(KeyN)かを指定します。

USER : 多段sshする場合の踏み台となるサーバーのユーザー名を指定します。

<例>

ファイル名の例1:
AWS-REMOTEserver01(踏み台サーバー)_1.2.3.4_sudoY_KeyY.remote-server01_rootN.ttl
 →サーバー1.2.3.4に、(デフォルト:ec2-userで)remote-server01.keyの秘密鍵を使ってsshログインします。

ファイル名の例2:
AWS-Webserver22(Webサーバー)_10.0.0.100_sudoY_KeyY.remote-server01_rootY.test_1.2.3.4_KeyY_ec2-user.ttl
 →サーバー1.2.3.4に、ec2-userでremote-server01.keyの秘密鍵を使ってsshログインし、さらに、10.0.0.100のサーバーへtestユーザーでsshログインし、rootへスイッチします。

●拡張子.ttlをteratermマクロに関連付け

拡張子.ttlファイルが関連付けされていない場合は、サーバー情報を書いた.ttlファイルをクリックすると関連付けする画面が表示されるので、teratermフォルダ内のttpmacro.exe実行ファイルを指定して関連付けしましょう。

▼自動ログイン、トライ!!

ここまで準備ができれば、.ttlファイルをダブルクリックすると、、、自動でsshログインされるハズです!

あとは、「サーバー情報を書いたファイル名.ttl」をたくさん作って、アクセスしたいサーバーをクリックするだけで、簡単にsshできるようになります!!!

▼最後に

最初、この会社に入社した際、あまりのサーバーの多さに驚き、利便性と手間・効率化を考えて、最初にこのマクロを(ミニマムで)作ってしまいました。

結構突貫で作ってるところも多々あるので、作りも荒く、また、各所、応答結果によって分岐させたりしている箇所がありますが、環境によってはwaitやmpause等の微調整が必要かもしれませんので、各々の環境に合わせて修正してみてください。

ちなみに、ログは溜まっていくいっぽうなので、必要に応じて手動で削除してあげてください。

また、今回のマクロは、teraterm-4.87のバージョンで作成・テストしてます。バージョンによっては動作しない場合もありますので、ご了承ください。

この記事を書いた人

インフラMr.Y
プロダクト開発本部 インフラチーム
インフラMr.Y

おすすめの記事