21

同様の質問を少し検索しましたが、次のようなアイテムを使用して1つのコマンドまたはおそらくいくつかのコマンドを実行する以外は:

ssh user@host -t sudo su -

ただし、一度に 15 台のサーバー (たとえば) でスクリプトを実行する必要がある場合はどうでしょうか。これはbashで実行できますか?完璧な世界では、これを実現するために、可能な限りアプリケーションのインストールを避ける必要があります。議論のために、10 台のホストで次のことを行う必要があるとしましょう。

  1. 新しい Tomcat コンテナーをデプロイする
  2. コンテナーにアプリケーションをデプロイして構成する
  3. Apache 仮想ホストを構成する
  4. アパッチをリロードする

そのすべてを行うスクリプトがありますが、すべてのサーバーにログインし、レポからスクリプトを取得して実行する必要があります。これが bash で実行できない場合、どのような代替手段を提案しますか? Perl などのより大きなハンマーが必要ですか (yum/up2date のおかげで、RHEL 環境のすべてのボックスで Python を確実に使用できるため、Python を使用することをお勧めします)? 誰かが有用な情報を私に指摘できれば、特にそれが bash で実行できる場合は大歓迎です。私は Perl または Python で解決しますが、それらについても知りません (それに取り組んでいます)。ありがとう!

4

20 に答える 20

11

cheとYangが示すように、ローカルスクリプトを実行したり、ヒアドキュメントを使用したりできます。

ssh root@server /bin/sh <<\EOF  
wget http://server/warfile    # Could use NFS here  
cp app.war /location  
command 1  
command 2  
/etc/init.d/httpd restart  
EOF 
于 2008-10-28T16:16:33.567 に答える
10

多くの場合、Expectの元のTclバージョンを使用します。あなたはそれをローカルマシンに持っている必要があるだけです。Perlを使用しているプログラム内にいる場合は、Net :: SSH::Expectを使用してこれを行います。他の言語にも同様の「期待」ツールがあります。

于 2008-10-28T16:19:07.260 に答える
9

先日、多くのサーバーでコマンドを一度に実行する方法の問題が Perl のメーリング リストで取り上げられましgsh

http://outflux.net/unix/software/gsh

gsh は既に与えられfor box in box1_name box2_name box3_nameた " " ソリューションに似ていますが、gsh の方が便利だと思います。サーバーを含む /etc/ghosts ファイルを web、db、RHEL4、x86_64 など (man ゴースト) などのグループに設定し、gsh を呼び出すときにそのグループを使用します。

[pdurbin@beamish ~]$ gsh web "cat /etc/redhat-release; uname -r"
www-2.foo.com: Red Hat Enterprise Linux AS release 4 (Nahant Update 7)
www-2.foo.com: 2.6.9-78.0.1.ELsmp
www-3.foo.com: Red Hat Enterprise Linux AS release 4 (Nahant Update 7)
www-3.foo.com: 2.6.9-78.0.1.ELsmp
www-4.foo.com: Red Hat Enterprise Linux Server release 5.2 (Tikanga)
www-4.foo.com: 2.6.18-92.1.13.el5
www-5.foo.com: Red Hat Enterprise Linux Server release 5.2 (Tikanga)
www-5.foo.com: 2.6.18-92.1.13.el5
[pdurbin@beamish ~]$

たとえば、web+db や web-RHEL4 を使用して、ゴースト グループを結合または分割することもできます。

また、shmux を使用したことはありませんが、shmux のWeb サイトには、多数のサーバーで一度にコマンドを実行できるソフトウェア (gsh を含む) のリストが含まれています。 カピストラーノはすでに言及されており、(私が理解していることから)そのリストにも含まれる可能性があります.

于 2008-10-28T22:26:20.480 に答える
6

期待を見てみましょう ( man expect)

過去に、Expect を使用して同様のタスクを実行しました。

于 2008-10-28T15:47:56.230 に答える
5

ローカル スクリプトをリモート サーバーにパイプして、1 つのコマンドで実行できます。

ssh -t user@host 'sh' < path_to_script

これは、公開鍵認証を使用し、スクリプトでラップして並列実行を実行することで、さらに自動化できます。

于 2008-10-28T15:52:47.017 に答える
4

paramikoを試すことができます。これは、純粋な python ssh クライアントです。ssh セッションをプログラムできます。リモート マシンにインストールするものはありません。

使用方法については、このすばらしい記事を参照してください。

于 2009-11-09T08:57:27.177 に答える
3

実際のコードなしで、構造を提供します。

  1. scp を使用して、インストール/セットアップ スクリプトをターゲット ボックスにコピーします。
  2. ssh を使用して、リモート ボックスでスクリプトを呼び出します。
于 2008-10-28T15:33:34.760 に答える
2

この質問に出くわした人のために、上記の問題を正確に解決するFabricを使用する回答を含めます。

ファブリックをインストールしたら、 を作成し、リモート ホストで実行できるタスクfabfile.pyを実装します。たとえば、Apache をリロードするタスクは次のようになります。

from fabric.api import env, run

env.hosts = ['host1@example.com', 'host2@example.com']

def reload():
    """ Reload Apache """
    run("sudo /etc/init.d/apache2 reload")

次に、ローカル マシンで を実行するfab reloadと、sudo /etc/init.d/apache2 reloadで指定されたすべてのホストでコマンドが実行されenv.hostsます。

于 2012-04-30T19:10:16.443 に答える
2

PuppetCfengineなどを見たことがありますか。彼らはあなたが望むこと、そしておそらくそれ以上のことをすることができます。

于 2008-12-15T09:53:55.997 に答える
2

ここで言及されているほとんどのソリューションとは異なり、コマンドは並行して実行されるため、psshは興味深いかもしれません。

(私自身の使用のために、GavinCattell のスクリプトに非常によく似た、より単純な小さなスクリプトを作成しました。これは、フランス語でここに文書化されています)。

于 2008-12-15T09:19:05.020 に答える
1

複雑なトピックですが、Capistranoを強くお勧めします。

于 2008-10-28T15:37:21.587 に答える
1

手動で行う代わりにスクリプトを作成するだけで、以前と同じ方法で実行できます。次のコードは、「loca」という名前のマシンにリモート接続し、そこで 2 つのコマンドを実行します。あなたがする必要があるのは、そこに実行したいコマンドを挿入するだけです。

che@ovecka ~ $ ssh loca 'uname -a; 何か他のものをエコー
Linux ロカ 2.6.25.9 #1 (ブラブラブラ)
何か他のもの

次に、すべてのマシンを反復するには、次のようにします。

box1_name box2_name box3_name のボックス用
行う
   ssh $box 'commmands_to_run_everywhere'
終わり

常にパスワードを入力せずにこの ssh を機能させるには、キー認証を設定する必要があります。これについては、 IBM developerworksで読むことができます。

于 2008-10-28T15:43:36.723 に答える
1

ステップ 1 と 2 には、Tomcat Manager の Web インターフェイスはありません。libwwwプラグインを使用してcurlまたはzshでスクリプトを作成できます。

あなたが探しているSSHの場合:1)パスワードの入力を求められない(キーを使用する)2)SSHのコマンドラインでコマンドを渡す、これはrsh信頼できるネットワークと似ています。

他の投稿で何をすべきかが示されていshます.perlssh tomcatuser@server perl -e 'do-everything-on-one-line;'

または [通常はTomcatを再起動する必要はありません] [そのファイルを移動して再起動するには、Apacheユーザーとしてログインする必要がある場合があります]のようscp the_package.tbz tomcatuser@server:the_place/.
ssh tomcatuser@server /bin/sh <<\EOF
ものを定義します TOMCAT_WEBAPPS=/usr/local/share/tomcat/webapps
tar xj the_package.tbz rsync rsync://repository/the_package_place
mv $TOMCAT_WEBAPPS/old_war $TOMCAT_WEBAPPS/old_war.old
mv $THE_PLACE/new_war $TOMCAT_WEBAPPS/new_war
touch $TOMCAT_WEBAPPS/new_war
mv $THE_PLACE/vhost_file $APACHE_VHOST_DIR/vhost_file
$APACHECTL restart
EOF

于 2008-10-28T17:24:52.790 に答える
1

cluster sshなどのツールを使用して、一度に複数のサーバーで同じコマンドを実行できます。このリンクは、Debian package of the day ブログでのクラスター ssh のディスカッションへのリンクです。

于 2008-10-28T15:45:58.637 に答える
1

ボタンをクリックするだけで複数の Unix/Linux ホスト上でスクリプトを実行できるFLATT (FLexible Automation and Troubleshooting Tool)というツールがあります。Mac と Windows で動作するデスクトップ GUI アプリですが、コマンドライン Java クライアントもあります。
バッチ ジョブを作成し、複数のホストで再利用できます。
Java 1.6 以降が必要です。

于 2013-09-17T20:35:04.620 に答える
1

クラスターでよく使用される DSH または分散シェルが必要です。ここにリンクがあります:dsh

基本的にノード グループ (ノードのリストを含むファイル) があり、コマンドを実行するノード グループを指定してから、ssh でコマンドを実行するように dsh を使用します。

dsh -a /path/to/some/command/or/script

すべてのマシンで同時にコマンドを実行し、ホスト名のプレフィックスが付いた出力を返します。コマンドまたはスクリプトはシステム上に存在する必要があるため、共有 NFS ディレクトリはこのような場合に役立ちます。

于 2008-10-29T14:38:11.813 に答える
0

この方法が必要なものすべてに機能するかどうかはわかりませんが、次のような方法を試すことができます。

$ cat your_script.sh | ssh your_host bash

これは、リモートサーバー上で(ローカルに存在する)スクリプトを実行します。

于 2008-10-29T17:00:16.503 に答える
0

主流のカーネル以外に追加のインストールや構成を行うことなく、setsidを使用して新しいブログを読むだけです。Ubuntu14.04 でテスト/検証済み。

著者は非常に明確な説明とサンプル コードも提供していますが、一目でわかる魔法の部分を次に示します。

#----------------------------------------------------------------------
# Create a temp script to echo the SSH password, used by SSH_ASKPASS
#----------------------------------------------------------------------
SSH_ASKPASS_SCRIPT=/tmp/ssh-askpass-script
cat > ${SSH_ASKPASS_SCRIPT} <<EOL
#!/bin/bash
echo "${PASS}"
EOL
chmod u+x ${SSH_ASKPASS_SCRIPT}

# Tell SSH to read in the output of the provided script as the password.
# We still have to use setsid to eliminate access to a terminal and thus avoid
# it ignoring this and asking for a password.
export SSH_ASKPASS=${SSH_ASKPASS_SCRIPT}
......
......
# Log in to the remote server and run the above command.
# The use of setsid is a part of the machinations to stop ssh 
# prompting for a password.
setsid ssh ${SSH_OPTIONS} ${USER}@${SERVER} "ls -rlt"
于 2014-08-28T19:54:31.430 に答える