これが私がしたいことです。
100以上のホストを確認し、そのホストにファイルが存在することを確認したいと思います。ファイルが存在する場合は、ホスト名とコマンド出力を印刷したいと思います。
この例では、3つのホスト(host1.example.org、ホスト2.example.org、ホスト3.example.org)があるとします。ファイルは/etc/foobar
host2.example.orgにありますが、host1.example.orgまたはhost3.example.orgにはありません。
ls -l /etc/foobar
リスト内のすべてのホストで実行したいです。- そのホストにファイルがある場合は、ホスト名とコマンド出力を印刷します。
- ホストにファイルがない場合は、何も印刷されません。私は追加の騒音をしたくない。
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"
答え2
これは私にとって効果的です。
for HOST in $HOSTLIST; do
ssh $HOST '[ -f /etc/passwd ] && echo $(hostname) has file'
done
答え3
set -- host1.example.org host2.example.org
for host; do
ssh "$host" sh -c '[ -e /etc/foobar ] && { printf %s\\n "$1"; ls -ld /etc/foobar; }' _ "$host"
done
答え4
for host in host1 host2 host3 ;do ssh $host 'echo -n "[$(hostname -s)]"; /sbin/ifconfig |grep Bcast' ;done
[host1] inet addr:xxx.xxx.138.30 Bcast:xxx.xxx.143.255 Mask:255.255.248.0 [host2] inet addr:xxx.xxx.138.14 Bcast:xxx.xxx.143.255 Mask:255.255.248.0 [host3] inet addr:xxx.xxx.82.146 Bcast:xxx.xxx.82.255 Mask:255.255.255.128