複数のサーバーがあり、トラップサーバーが正しいトラップアドレスを持つように定期的なチェックを設定したいと思います。トラップ サーバー 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 ...
単語の分離を避けるために変数を引用したいと思います。いつ二重引用符が必要ですか?