0

引数として渡されたソフトウェアをyumインストールする目的で、ネットワーク上のすべてのコンピューターにsshする次のcshスクリプトを実行しようとしました。ただし、別のホストに rsh すると、スクリプトは続行できません。この問題を回避する方法はありますか?

if ($1 == "")then
    echo -n "Please enter a package to install\n"
    set package=$<
else set package = $#argv
endif

set numlines = `cat $NM_HOME/sh_local/nc_network2.txt | grep -v "^#" | fgrep "%" |  wc -l`
while ($numlines>0)
    set line = `cat $NM_HOME/sh_local/nc_network2.txt | grep -v "^#" | fgrep "%" | tail -$numlines | head -1`
    set host2 = `echo $line | cut -f 1 -d %`
    set where = `echo $line | cut -f 2 -d %`
    if ($host2 == $this_machine) then 
    echo "This is $host2....skipping rsh to this machine"
    echo ""
    goto yum
    endif
    echo ""
    echo "logging into $host2 $where"
    echo ""
    sleep 1
    rsh $host2
    yum:
    echo ""
    echo "Preparing to install $package on $host2"
    sudo yum -y install $package
    if ($host2 == $this_machine) then 
    goto decrement
    else
    logout
    goto decrement
    endif

    decrement:
    @ numlines--

end
4

2 に答える 2

2

ssh/ rsh-別のホストに移動しても、そのホストでスクリプトの実行が魔法のように続行されることはありません。スクリプトで実行すると、シェルでssh hostname実行するのとまったく同じ効果がssh hostnameあります。つまり、そのマシンに接続し、そこでインタラクティブシェルを実行して、そのシェルにとどまります。スクリプトの実行は、ssh/rsh接続を自分で閉じた後にのみ続行されます。

そのホストで何らかのアクションを実行するには、次のように、そのホストで実行する明示的なコマンドを指定する必要があります。

rsh $host2 sudo yum -y install $package

これは、説明のための単純な例にすぎないことに注意してください。スクリプトのロジック全体を修正するだけでは不十分な可能性がありますが、正しい方向を示す必要があります。

于 2013-01-23T09:21:01.270 に答える
1

はい。私の答えはあなたの「質問」を読むことによってのみ以下に提供され、あなたが投稿したコードにあなたが出したものではありません。

私はこれを何年もの間以下のようにやっています。

  • 各行に1つのホストを持つホストのリストを作成します。
  • SSHキーベースの認証を事前に有効にします。これは手動で行うことができますが、私は過去にとを使用してそれをperl行いましたexpect

  • 以下のようにループを実行して、forすべてのサーバーでアクションを実行します。

    私のためにcat hosts_list; ssh $ i dmidecode | grep -m 1'シリアル番号:'; 終わり

上記のonelinerは、に記載されているすべてのサーバーのシリアル番号を示していますhost_list。これは、シリアル番号を取得するショットの例です。ただし、まったく同じロジックに従って、本格的なbashスクリプトを作成できます。

より高度な要件については、で利用可能なモジュールperlの使用を検討してくださいsshCPAN

于 2013-01-23T09:43:35.533 に答える