複数のホストでコマンドを実行しますが、成功した場合にのみコマンドを印刷しますか?

複数のホストでコマンドを実行しますが、成功した場合にのみコマンドを印刷しますか?

これが私がしたいことです。

100以上のホストを確認し、そのホストにファイルが存在することを確認したいと思います。ファイルが存在する場合は、ホスト名とコマンド出力を印刷したいと思います。

この例では、3つのホスト(host1.example.org、ホスト2.example.org、ホスト3.example.org)があるとします。ファイルは/etc/foobarhost2.example.orgにありますが、host1.example.orgまたはhost3.example.orgにはありません。

  1. ls -l /etc/foobarリスト内のすべてのホストで実行したいです。
  2. そのホストにファイルがある場合は、ホスト名とコマンド出力を印刷します。
  3. ホストにファイルがない場合は、何も印刷されません。私は追加の騒音をしたくない。
HOSTLIST="host1.example.org host2.example.org host3.example.org"
for HOST in $HOSTLIST
do
    echo "### $HOST"
    ssh $HOST "ls -ld /etc/foobar"
done

理想的な出力は次のとおりです。

### host2.example.org
drwx------ 3 root root 4096 Apr 10 16:57 /etc/foobar

ただし、実際の出力は次のようになります。

### host1.example.org
### host2.example.org
drwx------ 3 root root 4096 Apr 10 16:57 /etc/foobar
### host3.example.org

私はhost1.example.orgまたはhost3.example.orgの行を印刷したくありません。

echo出力を中かっこで包み込み、吐き出そうとするのに必要なssh操作を行う魔法の構文がわかりません。私は過去に制御文字なしでこれを行ったと確信しています。

HOSTLIST="host1.example.org host2.example.org host3.example.org"
for HOST in $HOSTLIST
do
    # If 'ls' shows nothing, don't print $HOST or output of command
    # This doesn't work
    { echo "### $HOST" && ssh $HOST "ls -ld /etc/foobar" ; } 2>/dev/null
done

ベストアンサー1

この号では、以下を使用することをお勧めします。パフパフ。 psshのおかげで、多くのリモートサーバーで同時に非常に簡単にコマンドを実行できます。

ホストをサーバーごとに1行ずつ(ホスト_ファイルなど)に配置します。例:
host1.tld
host2.tld

使用法:

pssh -h hosts_file "COMMAND"

あなたの例では

pssh -h hosts_file "ls -l /etc/foobar"

おすすめ記事