複数のサーバー上で SSH 経由でログファイルを grep する方法は?

複数のサーバー上で SSH 経由でログファイルを grep する方法は?

場合によっては、ログ ファイルから特定のログ コンテンツ (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してください。ControlPersistssh_config(5)-O-Sssh(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に表示します。

関連情報