有时,我需要从日志文件中找出特定的日志内容(例如 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
,或者,的、选项。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))
上面的脚本定义了一个名为的新命令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/)并在您的后端上显示结果