踏み台サーバからの面倒なsshをScriptにしたので共有してみる!
以前、以下の記事で、AWS SessionManagerを用いたEC2踏み台サーバへの接続について、共有した。
Linux踏み台サーバに入って、別のEC2インスタンスにsshするのだが、これがまた面倒だ。
数台だけであれば、なんとかなるのだけれど、複数の環境/複数のサーバ/複数の秘密鍵となると、それを毎回接続するたびに何かの台帳を見て、IPアドレスを確認して、ホスト名を確認して、、、、となるとかなりだるい。
そこで、Scriptを組んでしまえ。
と思い始め、作ったので共有しておく。
ただし、内部用ツールとしてエラー処理などあまり考慮せず作っているものを少し汎化したまでなので、細かい気配りは出来てないこと、予めご了承頂きた。
全体の構造
まず、全体像として、大きく3つの要素で構成することにしている。
見てわかる通り、スクリプト本体とサーバのリスト、鍵の3つに分けている。
それぞれの役割は見ての通りなので、読者の皆さんならきっと説明は要らないだろう。
Scriptの中身
Script本体
Scriptの中身は以下の通り。割りとシンプル。日本語になっている部分は適宜書き換えて頂きたい。
#!/bin/sh
# 1. Environment Setting
SSH_HOME=/home/Scriptのホームディレクトリを記載
SSH_RSA_HOME=${SSH_HOME}/rsa
# 2. Check user name
if [$1 = ""]; then
echo ""
echo -n "Type your name :::: "
read USER_NAME
echo ""
fi
# 3. Select system
echo ""
echo -n "Select systems to use( Aシステム / Bシステム / Cシステム / その他 ) :::: "
read SYSTEM_NAME
echo ""
# 4. Show servers
case "$SYSTEM_NAME" in
"Aシステム")
SERVER_LIST=${SSH_HOME}/.serverlist_Aシステム
;;
"Bシステム")
SERVER_LIST=${SSH_HOME}/.serverlist_Bシステム
;;
"Cシステム")
SERVER_LIST=${SSH_HOME}/.serverlist_Cシステム
;;
"その他")
SERVER_LIST=${SSH_HOME}/.serverlist_その他
;;
*)
echo "You chose the wrong number."
exit 9
;;
esac
# 5. Select server
echo ""
echo "Which server do you want to connect to ? "
echo ""
while read LINE
do
echo $LINE | awk '{print $1}'
done < ${SERVER_LIST}
echo ""
echo ""
echo -n "Please select a server name. ( Copy and paste ) :::: "
read SERVER_NAME
echo ""
echo "Connect to ${SERVER_NAME} ......"
echo ""
# 6. Start ssh Session
SSH_PARAMETERS=`grep ${SERVER_NAME} ${SERVER_LIST}`
SSH_IP=`echo ${SSH_PARAMETERS} | awk '{print $2}'`
SSH_RSA=`echo ${SSH_PARAMETERS} | awk '{print $3}'`
ssh -i ${SSH_RSA_HOME}/${SSH_RSA} sshするユーザ名@${SSH_IP} -p ポート番号
Environment Setting:sshホームディレクトリを設定する。
Check user name:実行時にユーザ名がなかったら入力させる。※ログはSessionManagerでS3自動保存なので、特段意味は無いかも
Select system:システムや環境が複数ある場合はこちらでシステムを選択させる。
Show servers:3の内容を踏まえ、読み込むサーバリストを設定する。
Select server:3で選んだシステム内のサーバを選択(入力)させる。
Start ssh Session:5で選んだサーバへssh接続する。※各サーバごとに異なるユーザの場合は、後述するリストに項目としてユーザ名を足すのもあり
割りとシンプルだが、システム名とサーバ名をフルネームで入力させることで、ミスを減らすことを意識している。
サーバリスト
上記Scriptの3で選択した環境のリストファイル。例として、一つだけ、記載しておくが、各自のシステムに合わせてコピーして使って欲しい。
---------------Aシステム_DEVELOPMENT---------------
開発サーバ1号機 xx.xxx.xxx.xxx 開発ホスト名1.rsa
開発サーバ2号機 xx.xxx.xxx.xxx 開発ホスト名2.rsa
開発サーバ3号機 xx.xxx.xxx.xxx 開発ホスト名3.rsa
開発サーバ4号機 xx.xxx.xxx.xxx 開発ホスト名4.rsa
開発サーバ5号機 xx.xxx.xxx.xxx 開発ホスト名5.rsa
---------------Aシステム_PRODUCTION---------------
本番サーバ1号機 xx.xxx.xxx.xxx 本番ホスト名1.rsa
本番サーバ2号機 xx.xxx.xxx.xxx 本番ホスト名2.rsa
本番サーバ3号機 xx.xxx.xxx.xxx 本番ホスト名3.rsa
本番サーバ4号機 xx.xxx.xxx.xxx 本番ホスト名4.rsa
本番サーバ5号機 xx.xxx.xxx.xxx 本番ホスト名5.rsa
こちらの例では、環境は一つのサーバリストにまとめているが、分けて記載するのもあり!
実行した場合の標準出力
一通り、上記を整えれば、後は実行するだけ。
といっても、前提として、踏み台サーバからのsshが許可されていて、指定したユーザ、秘密鍵で接続できる状態にしておくことは必要だ。
踏み台サーバ $ ./connect_ec2.sh
Type your name :::: hogehoge
Select system to use( Aシステム / Bシステム / Cシステム / その他 ) :::: Aシステム
Which server do you want to connect to ?
---------------Aシステム_DEVELOPMENT---------------
開発サーバ1号機 xx.xxx.xxx.xxx 開発ホスト名1.rsa
開発サーバ2号機 xx.xxx.xxx.xxx 開発ホスト名2.rsa
開発サーバ3号機 xx.xxx.xxx.xxx 開発ホスト名3.rsa
開発サーバ4号機 xx.xxx.xxx.xxx 開発ホスト名4.rsa
開発サーバ5号機 xx.xxx.xxx.xxx 開発ホスト名5.rsa
---------------Aシステム_PRODUCTION---------------
本番サーバ1号機 xx.xxx.xxx.xxx 本番ホスト名1.rsa
本番サーバ2号機 xx.xxx.xxx.xxx 本番ホスト名2.rsa
本番サーバ3号機 xx.xxx.xxx.xxx 本番ホスト名3.rsa
本番サーバ4号機 xx.xxx.xxx.xxx 本番ホスト名4.rsa
本番サーバ5号機 xx.xxx.xxx.xxx 本番ホスト名5.rsa
Please select a server name. ( Copy and paste ) :::: 本番サーバ1号機
Connect to 本番サーバ1号機 ......
Last login: Thu Dec 5 00:00:00 2023 from 踏み台サーバ.compute.amazonaws.com
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
[ユーザ名@本番ホスト名1]$
シンプルだが、何台ものサーバに接続して利用するにあたって、利便性は上がるのではないか。
また、秘密鍵において、パスフレーズを設定しておくことも大切だと思う。
今日は踏み台サーバ構成を利用する場合のsshを楽にする方法について共有してみた。
誰かの役に立ってくれれば嬉しい。