[script]リモートサーバーにアクセスするスクリプト

目次

使用用途

別シートにSSHの情報が記載されているため、
コピペしてスクリプトを実行するのがとても面倒だったため短縮化するためのスクリプトを作成
必要最低限のスクリプトとなっているため参考程度にお願いいたします。

使用環境

バージョン情報
デバイスMacBook Pro 2018
OSmac sequoia
shellzsh

事前準備

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
  • ユーザーが無効な番号を入力した場合はエラーメッセージを表示し、終了。

動作の流れ

  1. サーバー一覧を表示。
  2. ユーザーが接続する番号を入力。
  3. expect を使用してSSH接続を自動化(パスワードも自動入力)。
  4. 接続後は手動で操作可能。

注意点

  1. expect のインストール
    • expect がインストールされていない場合、以下でインストール可能。
    shコピーする編集するsudo apt install expect # Ubuntu/Debian系 sudo yum install expect # CentOS/RHEL系
  2. SSH鍵認証を推奨
    • パスワードをスクリプトに埋め込むのはセキュリティ上のリスクがある。
    • 可能ならSSH鍵認証を使い、パスワードなしで接続するのがベスト。

まとめ

  • zsh の連想配列を使って、複数のSSH接続情報を管理。
  • expect を利用して、パスワードを自動入力しSSH接続。
  • ユーザーが選択しやすいメニュー形式で実装。
  • セキュリティ上、SSH鍵認証の利用を推奨。

このスクリプトは、SSH接続を簡単に自動化するのに便利ですが、パスワードの管理には注意が必要です。

この記事を書いた人

目次