如何在多台服务器上通过 SSH 搜索日志文件?

如何在多台服务器上通过 SSH 搜索日志文件?

有时,我需要从日志文件中找出特定的日志内容(例如 api 调用),这些日志文件存在于多个 Linux 服务器中。

我必须使用 SSH 登录每个服务器并使用 grep 搜索日志。现在,我计划编写一个 shell 来自动完成这项工作。但是当我尝试将“ssh”放入 shell 中并执行它时,它总是需要输入密码并在屏幕上显示消息。

有没有办法确保输入密码时不会出现警告消息?或者有没有办法支持在多台服务器上使用“grep”?

我无法使用 SSH 密钥验证,因为我可以在生产服务器上进行此更改

因为我也计划在网页上提供结果(如JSP,PHP),并在后端通过Java执行该shell。

答案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))

上面的脚本定义了一个名为的新命令G接受一个模式作为输入,你可以使用以下命令运行脚本:

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 (https://code.google.com/p/grep4j/)并在您的后端上显示结果

相关内容