リモートマシンにsshするシェルスクリプトを記述してコマンドを実行する


97

2つの質問があります。

  1. 複数のリモートLinuxマシンがあり、各マシンで同じコマンドセットを実行するシェルスクリプトを記述する必要があります。(いくつかのsudo操作を含む)。シェルスクリプトを使用してこれをどのように行うことができますか?
  2. リモートマシンにsshするとき、RSA指紋認証を要求された場合の処理​​方法。

リモートマシンは実行時に作成されたVMであり、私はそれらのIPを持っています。そのため、これらのマシンに事前にスクリプトファイルを配置して、自分のマシンから実行することはできません。


エージェントのようなプログラムをリモートLinuxマシンにデプロイすると思います。これは、ネットワークソケット(またはSSL)接続またはサーバーへの定期的なポーリングによってサーバーとの接続を維持します。
ラプター

接続を維持する必要はありませんので、私は、一度だけ一連のコマンドを実行する必要がある
Balanivash

「スクリプトなし」は「ファイルがまったくない」ことを意味すると思いますか?認証はどのように処理しますか?ホストのフィンガープリントチェックを無効にすることもできますが(私の回答を参照)、公開/秘密キーを設定していない場合でも、対話型のパスワードプロンプトが表示されます。
Andreas Fester

1
アンドレアス:はい。ファイルはまったくありません。passwdプロンプトはexpect、 `expect" ?assword: "`
Balanivash

回答:


141

複数のリモートLinuxマシンがあり、各マシンで同じコマンドセットを実行するシェルスクリプトを記述する必要があります。(いくつかのsudo操作を含む)。シェルスクリプトを使用してこれをどのように行うことができますか?

たとえば、sshを使用してこれを行うことができます。

#!/bin/bash
USERNAME=someUser
HOSTS="host1 host2 host3"
SCRIPT="pwd; ls"
for HOSTNAME in ${HOSTS} ; do
    ssh -l ${USERNAME} ${HOSTNAME} "${SCRIPT}"
done

リモートマシンにsshするときに、RSA指紋認証を要求された場合の処理​​方法。

StrictHostKeyChecking=noオプションをsshに追加できます。

ssh -o StrictHostKeyChecking=no -l username hostname "pwd; ls"

これにより、ホストキーチェック無効になり、既知のホストのリストにホストキーが自動的に追加されます。ホストを既知のホストファイルに追加したくない場合は、オプションを追加します-o UserKnownHostsFile=/dev/null

これ、中間者攻撃に対する保護など、特定のセキュリティチェックを無効にすることに注意してください。したがって、セキュリティが重要な環境には適用しないでください。


スクリプト言語とは何ですか?もちろんssh、任意のシェルスクリプトから呼び出すこともできます
Andreas Fester

CTRL + Cを押して複数のサーバーにSSHを続けたい場合はどうでしょうか?たとえば、一部のサーバーではパスワードを要求し、一部のサーバーではパスワードを要求しないため、スクリプトはそこでスタックします。CTRL cまたはCTRL dを実行するために-oと同様の方法を実行する方法はありますか?
Chanafot

5

これを処理する方法はいくつかあります。

私のお気に入りの方法は、リモートシステムと独自の公開鍵にhttp://pamsshagentauth.sourceforge.net/をインストールすることです。(これらをVMにインストールする方法を理解し、どういうわけか、Unixシステム全体をインストールしました。さらにいくつかのファイルは何ですか?)

sshエージェントを転送すると、パスワードなしですべてのシステムにログインできるようになります。

さらに、そのpamモジュールはsshの鍵ペアを使用してsudoを認証するため、必要に応じてroot(または他のユーザーの)権限で実行できます。

ホストキーの相互作用について心配する必要はありません。入力が端末でない場合、sshはエージェントを転送し、パスワードで認証する機能を制限します。

Capistranoのようなパッケージも調べる必要があります間違いなくそのサイトを見回してください。リモートスクリプトの概要を説明しています。

個々のスクリプト行は次のようになります。

ssh remote-system-name command arguments ... # so, for exmaple,
ssh target.mycorp.net sudo puppet apply

4

を使用してsshpassをインストールし、 apt-get install sshpassスクリプトを編集して、LinuxマシンのIP、ユーザー名、およびパスワードをそれぞれの順序で配置します。その後、そのスクリプトを実行します。それでおしまい !このスクリプトは、すべてのシステムにVLCをインストールします。

#!/bin/bash
SCRIPT="cd Desktop; pwd;  echo -e 'PASSWORD' | sudo -S apt-get install vlc"
HOSTS=("192.168.1.121" "192.168.1.122" "192.168.1.123")
USERNAMES=("username1" "username2" "username3")
PASSWORDS=("password1" "password2" "password3")
for i in ${!HOSTS[*]} ; do
     echo ${HOSTS[i]}
     SCR=${SCRIPT/PASSWORD/${PASSWORDS[i]}}
     sshpass -p ${PASSWORDS[i]} ssh -l ${USERNAMES[i]} ${HOSTS[i]} "${SCR}"
done

$ SSHPASSを使用してパスワードをエクスポートし、スクリプトに表示されないようにします。参考:tecmint.com/...
Hexy

2

Perlコードを記述できる場合は、Net :: OpenSSH :: Parallelの使用を検討してください。

宣言的な方法ですべてのホストで実行する必要があるアクションを説明でき、モジュールがすべての恐ろしい詳細を処理します。コマンドの実行sudoもサポートされています。


2

この仕事は私にとって。

構文:ssh -i pemfile.pem user_name @ ip_address 'command_1; コマンド2; コマンド3 '

#! /bin/bash

echo "########### connecting to server and run commands in sequence ###########"
ssh -i ~/.ssh/ec2_instance.pem ubuntu@ip_address 'touch a.txt; touch b.txt; sudo systemctl status tomcat.service'

1

この種のタスクでは、Ansibleを繰り返し使用して、複数のコンテナまたはVMで一貫してbashスクリプトを複製できるようにしています。Ansible(より正確にはRed Hat)には、商用タワーのオープンソース版である追加のWebインターフェースAWXが追加されました。

Ansible:https :
//www.ansible.com/ AWX:https : //github.com/ansible/awx
Ansible Tower:商用製品、15日間の無料トレイルではなく、無料のオープンソースAWXを最初に探索しますタワーの


1

複数のリモートLinuxマシンでコマンドまたはスクリプトを実行するには、複数の方法があります。シンプルで簡単な方法の1つは、pssh(並列sshプログラム) を使用することです

。pssh:は、複数のホストでsshを並列実行するためのプログラムです。すべてのプロセスに入力を送信する、sshにパスワードを渡す、出力をファイルに保存する、タイムアウトするなどの機能を提供します。

例と使用法:

host1とhost2に接続し、それぞれから「hello、world」を出力します。

 pssh -i -H "host1 host2" echo "hello, world"

複数のサーバーでスクリプトを使用してコマンドを実行します。

pssh -h hosts.txt -P -I<./commands.sh

ホストキーを確認または保存せずに使用法とコマンドを実行する:

pssh -h hostname_ip.txt -x '-q -o StrictHostKeyChecking=no -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes' -i  'uptime; hostname -f'

hosts.txtファイルに100などの多数のエントリがある場合は、並列処理オプションを100に設定して、コマンドが同時に実行されるようにすることもできます。

pssh -i -h hosts.txt -p 100 -t 0 sleep 10000

オプション
-I:入力を読み取り、各sshプロセスに送信します。
-P:到着時に出力を表示するようpsshに指示します。
-h:ホストのファイルを読み取ります。
-H:単一ホストの場合は[user @] host [:port]。
-i:各ホストの完了時に標準出力と標準エラーを表示します
-x args:追加のSSHコマンドライン引数 を渡します
-oオプション:構成ファイルで使用されている形式でオプションを指定するために使用できます(/ etc / ssh / ssh_config )(〜/ .ssh / config)
-p parallelism:指定された数を同時接続の最大数として使用します
-q Quietモード: ほとんどの警告メッセージと診断メッセージを抑制します。
-t:指定された秒数の後に接続をタイムアウトにします。0は、psshが接続をタイムアウトしないことを意味します

リモートマシンにsshするとき、RSA指紋認証を要求された場合の処理​​方法。

StrictHostKeyCheckingを無効にして、RSA認証プロンプトを処理します。
-o StrictHostKeyChecking = no

出典:man pssh


0

これでうまくいきました。関数を作りました。これをシェルスクリプトに入れます。

sshcmd(){
    ssh $1@$2 $3
}

sshcmd USER HOST COMMAND

同じコマンドを実行したいマシンが複数ある場合は、セミコロンでその行を繰り返します。たとえば、マシンが2つある場合は、次のようにします。

sshcmd USER HOST COMMAND ; sshcmd USER HOST COMMAND

USERをコンピューターのユーザーに置き換えます。HOSTをコンピューターの名前に置き換えます。COMMANDをコンピューターで実行するコマンドに置き換えます。

お役に立てれば!


-1

あなたはこのアプローチに従うことができます:

  • Expectスクリプトを使用してリモートマシンに接続します。マシンがサポートしていない場合は、同じものをダウンロードできます。Expectスクリプトの記述は非常に簡単です(Googleでこれについてのヘルプを入手できます)
  • リモートサーバーで実行する必要があるすべてのアクションをシェルスクリプトに入れます。
  • ログインが成功したら、expectスクリプトからリモートシェルスクリプトを呼び出します。

質問で述べたように、リモートマシンは実行時に作成され、事前にマシンにスクリプトを置くことはできません。
Balanivash

その場合、すべてのアクションをExpectスクリプトに入れます。Expectスクリプトは、リモートホストでもコマンドを実行できます。
rai.skumar 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.