
次の詳細を含む ip.txt ファイルがあります。
cat ip.txt
10.10.100.11 10.10.100.12
10.10.100.21 10.10.100.22
10.10.100.101
10.10.100.31 10.10.100.32
10.10.100.201
eof
1行にスペースで区切られた2つのIPがある場合、1つはアクティブサーバー、もう1つはパッシブサーバーです。 IPが1つしかない場合、そのIPはアクティブサーバーにすぎません。
そのため、スクリプトがファイルを確認し、そのアクティブip.txt
サーバーにのみログインして出力を取得したいと思います。ps -ef| grep pmon
答え1
このawk
ユーティリティを使用して、ファイルの各行からスペースで区切られた最初のフィールドを抽出できます。
各 IP 番号出力に対してシェルを使用してリモートawk
でssh
コマンドを実行できます。リモートホストでps -ef
フィルタリングを行う必要はありません。grep
#!/bin/sh
awk '{ print $1 }' ip.txt |
while IFS= read -r remote; do
printf 'Processing %s...\n' "$remote"
ssh -n "$remote" ps -ef | grep -F pmon
done
-n
withオプションを使用すると、残りの出力ssh
を読み取ることができませんawk
。
-F
option を使用すると、grep
ユーティリティは正規表現一致ではなくテキスト文字列比較で指定されたパターンを使用します。このオプションを使用しても、現在のコードに対する何も変更されず、実行速度も速くなりません(このssh
コマンドはおそらくこのスクリプトのボトルネックになる可能性があります)。それにもかかわらず、これは正規表現ではなくテキスト文字列を使用して検索していることを読者に知らせます。
awk
ループ内の入力ファイルからスペースで区切られた2つの値を読み取り、2番目の値を無視すると、このコードを簡単に削除できます。
#!/bin/sh
while read -r remote dummy; do
printf 'Processing %s...\n' "$remote"
ssh -n "$remote" ps -ef | grep -F pmon
done <ip.txt
ホストグループを管理するためのより永続的なソリューションが必要な場合は、Ansibleなどのソリューションに移行することを検討してください。