目次
使用用途
別シートにSSHの情報が記載されているため、
コピペしてスクリプトを実行するのがとても面倒だったため短縮化するためのスクリプトを作成
必要最低限のスクリプトとなっているため参考程度にお願いいたします。
使用環境
バージョン情報 | |
---|---|
デバイス | MacBook Pro 2018 |
OS | mac sequoia |
shell | zsh |
事前準備
ExpectはLinuxのCLIコマンドを自動化する化するパッケージの一つです
インストール必須
brew install expect
スクリプト
#!/usr/bin/env zsh
# 環境リストの定義
typeset -A SERVERS
SERVERS=(
1 "user@server1.example.com"
2 "user@server2.example.com"
3 "user@server3.example.com"
)
typeset -A PASSWORDS
PASSWORDS=(
1 "password1"
2 "password2"
3 "password3"
)
# メニューの表示
echo "接続する環境を選択してください:"
for key in "${(@k)SERVERS}"; do # 修正
echo "$key) ${SERVERS[$key]}"
done
echo -n "番号を入力: "
read selection
# 選択された環境に接続
if [[ -n "${SERVERS[$selection]}" ]]; then
echo "${SERVERS[$selection]} に接続します..."
expect -c "
spawn ssh ${SERVERS[$selection]}
expect \"password: \"
send \"${PASSWORDS[$selection]}\r\"
interact
"
else
echo "無効な選択です。"
exit 1
fi
コードの説明
1. シェバン(実行環境の指定)
#!/usr/bin/env zsh
#!/usr/bin/env zsh
は、環境に依存せずzsh
でスクリプトを実行できるようにするための記述。zsh
がシステムのどこにインストールされていても、適切なzsh
を使用する。
2. サーバー情報の定義
typeset -A SERVERS
SERVERS=(
1 "user@server1.example.com"
2 "user@server2.example.com"
3 "user@server3.example.com"
)
typeset -A SERVERS
で連想配列(キーと値のペア)を定義。SERVERS
配列には、各サーバーの接続情報(ユーザー名@サーバーアドレス
)が格納されている。- キー(
1, 2, 3
)は、ユーザーが選択する番号。
3. パスワード情報の定義
typeset -A PASSWORDS
PASSWORDS=(
1 "password1"
2 "password2"
3 "password3"
)
PASSWORDS
配列には、各サーバーのパスワードが格納されている。- サーバーごとに対応するパスワードがセットされている。
4. サーバー選択メニューの表示
echo "接続する環境を選択してください:"
for key in "${(@k)SERVERS}"; do # 修正
echo "$key) ${SERVERS[$key]}"
done
echo "接続する環境を選択してください:"
で、ユーザーに選択を促す。for key in "${(@k)SERVERS}"; do
:(@k)
を使うことでSERVERS
のキー(1, 2, 3
)を取得。- 各キーに対応するサーバー情報を表示。
出力例:
sqlコピーする編集する接続する環境を選択してください:
1) user@server1.example.com
2) user@server2.example.com
3) user@server3.example.com
5. ユーザーの入力を取得
echo -n "番号を入力: "
read selection
echo -n
は、改行せずに入力を促す。read selection
で、ユーザーが入力した番号を変数selection
に格納。
6. SSH接続の処理
if [[ -n "${SERVERS[$selection]}" ]]; then
echo "${SERVERS[$selection]} に接続します..."
expect -c "
spawn ssh ${SERVERS[$selection]}
expect \"password: \"
send \"${PASSWORDS[$selection]}\r\"
interact
"
else
echo "無効な選択です。"
exit 1
fi
(1) ユーザーの選択をチェック
if [[ -n "${SERVERS[$selection]}" ]]; then
-n
は、「変数が空でないか」をチェックするオプション。SERVERS[$selection]
に値があるか確認し、無効な選択を防ぐ。
(2) SSH接続を開始
expect -c "
spawn ssh ${SERVERS[$selection]}
expect \"password: \"
send \"${PASSWORDS[$selection]}\r\"
interact
"
expect
コマンドを使用し、SSH接続時のパスワード入力を自動化。spawn ssh ${SERVERS[$selection]}
→ SSH接続を開始。expect "password: "
→ パスワード入力待機。send "${PASSWORDS[$selection]}\r"
→ 事前に設定したパスワードを送信(\r
はEnterキー相当)。interact
→ その後、ユーザーが手動でSSHセッションを操作できるようにする。
(3) 無効な選択の処理
else
echo "無効な選択です。"
exit 1
fi
- ユーザーが無効な番号を入力した場合はエラーメッセージを表示し、終了。
動作の流れ
- サーバー一覧を表示。
- ユーザーが接続する番号を入力。
expect
を使用してSSH接続を自動化(パスワードも自動入力)。- 接続後は手動で操作可能。
注意点
expect
のインストールexpect
がインストールされていない場合、以下でインストール可能。
sudo apt install expect # Ubuntu/Debian系 sudo yum install expect # CentOS/RHEL系
- SSH鍵認証を推奨
- パスワードをスクリプトに埋め込むのはセキュリティ上のリスクがある。
- 可能ならSSH鍵認証を使い、パスワードなしで接続するのがベスト。
まとめ
zsh
の連想配列を使って、複数のSSH接続情報を管理。expect
を利用して、パスワードを自動入力しSSH接続。- ユーザーが選択しやすいメニュー形式で実装。
- セキュリティ上、SSH鍵認証の利用を推奨。
このスクリプトは、SSH接続を簡単に自動化するのに便利ですが、パスワードの管理には注意が必要です。