1

ホスト sub.domain.com で IP 111.222.333.444 がまだ有効かどうかを確認するには、cron と bash を使用する必要があります。

-Pzo でgrepを試しましたが、うまくいきませんでした。pcregrepをインストールしたくありません。

#!/bin/bash

ipaddressused=$1

#Run a dig for sub.domain.com:

ipaddresscurrent='dig +short sub.domain.com'

echo "$ipaddresscurrent" | grep -Pzo "$ipaddressused" && echo "found" && exit 0 || echo "not found" && exit 1

ipaddresscurrentは、1 行に 1 つずつ、複数の IP を返します。

どうすればこれを機能させることができますか?

4

1 に答える 1

2

これで十分ではないでしょうか?

#!/bin/bash

ipaddressused=$1

if grep -q -P "$ipaddressused" < <(dig +short sub.domain.com); then
    echo "found"
    exit 0
else
    echo "not found"
    exit 1
fi

スクリプトのどこが間違っていましたか?

  • この線

    ipaddresscurrent='dig +short sub.domain.com'
    

    dig +short sub.domain.com文字列を変数に割り当てますipaddresscurrent。おそらく、代わりに、コマンドipaddresscurrent出力を変数に割り当てたいと思ったでしょう。これは、古い非推奨のバッククォートを使用して行われます。 dig +short sub.domain.com

    ipaddresscurrent=`dig +short sub.domain.com`
    

    (ただし、バッククォートは絶対に使用しないでください!) または、次のように、よりモダンで堅牢でネスト可能な$(...)もの:

    ipaddresscurrent=$(dig +short sub.domain.com)
    
  • grep -Pzoあなたが期待していることを本当にしません。代わりに、grep 静かに実行して(したがって-qフラグ)、その出力を確認する必要があるため、次のようにします。

    echo "$ipaddresscurrent" | grep -q -P "$ipaddressused" && echo "found" && exit 0 || echo "not found" && exit 1
    

変数は実際には必要ないので、プロセス置換を feedipaddresscurrentに使用することを好みました。grep

また、'' の長いチェーンを使用しないでください&& || &&。読みにくく、微妙な副作用が生じる可能性があります。

変数に固執したい場合は、ヒアストリングが必要です。

#!/bin/bash

ipaddressused=$1
ipaddresscurrent=$(dig +short sub.domain.com)

if grep -q -P "$ipaddressused" <<< "$ipaddresscurrent"; then
    echo "found"
    exit 0
else
    echo "not found"
    exit 1
fi

あなたのコメントで指摘したように:

提供された $ipaddressused が 111.222.333.4 で、リストに 111.222.333.456 が存在する場合も一致することに注意してください。これは問題を引き起こす可能性があります。

これが要求された機能であるかどうかは、実際にはわかりませんでした (スクリプトの引数が正規表現であるため、-Pフラグを外したのはそのためです)。IP を完全に一致させたい場合は、次のように進めます。

#!/bin/bash

if grep -q "^${1//./\.}$" < <(dig +short sub.domain.com); then
    echo "found"
    exit 0
else
    echo "not found"
    exit 1
fi

digこのように使用すると、1 行に 1 つの ip しか出力されないと仮定します。

于 2013-07-02T18:20:01.583 に答える