web-dev-qa-db-ja.com

シェルスクリプトを作成してリモートマシンにSSH接続し、コマンドを実行します。

2つ質問があります。

  1. リモートのLinuxマシンは複数あり、それぞれのマシンで同じコマンドセットを実行するシェルスクリプトを書く必要があります。 (一部のSudoオペレーションを含む)シェルスクリプトを使用してこれをどのように行うことができますか?
  2. リモートマシンにSSH接続するときに、RSAフィンガープリント認証を要求されたときの処理方法。

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

78
Balanivash

リモートの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フィンガープリント認証を要求されたときの処理方法。

SshにStrictHostKeyChecking=noオプションを追加することができます。

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

これは Host key checkを無効にする そして自動的に既知のホストのリストにHostキーを追加します。 Hostを既知のhostsファイルに追加したくない場合は、オプション-o UserKnownHostsFile=/dev/nullを追加します。

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

118
Andreas Fester

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

私のお気に入りの方法は 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
DigitalRoss

apt-get install sshpassを使用して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
4

あなたがPerlコードを書くことができるならば、あなたは Net :: OpenSSH :: Parallel を使うことを考えるべきです。

あなたは宣言的な方法ですべてのホストで実行されなければならないアクションを記述することができるでしょう、そしてモジュールはすべての怖い詳細の面倒を見るでしょう。 Sudoを介したコマンドの実行もサポートされています。

2
salva

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

Ansible: https://www.ansible.com/
AWX: https://github.com/ansible/awx
Ansible Tower:商用製品の場合、Towerの15日間のフリートレイルではなく、おそらく無料のオープンソースAWXを探求​​するでしょう。

0
Fibo

これは私のために働きます。

構文:ssh -i pemfile.pem user_name @ ip_address 'command_1; command 2; command 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'
0
Viraj.Hadoop