그렇지 않으면 IP 사례가 서버 이름과 일치합니다.

그렇지 않으면 IP 사례가 서버 이름과 일치합니다.

여러 개의 서버가 있고 트랩 서버가 올바른 트랩 주소를 갖도록 정기적인 검사를 설정하고 싶습니다. 트랩 서버 1은 10.10.10.1이고 트랩 서버 2는 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" ]오타라고 생각합니다. 그렇지 않으면 즉시 오류가 발생합니다 [.

&&둘째, 와 연산자 사이의 관계에 문제가 있습니다 ||. 셸에서는 왼쪽에서 오른쪽으로 처리되므로 조건이 원하는 대로 작동하지 않습니다. 실제로 이는 다음과 같습니다.

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 ...

단어 분리를 피하기 위해 변수를 인용하고 싶습니다.언제 큰따옴표가 필요합니까?

관련 정보