web-dev-qa-db-ja.com

2016年にDigなしでシェルで外部IPアドレスを取得しますか?

この質問:「 bashで外部IPアドレスを取得するにはどうすればよいですか?

Digを呼び出して質問を解決します。

Dig +short myip.opendns.com @resolver1.opendns.com;

1つのudpパケットが含まれるため、これは可能な限り最速の解決策です。

ただし、それはOpenDNSの1つのサイトにすぎません。代替手段はありますか?

そして、デフォルトでは使用できないDigを使用します。繰り返しますが、代替案はありますか?


:ポート53の(ローカルでもある)リダイレクトのためにOpenDNSサービスがローカルで機能しなかったため、この問題を解決する必要がありました。理由(私はリダイレクトについて忘れていました)。まず、このコマンドを使用して、dnssecが機能しているかどうかを確認します(ローカルでadフラグがありません)。

Dig pir.org +dnssec +multi

また、このコマンドを使用して、ISPがOpenDNS解決をリダイレクトしているかどうかを確認します。

Host -t txt which.opendns.com 208.67.220.220

リダイレクトされている場合、次の回答が得られます:"I am not an OpenDNS resolver."

6
user79743

別の方法はGoogle DNSです。

myip(){   Dig @8.8.8.8 -t txt o-o.myaddr.l.google.com |
          grep "client-subnet" |
          grep -o "\([0-9]\{1,3\}\.\)\{3\}\([0-9]\{1,3\}\)" ;   }

システムにDigがない場合、ホストはまったく同じになります。

myip(){   Host -t txt o-o.myaddr.l.google.com 8.8.8.8 |
          grep -oP "client-subnet \K(\d{1,3}\.){3}\d{1,3}";   }

両方GNU grep(Perlのような-P)と基本(BRE)正規表現が表示されます。

そしてもちろん、元のサイトも動作します。
Digを使用:

myip(){   Dig myip.opendns.com @208.67.220.222  |
          grep "^myip\.opendns\.com\."             |
          grep -o "\([0-9]\{1,3\}\.\)\{3\}\([0-9]\{1,3\}\)"  ; }

そしてホストと:

myip(){   Host myip.opendns.com 208.67.220.222  |
          grep -oP "^myip\.opendns\.com.* \K(\d{1,3}\.){3}(\d{1,3})" ; }

上記の2つのスニペットは、次の4つのOpenDNSリゾルバーアドレスのいずれでも機能します。

echo 208.67.22{0,2}.22{0,2}

直接DNSソリューションが将来失敗する場合は、次のいずれかのサイト(url)にcurlを使用します。

IFS=$'\n' read -d '' -a urls <<-'_end_of_text_'
api.ipify.org
bot.whatismyipaddress.com/
canhazip.com/
checkip.dyndns.com/
corz.org/ip
curlmyip.com/
eth0.me/
icanhazip.com/
ident.me/
ifcfg.me/
ifconfig.me/
ip.appspot.com/
ipecho.net/plain
ipof.in/txt
ip.tyk.nu/
l2.io/ip
tnx.nl/ip
wgetip.com/
whatismyip.akamai.com/
_end_of_text_

次のような配列アドレスを呼び出します。

$ i=5; curl -m10 -L "http://${urls[i]}"
116.132.27.203

一部のサイトではhttpsも機能する場合があります。

8
user79743

これらの項目の多くは、ネットワークトラフィックやこの情報を要求しているサービスを傍受している誰かにあなたを特定できるビーコンであると結論付けました。

プライバシーを保護するサービスにはHTTPSクエリをお勧めします。

wget -qqO- 'https://duckduckgo.com/?q=what+is+my+ip' \
  | grep -Pow 'Your IP address is \K[0-9.]+'

(組み込みシステムまたはその他の制限されたシステムを使用していて、grep -P(libpcre)がない場合は、
… | grep -ow 'Your IP address is [0-9.]*[0-9]' | grep -ow '[0-9][0-9.]*'代わりに)。

あなた(および/またはあなたのIP上の他の人)がプライバシーに配慮した DuckDuckGo 検索エンジンを使用しない場合、おそらくそれはビーコンです(クエリ自体はサードパーティに解読できないかもしれませんが、クエリがあったという事実は多すぎますか?) Googleでも同じことができますが、Googleはwgetおよび同様のユーティリティへのアクセスを明示的に拒否しているため、ユーザーエージェントを偽造する必要があります。

wget -U Mozilla/5.0 -qqO- 'https://www.google.com/search?q=what+is+my+ip' \
  | grep -Po '>\K[0-9.]{7,}(?=<.{0,99}>Your public IP)'

これは、Googleの利用規約に違反する可能性があります。

おそらく、IPv6の場合、正規表現 class[0-9.]から[0-9a-f:]に変更する必要があります。 dual-stack の場合、どのようになるかわかりません。

1
Adam Katz