5

クラスター内の各サーバーでのインストールと構成を自動化する「ツール」 (いくつかの bash スクリプト) を作成しています。

「ツール」はプライマリ サーバーから実行されます。それは、自分自身を (SCP 経由で) tar して他のすべてのサーバーに配布し、「バッチ」SSH 経由でコピーを untar します。

セットアップ中に、ツールはプライマリ サーバーから次のようなリモート コマンドを発行しますecho './run_audit.sh' | ssh host4 'bash -s'。標準入力が既に使用されているため、インタラクティブな動作がある場合を除いて、このアプローチは多くの場合に機能します。

SSH 経由でリモート bash スクリプトを対話的に実行する方法はありますか?

出発点として、次のケースを検討してください。echo 'read -p "enter name:" name; echo "your name is $name"' | ssh host4 'bash -s'

上記の場合、プロンプトは表示されません。どうすれば回避できますか?

前もって感謝します。

4

3 に答える 3

9

次のように、コマンドを直接実行します。

ssh -t host4 bash ./run_audit.sh

アンコールの場合は、シェル スクリプトを変更して、stdin からではなく、コマンド ラインまたは構成ファイルから (または stdin に優先して) オプションを読み取るようにします。

代わりに puppet/etc を調べるという Dennis Williamson の提案に賛成します。

于 2012-07-07T13:06:13.877 に答える
1

を調べてみたいと思われるかもしれませんexpect

于 2012-07-07T06:56:15.233 に答える
0

コマンドをstdin経由でsshにパイプしないでください。ただし、シェルスクリプトをリモートマシンにコピーしてください。

scp ./run_audit.sh host4:

その後:

ssh host4 run_audit.sh

ファブリックを使用しているクラスター展開の場合...SSHプロトコル上で実行され、デーモンは必要ありません。fabfile.pyを書くのと同じくらい簡単です:

from fabric.api import run

def host_type():
    run('uname -s')

その後:

$ fab -H localhost,linuxbox host_type
[localhost] run: uname -s
[localhost] out: Darwin
[linuxbox] run: uname -s
[linuxbox] out: Linux

Done.
Disconnecting from localhost... done.
Disconnecting from linuxbox... done.

もちろん、インタラクティブコマンドやSSH用の〜/.sshディレクトリファイルのリレーなど、さらに多くのことができます。詳しくはfabfile.orgをご覧ください。確かに、そのようなタスクのbashを忘れることになります。;-)

于 2012-07-07T19:10:36.947 に答える