![Como fazer o grep do arquivo de log via SSH em vários servidores?](https://rvso.com/image/1346544/Como%20fazer%20o%20grep%20do%20arquivo%20de%20log%20via%20SSH%20em%20v%C3%A1rios%20servidores%3F.png)
Às vezes, preciso descobrir o conteúdo de log específico (como chamada de API) dos arquivos de log; esses arquivos de log existem em vários servidores Linux.
Eu tenho que usar o SSH para fazer login em todos os servidores e usar o grep pesquisando o log. No momento, pretendo escrever um shell para concluir este trabalho automaticamente. Mas quando tentei colocar o "ssh" em um shell, eu o executo, ele sempre precisa inserir a senha e mostrar a mensagem na tela.
Existe alguma maneira de garantir que não haja nenhuma mensagem de alerta sobre a entrada da senha? Ou existe alguma maneira de oferecer suporte ao uso de "grep" em vários servidores?
Não consigo usar a autenticação de chave SSH, pois posso fazer essa alteração em servidores de produção
Porque também pretendo fornecer o resultado na página da web (como JSP, PHP.) e executar esse shell por Java no backend.
Responder1
Uma alternativa à autenticação de chave pública ou autenticação Kerberos é usar conexões mestres. Isso normalmente é feito adicionando isto ao ~/.ssh/config
arquivo no cliente:
Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
Depois disso, se você já estiver conectado a um servidor, abrir outra sessão não solicitará sua senha e reutilizará a primeira conexão. Portanto, se você mantiver conexões abertas com todos os seus servidores, seu script nunca precisará de nenhuma senha.
Veja as opções ControlMaster
, ControlPath
, ControlPersist
em ssh_config(5)
ou, alternativamente, as opções -O
, -S
de ssh(1)
.
Responder2
Estou muito atrasado para responder a esta pergunta, mas você poderia usarTecido. Você poderia escrever um fabfile.py como:
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))
O script acima define um novo comando chamadogse aceita um padrão como entrada, você pode executar o script com:
fab -R dev -p my_pwd g:"some pattern"
para grep "algum padrão" em hosts definidos por funçãodesenvolvedor.
Responder3
Como você não pode usar a autenticação de chave pública, provavelmente será melhor usar o método descrito na primeira resposta para evitar repetir o processo de login. Porém, criar um script para conectar-se a vários servidores deve ser relativamente simples:
#!/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
Eu não testei isso, mas deve funcionar. Por favor, diga-me se não é isso que você precisa.
Responder4
basta usar grep4j (https://code.google.com/p/grep4j/) em seu back-end e exibir os resultados em seu jsp/php