1:

1:

リモート マシンに何もインストールせずに、1 台の中央マシンから複数のリモート マシンに構成をプッシュする方法を探しています。

目的は、 などのツールで実行できるような操作をcfengine、エージェントが設定されていないマシンのセットで実行することです。これは、既存のリモート マシンのセットで設定する優れた手法である可能性がありますcfagent

答え1

スクリプトを渡してパイプで渡し、シェルを実行することで一時的に実行することができます。

例えば

echo "ls -l; echo 'Hello World'" | ssh me@myserver /bin/bash

当然、その"ls -l; echo 'Hello World'"部分は、ローカル マシン上のファイルに保存されている bash スクリプトに置き換えることができます。

例えば

cat script.sh | ssh me@myserver /bin/bash

乾杯!

答え2

それを実行する方法はいくつかあります。

1:

ssh user@remote_server 'bash -s' < localfile

2:

cat localfile  | ssh user@remote_server

3:

ssh user@remote_server "$(< localfile)"

3番目は私が好む方法です。対話型コマンドが可能になります。例:sudo -S service nginx restart

(#1 と #2 は、 を使用する場合、残りのスクリプトをパスワードの質問の入力として使用しますsudo -S。)

答え3

この目的には Python の Fabric をお勧めします。

#!/usr/bin/python
# ~/fabfile.py

from fabric_api import *

env.hosts = ['host1', 'host2']
def deploy_script():
    put('your_script.sh', 'your_script.sh', mode=0755)
    sudo('./your_script.sh')

# from shell
$ fab deploy_script

上記の手順で始めることができます。Fabricの優れたドキュメンテーション残りは自分で行います。補足として、スクリプトを Fabric 内で完全に記述することは完全に可能です。コピーは必要ありません。ただし、すべてのマシンのスクリプトを変更するには、ローカル コピーを編集して再デプロイするだけでよいことに注意してください。さらに、API の基本的な使い方を少しだけ使用すれば、現在実行中のホストやその他の変数に基づいてスクリプトを変更できます。これは一種の Python 版 Expect です。

答え4

で説明したようにこの答え使用できますヒアドキュメント:

ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH

heredoc はテキストを送信するだけで、応答を待つわけではないので注意が必要です。つまり、コマンドが実行されるのを待たないということです。

関連情報