web-dev-qa-db-ja.com

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

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

しかし、どうすればパブリックIPを見つけることができますか?

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

40
shantanuo

curl ifconfig.me

curl ifconfig.me/ip(IPのみ)

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

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

49
tsanand129

myip.opendns.com。 OpenDNSから。 Dig @208.67.222.220 myip.opendns.com

26
Zoredache

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は例外です。Googleが適切に有効にすると、IPv6で実際に機能する可能性があります。

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

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
18
cnst

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

curl icanhazip.com

特に、そのデータの処理に特別な意味がある場合は、IPのサードパーティソースを信頼することが問題になる可能性があることに注意してください。

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

Dig @trustworthysource.com +short `hostname`
12
Matthew Ife

このために、シンプルで高速なWebサービスを作成しました。

curl ident.me

あなたはあなたのIPv4を求めることができます:

curl v4.ident.me

またはIPv6:

curl v6.ident.me

そしてAPIは http://api.ident.me/ に文書化されています

8
Pierre Carrier
7
Michael Todd

もし

  1. 1つのパブリックIPアドレスと
  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アドレスを見つける方法はありません(コンピューターが認識していないため)。次に、他の答えのようにそれを行う必要があります。

5
sleske

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をフィルターするだけです。

4
Romed

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

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

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

3
Biranchi

これで、GoogleはあなたのパブリックIPアドレスを表示します: http://www.google.com/search?q=ip

3
Jake Wilson

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

#!/bin/sh

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

素敵でシンプル。

3
Skittles

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

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

IPの場合:

カールifconfig.me
curl ifconfig.me/ip

パブリックホスト名の場合:

curl ifconfig.me/Host

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

curl ifconfig.me/all.xml

など...チェックアウト http://ifconfig.me

3
Kelindil

外部ソースに依存しないようにするために、ルータにTelnetで接続してパブリックインターフェイスのIPアドレスを取得するために、expectを使用します。期待スクリプトの例を次に示します。

#!/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

もちろん、これは私がルーターとそのLinuxベースのルーターへの管理者アクセス権を持ち、ifconfigコマンドを使用できるという前提に基づいています。

2
Hammad Akhwand

私はこれを多くのデバイスから実行しているので、サーバーで独自の2つのサービスを作成しました。

  1. ウェブサーバーのルートにある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
petrus

ルーターで外部IPアドレスを検索する場合は、ルーター自体にWANアドレスを要求するか、外部の誰かに入手してもらうよう依頼します。

手動の方法では、着信リクエストのIPを返す上記のサイトを閲覧できます。

自動化された方法では、次のことを試すことができます。

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

これは、http応答のIPアドレスを含む行を取得し、sed、awkなどで解析します。

1
AlexFerrer
1
bortzmeyer

簡単なシェルスクリプトソリューションは次の場所にあります。

http://bash.cyberciti.biz/misc-Shell/read-local-ip-address/

Linux、FreeBSD、SunOSおよびApple Darwinで動作します(わずかな変更を加えて))。

1

シェルだけを使用して外部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
levislevis85

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

ip addr show | grep eth0 | grep inet | tr -s "" |カット-f3 -d "" |カット-f1 -d "/"

0
Leigh Geary

ここでは、「パブリックサービス」サイトが廃止されたりフォーマットが変更されたりする可能性があるのではなく、動的IPの管理に関してビジネスが解決するホストに依存する別の代替案を示します。

1)多くの無料のダイナミックDNSサービス(no-ip.comなど)の1つでサーバーを登録します。これにより、xxx.no-ip.orgのようなDNSエントリが提供されます。

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

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

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

動的IPが変更され、一部の構成エントリを変更する必要があるかどうかを確認するcronジョブでの使用に最適です。

0
cgmonroe
lynx --dump http://www.whatismyip.com/ | grep -o '[0-9]。* \。[0-9]。* \。[0-9]。* \。[0-9]。*' 
-m1 
0
user58157
wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
0
Fathi

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"
0
user252912