![複数のサーバー上で SSH 経由でログファイルを grep する方法は?](https://rvso.com/image/1346544/%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E4%B8%8A%E3%81%A7%20SSH%20%E7%B5%8C%E7%94%B1%E3%81%A7%E3%83%AD%E3%82%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%20grep%20%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%3F.png)
場合によっては、ログ ファイルから特定のログ コンテンツ (API 呼び出しなど) を見つける必要がありますが、それらのログ ファイルは複数の Linux サーバーに存在します。
すべてのサーバーにログインするには SSH を使用し、grep を使用してログを検索する必要があります。現在、このジョブを自動的に完了するシェルを作成する予定です。ただし、シェルに「ssh」を入れて実行しようとすると、常にパスワード入力が必要になり、画面にメッセージが表示されます。
パスワード入力に関する警告メッセージが表示されないようにする方法はありますか? または、複数のサーバーで「grep」の使用をサポートする方法はありますか?
本番サーバーでこの変更を実行できるため、SSHキー認証は使用できません。
結果をWebページ(JSP、PHPなど)で提供し、バックエンドでJavaによってそのシェルを実行することも計画しているからです。
答え1
公開鍵認証や Kerberos 認証の代わりに、マスター接続を使用することもできます。これは通常、~/.ssh/config
クライアントのファイルに以下を追加することで行われます。
Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
その後、すでにサーバーに接続している場合は、別のセッションを開いてもパスワードは求められず、最初の接続が再利用されます。したがって、すべてのサーバーへの接続を開いたままにしておけば、スクリプトでパスワードを入力する必要はなくなります。
ControlMaster
の、、オプション、または の、、オプションを参照ControlPath
してください。ControlPersist
ssh_config(5)
-O
-S
ssh(1)
答え2
この質問に答えるのは本当に遅くなりましたが、ファブリック次のように fabfile.py を記述します。
from fabric.api import *
env.roledefs = {
'dev': ['dev_a', 'dev_b'],
'pro': ['pro_a', 'pro_b', 'pro_c', 'pro_d']
}
env.user = 'foobar'
env.shell = 'rbash -l -c'
env.disable_known_hosts = True
logfile = '/path/to/logfile.txt'
def g(pattern):
with settings(warn_only=True):
run('grep -H --color "{0}" {1}'.format(pattern, logfile))
上記のスクリプトは、新しいコマンドを定義します。グパターンを入力として受け入れる場合は、次のようにスクリプトを実行できます。
fab -R dev -p my_pwd g:"some pattern"
役割によって定義されたホストで「何らかのパターン」をgrepする開発。
答え3
公開鍵認証は使用できないため、ログイン プロセスを繰り返さなくても済むように、最初の回答で説明した方法を使用する方がよいでしょう。ただし、複数のサーバーに接続するスクリプトを作成するのは比較的簡単です。
#!/usr/bin/env bash
hosts=(ipaddr1 ipaddr2 ipaddr3) # or host names
user=username # your user on host
log=/tmp/mylog # result of grepping
for host in ${hosts[@]}; do
echo "== $host ==" >> $log
ssh -l $user $host "grep some_pattern /path/to/logfile 2>&1" >> $log
done
less $log # view result
まだテストしていませんが、動作するはずです。これが必要なものではない場合はお知らせください。
答え4
grep4j を使うだけです (グーグル)をバックエンドで実行し、結果をjsp/phpに表示します。