对于上下文,我有一个使用 ssh 的多台机器的基础设施。我们通过 ssh 在没有密码的机器上以 root 身份连接,感谢每台机器上的 authorized_keys 文件。我们定期在我们的基础设施中添加新机器。
有问题的是创建一个脚本:
- ping 所有机器(通过解析包含我们所有机器名称的文件)
- 如果 ping 成功,请在没有密码的情况下测试 ssh 连接(使用命令
ssh -o BatchMode=yes $machine uname -a
) - 如果 ssh 不起作用并且是因为此消息:(
Are you sure you want to continue connecting (yes/no)?
例如,因为它是与这台机器的第一个 ssh 连接),那么使用期望脚本,发送“yes” - 如果 ssh 不起作用并且是因为要求输入密码,那么使用期望脚本,发送“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
正如评论中所建议的,我确实放弃了
continue
and 而不是多个elif
我只是做了更多的if
陈述:机器进
cat ${liste} | grep -v \#
非常感谢您的所有回答!