web-dev-qa-db-ja.com

別のサーバーにSSHで接続し、そこでスクリプトを実行するシェルスクリプト

テスト環境に6台のサーバーがあります。すべてのボックスにログインするのではなく、1つのボックスにログインして、すべてのボックスでTomcatサーバーを停止するスクリプトを記述したいと思います。

シェルスクリプト、SSH、および他のすべてのボックスでスクリプトを実行するのを手伝ってください。パスワードとカスタムポート番号を使用してSSHを使用しています。

3
nithi

特定のポート経由のSSH へのログイン用と リモートサーバーでのコマンドの実行 へのログイン用の2つの関連するAsk Ubuntu回答を1つのスクリプトに結合する必要があります。もちろん、サーバーとポートの対応を保持するために、何らかの形式のデータ構造が必要です。これは、bash 連想配列 またはPOSIXシェルスクリプト-ケースステートメントのいずれかです。すべてのホストでのユーザー名が同じであるとすると、次のようなものが考えられます。

#!/bin/sh
# bar Host has ssh server on port 22, while baz - on port 2222
Host_port(){
    case "$1" in
        "bar") echo 22 ;;
        "baz") echo 2222 ;;
    esac
} 

# set positional parameters of script to hosts and iterate over them
set -- bar baz
for Host ; do
    # command substitution will call function, 
    # function's return value will be the port number
    ssh ssh://username@"$Host":"$(Host_port "$Host")" -t "systemctl stop Tomcat"
done

さて、巨大な免責事項:これは単なる例です。スクリプトをテストするサーバーが6台ないので、必要に応じてニーズに合わせて調整してください。各ホストに異なるユーザー名がある場合は、別のcaseステートメントを使用します


ログインに関する補足:6つのサーバーすべてで受け入れられる秘密鍵がある場合は、-i ~/.ssh/id_rsaを追加するだけで簡単にログインできます。その代わりに、各ホストのキー/パスワード情報を含む~/.ssh/configファイルを作成することもできます。これは Lekensteynの回答 で説明されています。 SSHキーに慣れていない場合(そして、それがちょっと紛らわしいトピックだと私は理解している場合)、 トピックに関するssh.comの記事 を読みたいと思うかもしれません。

5

Sshpassを使用できます。

Sudo apt install sshpass -y 

次に、リモートサーバーでコマンドを実行できます。

    #!/bin/bash
    # login info
    Host='192.168.0.1'
    USER='user'
    PORT='2222'
    PASSWORD='password'
    # command
    sshpass -p $PASSWORD ssh -p $PORT $USER@$Host touch 1.txt 
0