有時,我需要從日誌檔案中找出特定的日誌內容(例如api呼叫),這些日誌檔案存在於多個Linux伺服器中。
我必須使用 SSH 登入每台伺服器並使用 grep 搜尋日誌。現在,我打算寫一個shell來自動完成這項工作。但是當我嘗試將“ssh”放入外殼中並執行它時,它總是需要輸入密碼並在螢幕上顯示訊息。
有沒有辦法確保沒有關於密碼輸入的警報訊息?或者是否有辦法支援在多個伺服器上使用“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/) 在你的後端並在你的 jsp/php 上顯示結果