Para o contexto, tenho uma infraestrutura de várias máquinas usando ssh. Nós nos conectamos via ssh como root nas máquinas sem senha graças ao arquivo authorized_keys em cada mchine. Estamos adicionando regularmente novas máquinas em nossa infraestrutura.
O problemático é criar um script que:
- Faz ping em toda a máquina (analisando um arquivo contendo todos os nomes de nossas máquinas)
- Se o ping for bem sucedido, teste a conexão ssh sem senha (com o comando
ssh -o BatchMode=yes $machine uname -a
) - Se o ssh não funcionar E é por causa desta mensagem:
Are you sure you want to continue connecting (yes/no)?
(porque é a primeira conexão ssh com esta máquina, por exemplo), então com um script expect, envie "yes" - Se o ssh não funcionar E é porque uma senha é solicitada, então com um script de espera, envie "CTRL + C"
Meu problema é que as duas condições 3. e 4. podem acontecer em uma máquina e não consigo descobrir como usar a instrução continue no meu script.
Este caso específico seria para uma máquina que pede um "sim" mas depois pede senha também.
Aqui está como o script se parece:
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
Aqui está o script esperado (ele lida com ambas as situações):
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}
}
Então, em poucas palavras, meu problema é, para a máquina que pede uma resposta "sim" e depois precisa de uma senha, quero registrá-los no ${sshnok}
arquivo, mas continue
não funciona. Eu tentei continue
// continue 2
e continue 3
ainda não quer voltar no loop anterior.