
Para el contexto, tengo una infraestructura de varias máquinas que usan ssh. Nos conectamos vía ssh como root en las máquinas sin contraseña gracias al archivo autorizado_keys en cada máquina. Regularmente agregamos nuevas máquinas a nuestra infraestructura.
El problema es crear un script que:
- Hace ping a toda la máquina (al analizar un archivo que contiene todos los nombres de nuestras máquinas)
- Si el ping es exitoso, pruebe la conexión ssh sin contraseña (con el comando
ssh -o BatchMode=yes $machine uname -a
) - Si el ssh no funciona Y se debe a este mensaje:
Are you sure you want to continue connecting (yes/no)?
(porque es la primera conexión ssh a esta máquina, por ejemplo), entonces con un script de espera, envíe "sí" - Si el ssh no funciona Y es porque se solicita una contraseña, entonces con un script expect, envía "CTRL + C"
Mi problema es que las dos condiciones 3. y 4. pueden sucederle a una máquina y no puedo entender cómo usar la instrucción continuar en mi script.
Este caso específico sería para una máquina que solicita un "sí" pero luego también solicita una contraseña.
Así es como se ve el guión:
for machine in `cat ${liste} | grep -v \#`
do
ping -c1 ${machine} 2>&1 >/dev/null
if [ $? -eq 0 ]
then
echo ${machine} >> ${pingok}
ssh -o BatchMode=yes ${machine} uname -a &> $verifssh 2>&1
echo $? > ${exitcode}
if grep -q "255" "$exitcode"
then
cut -c 15-74 $verifssh > $verifssh2
if grep "ication failed." "$verifssh2"
then
expect ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
continue 3
elif grep "Permission denied (publickey,password,keyboard-interactive)." "$verifssh2"
then
expect ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
echo "${machine} -> The machine asks for a password" >> "${sshnok}"
fi
elif grep -q "0" "$exitcode"
then
echo "${machine} works with ssh"
echo "${machine}" >> ${sshok}
fi
else
echo "${machine}" >> "${pingnok}"
fi
done
Aquí está el script esperado (maneja ambas situaciones):
set machine [lindex $argv 0]
spawn ssh $machine
expect {
"Are you sure you want to continue connecting (yes/no)? " {send "yes\r";exp_continue}
-exact "Password: " {close}
-re $prompt {send "exit\r";close}
}
En pocas palabras, mi problema es que, para la máquina que solicita una respuesta "sí" y luego necesita una contraseña, quiero registrarla en el ${sshnok}
archivo pero continue
no funciona. Lo intenté continue
// continue 2
y continue 3
todavía no quiere volver al bucle anterior.
Respuesta1
Como se sugiere en un comentario, dejé el continue
y en lugar de varias, elif
simplemente hice algunas if
declaraciones más:
para máquina encat ${liste} | grep -v \#
do
echo "."
ping -c1 ${machine} 2>&1 >/dev/null
if [ $? -eq 0 ]
then
echo ${machine} >> ${pingok}
ssh -o BatchMode=yes ${machine} uname -a &> $verifssh 2>&1
echo $? > ${exitcode}
if grep -q "255" "$exitcode"
then
cut -c 15-74 $verifssh > $verifssh2
if grep "ication failed." "$verifssh2"
then
expect ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
fi
ssh -o BatchMode=yes ${machine} uname -a &> $verifssh 2>&1
cut -c 15-74 $verifssh > $verifssh2
if grep "Permission denied (publickey,password,keyboard-interactive)." "$verifssh2"
then
expect ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
echo "${machine} -> Probleme de cle ssh (demande un mdp)" >> "${sshnok}"
fi
ssh -o BatchMode=yes ${machine} uname -a &> $verifssh 2>&1
echo $? > ${exitcode}
if grep -q "0" "$exitcode"
then
echo "${machine}" >> ${sshok}
fi
elif grep -q "0" "$exitcode"
then
echo "${machine}" >> ${sshok}
elif grep -q "1" "$exitcode"
then
echo "wtf 1"
fi
else
echo "${machine}" >> "${pingnok}"
fi
done
¡Muchas gracias por todas las respuestas!