否则 IP 大小写与服务器名匹配

否则 IP 大小写与服务器名匹配

我有多个服务器,并且想要设置定期检查,以便陷阱服务器具有正确的陷阱地址。 trapserver 1 为 10.10.10.1,trapserver2 为 10.10.10.2。但是,下面的脚本没有看到 10.10.10.x 的 $trapaddress 值与“10.10.10.x”相等?

不确定我哪里出错了?

非常感谢

#!/bin/bash
for LINE in $( cat /home/username/serverslist.txt )
do
SERVER=`(echo $LINE | awk -F : '{ print $1 }')`

echo " "

echo $SERVER
traphost=$( ssh $SERVER -t sudo cat /etc/traphost.txt )
trapaddress=$( ssh $SERVER -t sudo cat /etc/trapaddress.txt )
echo -e " Traphost is $traphost \n Trapaddress is $trapaddress"

if [ $traphost = "trapserver1" ] && [ $trapaddress= "10.10.10.1" ] || [ $traphost = "trapserver2" ] && [ $trapaddress= "10.10.10.2" ] ;
       then
        echo "server is happy."
       else
        echo  " $servername server has incorrect $trapaddress ."
fi
done

答案1

=首先,我认为in之前缺少空格[ $trapaddress= "10.10.10.1" ]是一个错字。如果不是,您会立即收到错误[

&&其次,和运算符之间的关系存在问题||。在 shell 中,它们是从左到右处理的,因此您的条件不会执行您想要的操作。事实上,这个:

if cond1 && cond2 || cond3 && cond4; then ... 

更像是这样:

if ((cond1 && cond2) || cond3) && cond4; then ... 

值得注意的是,它需要条件4是真实的。你想要的是

if ( ... && ...) || ( ... && ... ); then ...

或者

if [[ ... && ... || ... && ... ]]; then ...

[[ .. ]]他们里面具有通常的相对优先级。)

如果需要,您可以连接变量以使比较更容易,假设它们从不包含斜杠:

if [[ "$traphost/$trapaddress" = "trapserver1/10.10.10.1" ||
      "$traphost/$trapaddress" = "trapserver2/10.10.10.2" ]]; then ...

请注意,您要引用变量以避免分词,请参阅什么时候需要双引号?

相关内容