web-dev-qa-db-ja.com

Bash:リストテキストファイルで指定されている複数のSSHサーバーにファイルをコピーするにはどうすればよいですか?

おそらくSCPを使用してbashファイルを起動したときに、一度に複数のサーバー(パスワード認証が必要なサーバーもあります)にコピーしたいファイル(たとえば「thisfile.sh」など)があります。すべてのサーバーアドレスは、テキストドキュメントに一度に1行ずつ書き込まれます。たとえば、ファイルの名前が「ServerList」であるとします。例:

[email protected]
[email protected]
[email protected]
[...]

どうすればこれを達成できますか?

編集:これについてもう少し考えましたが、bashをスターターとしてこれを実行したいので、少し後で別の方法を使用します。 SCP copyコマンドと、宛先の代わりに、次のような変数を使用することで、どのように実行できると思いますかscp myfile $ Server:〜/ myfile。このように、私はある種のループを使用する必要があると確信しているので、それをコピーするときにすべての行を通過します。

1
user3125996

Bashのみのドメインにとどまりたい場合:

while read server
    scp thisfile.sh $server:/some/location
    ssh $server /some/location/thisfile.sh
done < servers.txt

これにより、一度に1つの作業が実行され、必要に応じて認証を求められます。

3
Felipe Lema

これを達成する方法はいくつかあります。 ansibleやfabricなどを使用して、すべてのコンピューターに接続し、ファイルをコンピューターにコピーしてスクリプトを実行するスクリプトを作成できます。または、bash/Shellスクリプトを記述してファイルをそこにコピーしてから、スクリプトを実行することもできます。

FabricとAnsibleの学習曲線はわずかに高くなりますが、より便利で、コンピューターを追加したり、スクリプトを簡単に変更したりできます。

BashまたはShellスクリプトは記述が簡単ですが、将来必要になった場合に適応させるのは少し難しくなります。

https://www.digitalocean.com/community/tutorials/how-to-use-fabric-to-automate-administration-tasks-and-deployments -ファブリック

http://docs.ansible.com/ansible/intro_getting_started.html -Ansible

ここにansibleとファブリックのガイドがあります

0
grag42

Felipeはbashのみのソリューションに対する最良の答えを持っていますが、Ansibleはこのタスクにははるかに優れていると思います。

すべてのサーバーを次のようなインベントリファイルに入れる必要があります。

[default]
firstserver.com     ansible_ssh_user=firstuser
secondserver.com    ansible_ssh_user=seconduser
thirdserver.com     ansible_ssh_user=thirduser

そして、次のようなプレイブック:

--- #copyfiles.yml
hosts: all
tasks:
- name: copy file to servers
  copy:
    src: /path/to/local/file
    dest: /path/to/remote/file

そして、実行します:

ansible-playbook -i /path/to/inventory copyfiles.yml --ask-pass
0
MillerGeek