我正在尝试检查阵列中的所有服务器,以查看它们是否配置了SSH无密码信任。
如果不是,我想打印服务器详细信息,并不断遍历数组元素(ips),直到所有元素都被检查为止。
(我想有机会在退出之前打印出所有错误的内容。)
我尝试了以下方法,但是在遇到第一个未配置的服务器后,它退出了循环:
for svr in "${table[@]}"
do
SSH=$(ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no $svr echo)
if $(echo [ $? -ne 0 ])
then echo "Trust is not configured for ${table[$svr]}"
exit "$SOME"
else
:
fi
done
我在做什么错了?
答案 0 :(得分:1)
好吧,直接的问题是循环中间有一个exit
命令...实际上,当脚本到达该点时,它将退出脚本。如果您不希望它在循环完成之前退出,请将exit
命令放在之后。
但是您还要检查ssh
是否以真的怪异的方式成功。除非涉及到我不了解的东西,否则只需将ssh
命令直接置于if
条件下,并用>/dev/null 2>&1
放弃其输出:
for svr in "${table[@]}"
do
if ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no $svr echo >/dev/null 2>&1
then
echo "Trust is not configured for $svr"
fi
done
exit "$SOME"
请注意,我还固定了对${table[$svr]}
的引用(这没有任何意义),并删除了else
子句(没有执行任何操作)。另外,$SOME
是什么?
编辑:如果要在任何服务器连接失败时退出它,则需要在循环运行时跟踪是否有失败,然后使用它来控制它是否最后退出。
failures=0
for svr in "${table[@]}"
do
if ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no $svr echo >/dev/null 2>&1
then
echo "Trust is not configured for $svr"
((failures++))
fi
done
if ((failures>0))
then
exit
fi