Como grep logfile via SSH em vários servidores?

0

Em algum momento, preciso descobrir 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 logar todos os servidores e usar o grep pesquisando o log. Agora, eu pretendo escrever um shell para terminar este trabalho automaticamente. Mas quando eu tentei colocar o "ssh" em um shell, eu o executo, ele sempre precisa de entrada de senha e mostra a mensagem na tela.

Existe alguma maneira de garantir que não haja uma mensagem de alerta sobre a entrada da senha? Ou existe suporte para usar o "grep" em vários servidores?

Não consigo usar a autenticação de chave SSH, pois posso fazer essa alteração nos servidores de produção

Porque eu também pretendo fornecer o resultado na página da web (como JSP, PHP.) e executar esse shell pelo Java no backend.

    
por udo 12.01.2013 / 13:09

4 respostas

3

Uma alternativa para autenticação de chave pública ou autenticação Kerberos é usar conexões mestre. Isso geralmente é feito adicionando-se isso ao arquivo ~/.ssh/config no cliente:

Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p

Depois disso, se você já estiver conectado a um servidor, a abertura de 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 entrada de senha.

Veja as opções ControlMaster , ControlPath , ControlPersist em ssh_config(5) ou, alternativamente, as opções -O , -S de ssh(1) .

    
por 13.01.2013 / 12:24
1

Como você não pode usar autenticação de chave pública, provavelmente é melhor usar o método descrito na primeira resposta para evitar a repetição do processo de login. Fazer um script para se conectar 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, me diga se isso não é o que você precisa.

    
por 13.01.2013 / 13:31
1

use o grep4j ( link ) no seu back-end e exiba os resultados no seu jsp / php

    
por 22.03.2014 / 17:45
0

Estou muito atrasado para responder a esta pergunta, mas você pode usar o Tecido . 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 chamado g o 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" nos hosts define por função dev .

    
por 21.03.2017 / 16:21