2012-09-05 7 views
9

Mi equipo administra muchos servidores, y la política de la compañía establece que las contraseñas en estos servidores se deben cambiar cada dos semanas. A veces, nuestra base de datos oficial de contraseñas se desactualiza por cualquier motivo (la gente olvida actualizarla, generalmente), pero no podemos identificar esto a veces hasta meses después, ya que no utilizamos sistemáticamente todos los servidores.Cómo usar bash/espero verificar si funciona un inicio de sesión SSH

Quiero escribir un script que raspe las contraseñas de la base de datos y use esas contraseñas para intentar un inicio de sesión (ssh) en cada servidor cada noche y envíe un correo electrónico con los resultados al equipo. Puedo rastrear la base de datos para obtener información de inicio de sesión, pero No estoy seguro de cómo comprobar si el inicio de sesión de ssh fue exitoso o no en esperar.

No puedo usar la autenticación de clave pública para esta tarea. I quiero autenticación de contraseña para poder verificar las contraseñas.

que deshabilitar la autenticación de clave pública especificando el siguiente archivo:

PasswordAuthentication=yes 
PubkeyAuthentication=no 

Mis intentos en el guión esperar:

# $1 = host, $2 = user, $3 = password, $4 = config file 
expect -c "spawn ssh [email protected]$1 -F $4 
expect -re \".*?assword.*?\" 
send \"$3\n\" 
... 
send \'^D\'" 

pensé que tal estado de salida podría indicar el éxito? Sin embargo, no pude encontrar nada en las páginas de manual.

+0

¿Quién cambia la contraseña? Quizás también deberían ser responsables de actualizar la base de datos. Poner la contraseña en este tipo de script parece frustrar el propósito de cambiar la contraseña con frecuencia. – chepner

+1

La contraseña no entra en el script. Las contraseñas se eliminan de una base de datos y se pasan como argumentos de línea de comandos al script, lo cual tiene mucho sentido para mí. Y a pesar de que las personas tienen la responsabilidad de actualizar la base de datos, a menudo no lo hacen. Esta es una verificación de cordura para asegurarse de que todas las contraseñas de la base de datos sean correctas. – BlackSheep

Respuesta

6

He estado usando algo así como la secuencia de comandos a continuación para una tarea similar.

#!/bin/sh 
# Run using expect from path \ 
exec expect -f "$0" "[email protected]" 
# Above line is only executed by sh 
set i 0; foreach n $argv {set [incr i] $n} 
set pid [ spawn -noecho ssh [email protected]$3 $4 ] 
set timeout 30 
expect { 
    "(yes/no)" { 
     sleep 1 
     send "yes\n" 
     exp_continue 
    } 
    "(y/n)" { 
     sleep 1 
     send "y\n" 
     exp_continue 
    } 
    password { 
     sleep 1 
     send "$2\n" 
     exp_continue 
    } 
    Password { 
     sleep 1 
     send "$2\n" 
     exp_continue 
    } 
    "Last login" { 
     interact 
    } 
    "Permission denied" { 
     puts "Access not granted, aborting..." 
     exit 1 
    } 
    timeout { 
     puts "Timeout expired, aborting..." 
     exit 1 
    } 
    eof { 
     #puts "EOF reached." 
    } 
} 
set status [split [wait $pid]] 
set osStatus [lindex $status 2] 
set procStatus [lindex $status 3] 
if { $osStatus == 0 } { 
    exit $procStatus 
} else { 
    exit $procStatus 
} 
+0

No puedo ejecutar su secuencia de comandos: recibo errores como "no suchfor foreach" y problemas con los refuerzos. ¿En qué capa lo ejecutas? – BlackSheep

+0

Esto se ejecuta en RHEL5 (expect-5.43.0). – crowbent

+0

En la parte superior, ¿tiene algo como #!/Usr/bin/expect -F? Espero 5.45 en Ubuntu. – BlackSheep

0

¿Necesita verificar específicamente si puede obtener un intérprete de comandos o está intentando ejecutar un comando también OK?

Si sólo desea comprobar la autenticación, es posible que desee hacer ssh asimplecommand (usando echo, hostname, o algo así) y compruebe si se obtiene el resultado esperado.

Es posible que también desee iniciar ssh con la opción -v, y buscar Authentication succeeded (en el nivel de registro de depuración 1).

0

La solución al problema subyacente (que la base de datos de contraseñas no se sincronice) es usar la autenticación de clave pública. Para todo el mundo. NO te molestes con las contraseñas cuando se trata de SSH.

una entrada correcta se pudo comprobar de esta manera:

ssh -o PasswordAuthentication=no [email protected] 'exit' || echo "SSH login failed." 
+4

Ver nota en la parte superior de la publicación – BlackSheep

+1

El problema con este comando es que - pedirá una contraseña 3 veces, que es pegar puntos en la secuencia de comandos. –

0

crowbent ha proporcionado usted un script para probar espera de inicio de sesión ssh sin embargo, recomendaría el uso de Non-interactive ssh password auth para poner a prueba SSH/SFTP. sshpass es mucho más seguro y menos propenso a errores de lo esperado.

Cuestiones relacionadas