
Для контекста, у меня есть инфраструктура из нескольких машин, использующих ssh. Мы подключаемся через ssh как root на машинах без пароля благодаря файлу authorized_keys на каждой машине. Мы регулярно добавляем новые машины в нашу инфраструктуру.
Проблема состоит в том, чтобы создать сценарий, который:
- Проверяет все машины (анализируя файл, содержащий все имена наших машин)
- Если пинг прошел успешно, проверьте соединение ssh без пароля (с помощью команды
ssh -o BatchMode=yes $machine uname -a
) - Если ssh не работает И это из-за этого сообщения:
Are you sure you want to continue connecting (yes/no)?
(например, потому что это первое ssh-подключение к этой машине), то с помощью скрипта expect отправьте «yes» - Если ssh не работает И это происходит из-за того, что запрашивается пароль, то с помощью скрипта expect отправьте "CTRL + C"
Моя проблема в том, что оба условия 3 и 4 могут произойти на одной машине, и я не могу понять, как использовать оператор continue в моем скрипте.
Этот конкретный случай касается машины, которая запрашивает «да», но после этого также запрашивает пароль.
Вот как выглядит скрипт:
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
Вот ожидаемый сценарий (он обрабатывает обе ситуации):
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}
}
Итак, вкратце, моя проблема в том, что для машины, которая запрашивает ответ "да", а затем требует пароль, я хочу зарегистрировать их в файле, ${sshnok}
но это continue
не работает. Я попробовал continue
/ continue 2
/ continue 3
, и он все еще не хочет возвращаться в предыдущий цикл.
решение1
Как и было предложено в комментарии, я удалил continue
и вместо нескольких elif
просто добавил еще несколько if
утверждений:
для машины вcat ${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
Большое спасибо за все ответы!