host
IPコマンドを実行した後、リストにドメイン+ TLDがあることを確認しようとしています。
私のスクリプトは次のとおりです
while read ip; do
PTR=$(host $ip | rev | cut -d" " -f1 | rev | sed 's/\.$//')
if grep -q "$PTR" list.txt
then
echo "Match in list"
else
echo "No match in list"
fi
done <ips.txt
内容は次のlist.txt
とおりです。
dns.google
shodan.io
8.8.8.8のスクリプトを実行すると、次のものが返されます。Googleドメインスクリプトが期待どおりに動作します。 198.20.99.130に対して実行すると、結果は次のようになるため失敗します(一致しません)。人口調査 4.shodan.io。
grep
大会に参加する方法はありますか?ただリストにドメイン名+ TLD(この場合shodan.io)はありますか?
しかし、人口調査 4.shodan.ioこのようなドメインであるlist.txtと一致する必要があります。shodan.io.example.netだからではありません。
答え1
完全な文字列一致ではなく部分正規表現を実行するため、既存のコマンドは失敗します。また、非常に遅く、移植性がありません。
代わりにこれを行う:
< ips.txt xargs -n 1 host |
awk '
NR==FNR { list[$0]; next }
{
n = split($NF,f,/[.]/)
domtld = f[n-2] "." f[n-1]
print (domtld in list ? "Match" : "No match"), "in list"
}
' list.txt -
Match in list
Match in list
上記のコードはより速く実行され、より強力であり、さまざまな他のコマンドへの複数のパイプを持つシェルループよりも移植性に優れています。一度に1行ずつxargs
呼び出して(したがってループを作成する必要はありません)、出力を単一のスクリプトにパイプ処理するために使用されます。スクリプトは起動時に一度読み込み(ループ+ grepソリューションのようにドメインごとに1回ではなく)名前付き配列に値を保存し、一度に1行ずつ出力を取得し、ドメイン+ tldを分離してハッシュを使用します。目的の出力を印刷するために配列にあることを確認してください。部分一致や既存のコマンドなどの正規表現メタ文字について心配する必要はありません。すべてが完全なリテラル文字列で動作します。host
list.txt
awk
awk
list.txt
list[]
host
list
grep