![¿Cómo acceder al archivo de registro a través de SSH en varios servidores?](https://rvso.com/image/1346544/%C2%BFC%C3%B3mo%20acceder%20al%20archivo%20de%20registro%20a%20trav%C3%A9s%20de%20SSH%20en%20varios%20servidores%3F.png)
En algún momento, necesito averiguar el contenido de registro específico (como la llamada a la API) de los archivos de registro, esos archivos de registro existen en varios servidores Linux.
Tengo que usar SSH para iniciar sesión en cada servidor y usar grep para buscar en el registro. En este momento, planeo escribir un shell para finalizar este trabajo automáticamente. Pero cuando intenté poner el "ssh" en un shell, lo ejecuto, siempre necesita ingresar la contraseña y mostrar el mensaje en la pantalla.
¿Hay alguna forma de asegurarse de que no haya ningún mensaje de alerta sobre la entrada de la contraseña? ¿O hay alguna forma de admitir el uso de "grep" en varios servidores?
No puedo usar la autenticación de clave SSH porque puedo hacer este cambio en servidores de producción.
Porque también planeo proporcionar el resultado en una página web (como JSP, PHP...) y ejecutar ese shell mediante Java en el backend.
Respuesta1
Una alternativa a la autenticación de clave pública o la autenticación Kerberos es utilizar conexiones maestras. Normalmente, esto se hace agregando esto al ~/.ssh/config
archivo del cliente:
Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
Después de eso, si ya está conectado a un servidor, al abrir otra sesión no se le solicitará su contraseña y se reutilizará la primera conexión. Entonces, si mantiene conexiones abiertas a todos sus servidores, su secuencia de comandos nunca necesitará ingresar ninguna contraseña.
Consulte las opciones de , ControlMaster
en o , alternativamente, las opciones de .ControlPath
ControlPersist
ssh_config(5)
-O
-S
ssh(1)
Respuesta2
Llego muy tarde para responder esta pregunta, pero podrías usarTela. Podrías escribir un 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))
El script anterior define un nuevo comando llamadogramoacepta un patrón como entrada, puede ejecutar el script con:
fab -R dev -p my_pwd g:"some pattern"
grep "algún patrón" en los hosts se define por funcióndesarrollador.
Respuesta3
Como no puede utilizar la autenticación de clave pública, probablemente sea mejor que utilice el método descrito en la primera respuesta para evitar tener que repetir el proceso de inicio de sesión. Sin embargo, crear un script para conectarse a varios servidores debería ser relativamente sencillo:
#!/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
No lo he probado, pero debería funcionar. Por favor dime si esto no es lo que necesitas.
Respuesta4
solo usa grep4j (https://code.google.com/p/grep4j/) en su backend y muestre los resultados en su jsp/php