
Para o contexto, tenho uma infraestrutura de múltiplas máquinas usando ssh. Nós nos conectamos via ssh como root nas máquinas sem senha graças ao arquivoauthorized_keys em cada máquina. Adicionamos regularmente novas máquinas à nossa infraestrutura.
A problemática é 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 esperado, envie "sim" - Se o ssh não funcionar E é porque uma senha foi solicitada, então com um script esperado, 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 em meu script.
Este caso específico seria para uma máquina que pede um “sim” mas depois pede senha também.
Aqui está a aparência do script:
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}
}
Resumindo, meu problema é que, para a máquina que pede uma resposta "sim" e depois precisa de uma senha, quero registrá-la no ${sshnok}
arquivo, mas continue
não funciona. Tentei continue
// continue 2
e continue 3
ainda não quer voltar no loop anterior.
Responder1
Conforme sugerido em um comentário, eliminei continue
e, em vez de vários, elif
apenas fiz mais algumas if
declarações:
para máquina emcat ${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
Muito obrigado por todas as respostas!