我正在尝试检查服务器列表的连接。我想遍历列表,检查连接是否正常,如果可以,请执行一些操作,否则请回显问题消息。
我的问题是:
该脚本将在第一个节点处停止而不回显$?。
那么,我的for循环怎么了?
这些var包含在配置文件中:
$nodes
是服务器IP的列表,例如1.1.1.1,2.2.2.2,10.10.10.10
$user
是一个字符串
for node in $(echo $nodes | sed "s/,/ /g")
do
echo "Checking Node: $node"
ssh -q -o ConnectTimeout=3 $user@$node echo ok
echo $?
if [[ $? != 0 ]]
then
echo "Problem in logging into $node"
else
# do some stuff here
fi
done
编辑#1:
for node in $(echo $nodes | sed "s/,/ /g")
do
echo "Checking Node: $node"
ssh -q -t -o ConnectTimeout=3 $user@$node "echo ok"
retcode=$?
echo $retcode
if [[ "$retcode" -ne 0 ]]
then
echo "Problem in logging into $node"
else
echo "OK"
fi
done
答案 0 :(得分:0)
您可以添加-t
来创建虚拟终端,并在命令中添加引号:
ssh -q -t -o ConnectTimeout=3 ${user}@${node} "echo ok"
也使用-ne
代替用于比较字符串的!=
if [[ "$?" -ne 0 ]]
还echo $?
弄乱了返回码。您应该使用类似以下内容的
ssh -q -t -o ConnectTimeout=3 ${user}@${node} "echo ok"
retcode=$?
echo $retcode
if [[ "$retcode" -ne 0 ]]
您可以像这样重写ssh
命令,以避免ssh
主机密钥出现问题
ssh -q -t -o StrictHostKeyChecking=no -o ConnectTimeout=3 ${user}@${node} "echo ok"
答案 1 :(得分:0)
这是因为ssh首先要求您验证主机的权限,如果您接受该权限,它将要求输入密码。这就是为什么您的命令不返回外壳程序并等待输入的原因。
如果您的目的只是验证ssh连接,那么您可以考虑使用
telnet <your_host> <port> < /dev/null
但是,如果要运行某些命令,则需要主机之间的信任关系。在这种情况下,您可以使用:
执行以下命令:
ssh-keygen -t rsa
然后
ssh-copy-id -i root@ip_address
现在您可以连接
ssh <user>@<host>