シェルスクリプトでパブリックIPアドレスを見つける


39

ifconfigまたはhostname -iコマンドを使用してIPアドレスを見つけることができます。

しかし、パブリックIPを見つけるにはどうすればよいですか?

(私は静的なパブリックIPを持っていますが、unixコマンドを使用してそれを見つけたいです)


これをプログラムで実行しようとしていますか?
アンドリューキース

はい、シェルスクリプトで
shantanuo

1
Linux、MacOSX、FreeBSDなどを使用していますか?「ifconfig」の出力はこれらのOSによって異なり、「ip」コマンドはMacOSXには存在しません。コンピューターのIP(ifconfigなどを解析するためのシェルスクリプトが必要)またはルーター(以下のWebサイトが機能する可能性があります)を探していますか?
ステファンLasiewski

回答:


49

curl ifconfig.me

curl ifconfig.me/ip (IPのみ)

curl ifconfig.me/all (詳細については、時間がかかります)

その他のコマンドについては、http//ifconfig.me/#cli_wrapをご覧ください。


1
IPv6アドレスはどうですか?
Matt3o12

そのリンクは死んでいます。代わりにこれを使用できます。curl http://checkip.amazonaws.com/
Farhan.K

@ Farhan.Kはおそらく最良の回答であるため、これを回答として投稿してください。そうでない場合、私はそれを示唆するあなたの名前に言及します
-Aliostad

@Aliostadは自由に投稿できます:)
Farhan.K

@ Farhan.K argh、保護:/
Aliostad

26

リクエストできmyip.opendns.comます。OpenDNSから。 dig @208.67.222.220 myip.opendns.com


8
それはちょうどクールです。覚えやすいバージョンについては、を入力できますdig @resolver1.opendns.com myip.opendns.com。またはWindows上:nslookup myip.opendns.com resolver1.opendns.com
マイケルクロパット

2
私にとって最もdig @208.67.222.220 myip.opendns.com +shortうまくいったのは、答え全体を調べることなく直接IPを取得するためです。
クリストファーチチェ14

18

dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short

dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short

dig -4 @resolver1.opendns.com -t a myip.opendns.com +short


注上記のみこれらのレゾルバのIPv4の現在(なしのために働くことも、現在、IPv6を持っているように見えるが、あなたは省略する-4と、明示的な-t a、あなたは、Googleのを除いて(それが将来的に破壊する危険性がtxt、ためているかもしれないが、実際に仕事をIPv6が1日、Googleによって適切に有効化されている場合))。

myip.opendns.comはを通じてのみ解決可能resolver1.opendns.comであり、そうではないことに注意してください。auth1.opendns.comしたがって、彼らはDNSハイジャックと自分のドメイン名の中間者をやっているようです!したがって、resolver1.opendns.comに対して権限がないため、これを使用してランダムリゾルバのIPを見つけることはできませんmyip.opendns.com

o-o.myaddr.l.google.com最も柔軟で将来性のあるアプローチのように見えることに注意してください。DNSリゾルバーがクライアントサブネットの試験的なEDNS0拡張機能をサポートしているかどうかをテストするのにも役立ちます(ほとんどのリゾルバーがサポートしていない)。

% dig @8.8.8.8 -t txt o-o.myaddr.l.google.com +noall +answer +stats | tail -8
;; global options:  printcmd
o-o.myaddr.l.google.com. 60     IN      TXT     "74.125.189.16"
o-o.myaddr.l.google.com. 60     IN      TXT     "edns0-client-subnet 88.198.54.0/24"
;; Query time: 13 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sun Dec  8 20:38:46 2013
;; MSG SIZE  rcvd: 114

2
@ Matt3o12 <OpenDNSが見つかりました:dig +short AAAA myip.opendns.com @2620:0:ccc::2
bufh

現在、GoogleからTXTレコードを取得する方法はIPv4とIPv6の両方をサポートしているため、特定のIPバージョンを指定する必要がある-4-6どうかが必要です。
マーティン

12

インターネットにアクセスできる場合の非常に簡単なアンサーは次のとおりです。

curl icanhazip.com

IPのサードパーティのソースを信頼することは、そのデータを使用して行うことに特別な意味がある場合は特に問題になる可能性があります。

より信頼できる方法は、既知で信頼できるDNSサーバー(理想的にはDNSSECを実行している)を選択し、DNSサーバーにそのようなエントリが含まれている場合に、ボックスのホスト名を照会することです。

dig @trustworthysource.com +short `hostname`



5

もし

  1. パブリックIPアドレスは1つしかなく、
  2. インターネットに直接接続されている(NAT /プロキシ/ VPNなどなし)

次に、インターフェイスのIPアドレス(「inet addr:」部分)のifconfigからの出力を解析して、すべてのインターフェイスのIPアドレスのリストを取得できます。プライベート範囲にない1つのIPアドレス(http://en.wikipedia.org/wiki/IP_address#IPv4_private_addressesを参照)は、パブリックIPアドレスです。

同じリストは次の方法でも取得できます

ip addr show

解析しやすいかもしれません。

インターネットに直接接続していない場合(NATなど)、外部からの助けがなければパブリックIPアドレスを見つける方法はありません(コンピューターが認識していないため)。その後、他の回答のように行う必要があります。


4

NATトラバーサル用に設計されたSTUNプロトコルを使用して、少し異なるアプローチを取りました。Ubuntuを使用している場合は、次のように入力してパッケージ「stun」をインストールできます。

sudo apt-get install stun

パッケージには、おそらく必要のないSTUNサーバーがインストールされますが、この問題を解決するために使用したSTUNテストクライアントも付属しています。これで、1つの(それほど単純ではない)コマンドでパブリックIPを取得できます。

stun -v stunserver.org 2>&1 1>/dev/null | grep MappedAddress | sed -e 's/.*MappedAddress = //' -e 's/:.*//' | uniq

ここで、stunはパブリックSTUNサーバー "stunserver.org"に接続し、パブリックIPで応答を返します。残りのコマンドは、出力からIPを除外するだけです。


stun.l.google.comの方が高速です:D
Zibri

3

1つの方法は、次のページにリクエストを送信することです。

http://www.biranchi.com/ip.php

システムのIPアドレスを返します


それは... text / htmlのタイプとプレーンテキストを提供しています
bortzmeyer

それはあなたのブラウザにあなたのIPを表示していませんか?

2
しかし、間違ったタイプです。
ボルツマイヤー09

@bortzmeyerええと、「正しいタイプ」とは何ですか?text/htmlその擬似APIが返すものには問題ありません-確かにXMLやJSONではありません。text/plain多分、しかしそれはとして完全に使用可能text/htmlです。
ceejayoz

3
grepを必要としないページに対して+1。またwget -q -O - http://wgetip.com/
xofer

3

GoogleがパブリックIPアドレスを表示するようになりました:http : //www.google.com/search?q= ip


ブラウザでもカールでも、私にとってはうまくいきません。
ラダダダダ

それは奇妙です。最初のserpの前の上部に「私のパブリックIPアドレスはXX.XX.XXX.XX-詳細」とあります。
ジェイクウィルソン

3G接続で作業しました。 詳細はこちらをご覧ください
ラダダダダ

何らかの奇妙な理由でGoogleはUser-Agent、ページに提供される文字列に基づいてIPアドレスのみを表示します。Firefoxでは、動作します。しかし、「Firefox」文字列を無効にしたSeaMonkeyは(「general.useragent.compatMode.firefox」をfalseに設定して)、突然無効になります。SeaMonkeyを含む同等の互換性を備えたGeckoベースのデスクトップブラウザーは他にも多数あるため、GoogleがGeckoだけでなくFirefoxに対してのみこのような機能を明示的に有効にする理由はまったくわかりません。
cnst

curl -qs " google.com/search?q=blowme "|tr"() "" \ n "| grep Client | cut -d": "-f 2 | tr -d" "
Zibri

3

わかりました...これは事後の方法であり、おそらく投稿する価値さえないことを知っていますが、ここに私の有効な解決策があります。

#!/bin/sh

IP="$(ifconfig | egrep 'inet ' | sed -e 's/inet //' -e 's/addr://' -e 's/ Bcast.*//' -e 's/127.*//')"
echo $IP

素敵でシンプル。


2
これは、尋ねられなかった内部IPアドレスを返します。ただし、参考までに、コマンドを使用してこれを行うこともできますhostname -I(大文字の「i」)。
レッサンドロ

3

最も簡単な方法は、提案されているようにhttp://ifconfig.me/を使用することです。

このページでは、取得する情報にどのコマンドを使用するかがわかります。

IPの場合:

curl ifconfig.me
または
curl ifconfig.me/ip

公開ホスト名の場合:

curl ifconfig.me/host

XMLファイルのすべての情報:

curl ifconfig.me/all.xml

など... http://ifconfig.meをチェックしてください


2

私はこれを非常に多くのデバイスから行っていますので、サーバー上で独自の2つのサービスを作成しました:

  1. Webサーバーのルートにあるphpファイル:

    user@host:~$ cat index.php`
    <?php echo $_SERVER['REMOTE_ADDR']; echo "\n" ?>
    

    シェルでの使用:

    $ curl -4 mydomain.com
    79.22.192.12
    

    ipv6でも動作します:

    $ curl mydomain.com
    2a01:e34:ee7d:180::3
    

    netcatの場合:

    $ echo "GET /" | nc myserver.com 80
    2a01:e34:ee7d:180::3
    

    Ciscoルーターの場合:

    router#more http://myserver.com/index.php
    79.22.192.12
    
  2. カスタムtelnetサーバーを使用したクイックハック:xinetdが/ usr / bin / envを生成:

    service telnet
    {
       server           = /usr/bin/env
       socket_type      = stream
       protocol         = tcp
       flags            = IPv6
       wait             = no
       port             = 23
       cps              = 3 30
       passenv          = %a
    }
    

    そして、それへのtelnet:

    $ nc -4 myserver.com 23
    REMOTE_HOST=::ffff:79.22.192.12
    
    $ nc myserver.com 23
    REMOTE_HOST=2a01:e34:ee7d:180::3
    

    ルーターでも同じように機能します。

    router#telnet myserver.com
    79.22.192.12
    

このように、NATまたはプロキシが通信に関与していて、表示されるIPから知りたい場合、内部ネットワークで動作させることができます。

サードパーティのサービスは必要ありません。


2

外部ソースに依存することを避けるために、期待を使用してルーターにtelnetを実行し、そのパブリックインターフェイスのIPアドレスを取得します。次に、スクリプトの例を示します。

#!/usr/bin/expect
if { $argc < 3 } {
puts "usage: ./telnet2router.exp router-ip username password"
return -1
}
set ip [lrange $argv 0 0]
set username [lrange $argv 1 1]
set password [lrange $argv 2 2]

spawn telnet $ip
expect "login:" {
    send "$username\r"
}
expect "Password:" {
    send "$password\r"
}
expect "#" {
    send "ifconfig ppp0 | grep inet\r"
    send "exit\r"
}
expect eof

次に、上記のスクリプトを次のように実行して、パブリックIPを取得します。

./telnet2router.exp <router-ip> <username> <password> | grep "inet addr" | cut -d : -f 2 | cut -d " " -f 1

もちろん、これは、ルーターと、configconfigコマンドが利用可能なLinuxベースのルーターへの管理者アクセス権があるという前提に基づいています。




1

ルーターで外部IPアドレスを見つけたい場合は、ルーター自体にWANアドレスを要求するか、外部の誰かにそれを取得してもらいます。

手動の方法では、上記のサイトのいずれかを参照して、着信リクエストのIPを返します。

自動化された方法については、あなたが試すことができます:

wget -q -O - http://www.ipaddressworld.com | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}'\. 

これにより、HTTP応答のIPアドレスを含む行が取得され、sed、awkなどで解析されます。


0

シェルだけを使用して外部IPを確認し、外部プロバイダーも使用できます。

#!/bin/bash
TCP_HOST="checkmyip.com"
TCP_PORT=80              
exec 5<>/dev/tcp/"${TCP_HOST}"/"${TCP_PORT}"
echo -e "GET / HTTP/1.0\nHOST:${TCP_HOST}\n" >&5
while read -r line 
do  
    case "$line" in
        *"Your local IP address is"* ) 
            line="${line#*Your local IP address is&nbsp;}"
            line=${line%%</p>*}
            echo "Your ip is: $line"
            exec >&5-
            exit
            ;;            
    esac
done <&5

出力


0
lynx --dump http://www.whatismyip.com/ | grep -o '[0-9]。* \。[0-9]。* \。[0-9]。* \。[0-9]。*'
-m1 

0

私はこれをします。サードパーティの関与なしにIPを提供するだけです。

ip addr show | grep eth0 | grep inet | tr -s "" | cut -f3 -d "" | cut -f1 -d "/"


3
彼は自分のパブリックIPアドレスが必要です。ローカルではありません。
ジェイクウィルソン


0

ここに、消え去るかフォーマットを変更するかもしれない「公共サービス」サイトではなく、動的IPの管理に関してビジネスが解決するホストに依存する別の選択肢があります。

1)多くの無料の動的DNSサービス(no-ip.comなど)のいずれかにサーバーを登録します。これにより、xxx.no-ip.orgのようなDNSエントリが得られます。

2)サービスの動的更新ツールをインストールします(IPの変更をサービスに報告します)。

スクリプトでIPアドレスを取得するには、次のようにします。

$external_ip = `dig +short xxx.no-ip.org`

ダイナミックIPが変更され、いくつかの構成エントリを変更する必要があるかどうかを確認するために、cronジョブで使用するのに最適です。


0

OS Xには、プライベートIPとパブリックIPの両方を取得する2つの簡単なソリューションがあります(LaunchBarを使用する場合はボーナスコード付き)。

プライベートIP

$ ipconfig getifaddr $1
# $1=en0 || en1 || en*

LaunchBarスクリプト

#!/bin/sh

title="$USER@$(HOSTNAME -s)"
text=$(ipconfig getifaddr en1)

open "x-launchbar:large-type?font-name=TerminalDosis-Light&string=$text&title=$title"

パブリックIP

$ dig +time=1 +tries=1 +retry=1 +short myip.opendns.com @resolver1.opendns.com
# ||    
$ curl $1
# $1=http://wtfismyip.com/text || http://ip-addr.es || http://icanhazip.com || http://wgetip.com || http://ident.me || http://ifconfig.me || https://shtuff.it/myip/short || http://curlmyip.com

LaunchBarスクリプト

#!/bin/sh

title="$USER@$(HOSTNAME -s)"
text=$(dig +time=1 +tries=1 +retry=1 +short myip.opendns.com @resolver1.opendns.com)

open "x-launchbar:large-type?font-name=TerminalDosis-Light&string=$text&title=$title"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.