パブリックIPを決定するためのコマンド?


636

googleで確認すると、パブリックIP を確認できます。Ubuntuのコマンドラインに同じ答えが得られるものがありますか?


2
「動的IPを使用する」、「インターネット上で他のシステムを使用するSSH」、「現在のパブリックIPを表示するコマンド」。ここに鶏/卵の問題がありますか?アドレスを知らなくてもリモートサーバーでコマンドを実行するにはどうすればよいですか?no-ip.com / DynDNS.orgのようなサービスにもっと興味があるかもしれません。
gertvdijk

一つは私の友人のパブリックIPを知らなくてもSSH ... DynDNSのできない多くの無IPタフな作品がかかりますが、状況がそれを許さない...とにかく質問はすでに..あなたの提案に感謝に答えてきた
Bhaveshディワン

1
PS duckduckgo.com/?q=ip(コマンドラインはありませんが、兄Gもいません)
カンパ

1
これは別の質問かもしれませんが、パブリックIPアドレスが変更されたときにアラートを表示したいと思います。今のところ、私はcrontabで次の回答を使用していますnotify-send
PJブルーネット

以下の優れたソリューション。Centosを使用する場合:ifconfig eth1 | sed -nre '/^[^ ]+/{N;s/^([^ ]+).*inet *([^ ]+).*/\2/p}'eth1は対象のネットワークデバイスです。「et1」文字列を省略して、すべてのアダプターのすべてのIPを表示できます。代わりに、各アダプターの名前も表示\2するように書くことができ\1 \2ます。
ハーフェンクラニッチ

回答:


916

ルーターの後ろにいない場合は、を使用して確認できますifconfig

ルーターの背後にいる場合、ルーターはネットワークアドレス変換を行うため、コンピューターはパブリックIPアドレスを認識しません。パブリックIPアドレスが何を使用しているかをWebサイトに尋ねcurlたりwget、そこから必要な情報を抽出したりできます。

curl -s https://checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'  

以下

curl https://ipinfo.io/ip

27
TY -私が投稿した直後、私は私が最初に答えをグーグルなかったことを実現:これは動作しますように見えるcurl -s checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//' 他の可能性がここにリストされています: go2linux.org/what-is-my-public-ip-address-with-linux
kfmfe04

1
確かに-あなたはあなたの答えにそれを追加することができます
-kfmfe04

1
明確にするために:それはハックであり、それは非常にoneいものであったため、私はそれをより簡単にするために編集し、人々が覚えることができるものにしました。
jrg

2
正確にジョバンニPが述べたように。OPは、受け入れられたアンカーを変更する必要があります。
lostro 14

36
curl -s ipinfo.io/ip
chao

385

外部IPを見つけるには、外部Webベースのサービスを使用するか、システムベースの方法を使用します。より簡単な方法は外部サービスを使用するifconfigことですNAT。また、ベースのソリューションは、あなたがの背後にいない場合にのみシステムで動作します。2つの方法については、以下で詳しく説明します。

外部サービスを使用して外部IPを見つける

最も簡単な方法は、コマンドラインブラウザーまたはダウンロードツールを介して外部サービスを使用することです。以来wgetのUbuntuでデフォルトで提供されています、我々はそれを使用することができます。
IPを見つけるには、

$ wget -qO- https://ipecho.net/plain ; echo

礼儀

また、lynx(ブラウザ)を使用するか、上記のコマンドのわずかなバリエーションのcurl代わりにwget、外部IPを見つけることもできます。

curlIPの検索に使用:

$ curl https://ipecho.net/plain

より良いフォーマットの出力を使用するには:

$ curl https://ipecho.net/plain ; echo

リゾルバーとしてdigwith OpenDNSを使用する、より高速な(ほぼ最速の)メソッド:

ここでの他の回答はすべて、HTTPを介してリモートサーバーに送られます。それらのいくつかは、出力の解析を必要とするか、User-Agentヘッダーに依存してサーバーがプレーンテキストで応答するようにします。また、非常に頻繁に変更されます(下に行く、名前を変更する、広告を表示する、出力形式を変更するなど)。

  1. DNS応答プロトコルは標準化されています(形式の互換性は維持されます)。
  2. 歴史的に、DNSサービス(OpenDNS、Google Public DNS、..)は、今日流行している新しいwhatismyip.com HTTPサービスよりもはるかに長く存続する傾向があり、安定性、拡張性が高く、一般的に管理されています。
  3. (マイクロ最適化を重視するオタクの場合)、この方法は本質的に高速である必要があります(数マイクロ秒だけ)。

リゾルバとしてOpenDNSでdigを使用する:

$ dig +short myip.opendns.com @resolver1.opendns.com

111.222.333.444

コピー元: https : //unix.stackexchange.com/a/81699/14497

外部サービスに依存せずに外部IPを見つける

  • ネットワークインターフェイス名がわかっている場合

端末に次のように入力します。

$ LANG=c ifconfig <interface_name> | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'

上記では、交換してください<interface_name>:例えば、あなたの実際のインタフェースの名前でeth0eth1pp0など、...

使用例:

$ LANG=c ifconfig ppp0 | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'
111.222.333.444
  • ネットワークインターフェイス名がわからない場合

端末に次のように入力します(これにより、システム内のすべてのネットワークインターフェイスの名前とIPアドレスが取得されます)。

$ LANG=c ifconfig | grep -B1 "inet addr" |awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' |awk -F: '{ print $1 ": " $3 }'

使用例:

$ LANG=c ifconfig | grep -B1 "inet addr" |awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' |awk -F: '{ print $1 ": " $3 }'
lo: 127.0.0.1
ppp0: 111.222.333.444

注意:出力は指標であり、実際のものではありません。

礼儀: https : //www.if-not-true-then-false.com/2010/linux-get-ip-address/

更新

  1. LANG=cifconfigベースの使用法に追加されたため、ロケール設定に関係なく、常に英語の出力が得られます。

1
@ Z9iT、確かに。wgetがインストールされていれば、どのLinuxディストリビューションでも動作するはずです。前述のように、curlまたはlynxのいずれかが既に利用可能な場合は、代わりにそれを使用してください。インストールするにはroot権限が必要なので、次を使用しますsudo apt-get install wget
saji89

13
ifconfigを使用したコマンドは、NATの背後にいない場合にのみ機能します。
ルカシュタイナー

1
-wechoの代わりにcurlオプションを使用してください:)curl -w '\n' ident.me
drAlberT 14年

3
掘るを使用してこの提案はかなりいいですunix.stackexchange.com/questions/22615/...
binaryanomaly

4
コンピュータがインターネットに直接接続されている場合は、外部サービスのない最後のバージョンのみが機能しますが、ほとんどの場合はそうではありません。そうでない場合は、ローカルIPアドレスしか取得できません。
rubo77

117

私のお気に入りはいつも:

curl ifconfig.me

シンプルで入力しやすい。

最初にcurlをインストールする必要があります;)

ifconfig.meがダウンしている場合は、icanhazip.comまたはipecho.netを試してください。

curl icanhazip.com

または

curl ipecho.net

3
@ Z9iT、私は今これをチェックしました。はい、それはあなたの端末に外部IPを出力します。
saji89

7
からの応答時間はのifconfig.me場合よりもかなり遅いようですipecho.net
ドリューノエイクス

3
あなたが持っていない場合はcurlなく、持っているwgetwget -U curl -qO- ifconfig.me
ステファンChazelas

2
ifconfig.meが応答していないようです:(
Asfand Qazi

1
@AsfandYarQazi-ここで働いています。あなたはicanhazip.com、交互のいずれかを試すことができます
パンサー

60

icanhazip.comは私のお気に入りです。

curl icanhazip.com

IPv4を明示的に要求できます。

curl ipv4.icanhazip.com

お持ちでないcurl場合は、wget代わりに使用できます:

wget -qO- icanhazip.com

ありがとう!IPv6に対応したものが見つかるまで、上記の多くの提案を試さなければなりませんでした。このようなサービスが通常IPv4のみであることは残念です。
ウラジミール・ウナト

48

私はすべてが迷惑で遅いことがわかったので、自分で書きました。シンプルで高速です。

そのAPIはhttp://api.ident.me/にあります

例:

curl ident.me
curl v4.ident.me
curl v6.ident.me

1
うわー、それは本当に速かったです!
waldyrious

1
私が見つけicanhazip.comソリューションをより速く、それが出力に改行が含まれています。
タイラーコリアー14

1
はい、最近は確かに速かったです。ソリューションを微調整しただけです。
ピエールキャリア14

2
称賛!2年間、あなたはまだそれを維持しています。よくやった。「IDENTify ME」は、IPチェックが必要なときに頭に浮かぶものです:)
Mohnish

AWS高速ですtime curl http://checkip.amazonaws.com- > 0.91s.241sのためにident.meしてみましょうちょうど下るdoesntのAWSを祈る;)
Avindra Goolcharan

42

HTTP要求の代わりにDNS要求を使用して、パブリックIPを見つけることができます。

$ dig +short myip.opendns.com @resolver1.opendns.com

resolver1.opendns.comDNSサーバーを使用して、魔法のmyip.opendns.comホスト名をIPアドレスに解決します


3
これは本当に速いです。ウォームアップを1回実行し、次にこれとをそれぞれ10回実行しましたcurl icanhazip.comcurlバージョンの平均:174ms。DNSのみのバージョンの平均:9ミリ秒。〜19倍高速。参照:unix.stackexchange.com/a/81699/8383
アダムモンセン

1
@AdamMonsenリンクありがとうございます。DNSを使用することのポイント(リンクした答えによると)は、応答が標準的で(変更される可能性が低い)、サービス(OpenDNS)がほとんどのhttpの代替手段よりも長く使用される可能性があるということです。要求の作成にかかる時間は、コマンドの起動時間によって隠される場合があります。
jfs

うん。curlそれ自体がより遅いなら私は驚かないでしょうdig。それらが可能な限り類似するように書き換えられたとしても、curlそれでも遅くなります。HTTP(DNS を含む)をdig使用し、DNSのみを使用します。
アダムモンセン

22

Amazon AWS

curl http://checkip.amazonaws.com

サンプル出力:

123.123.123.123

私はそれが好きです:

  • プレーンテキストIPのみを返し、それ以外は何も返しません
  • すぐにオフラインになることはほとんどない有名なプロバイダーからのものです

18

私が使用しているものは:

wget -O - -q icanhazip.com

はい、IPを使用できます:-)


3
私が好むcurl icanhazip.com時々wget利用できる唯一の1ではありませんが、時には何がwget同様に利用可能であり、curl(OS / Xのような)あなたの唯一のオプションです。どちらの方法curl icanhazip.comもほとんど同じくらい簡単ですがcurl ifconfig.me、はるかに面白いです
;

11

これを正確に入力しEnter、示されている場所を押します。

telnet ipecho.net 80Enter
GET /plain HTTP/1.1Enter
HOST: ipecho.net Enter
BROWSER: web-kitEnter
Enter

これにより、HTTPリクエストが手動で送信されます。HTTPリクエストは、 HTTP/1.1 200 OK reply

出力例:

$ telnet ipecho.net 80
Trying 146.255.36.1...
Connected to ipecho.net.
Escape character is '^]'.
GET /plain HTTP/1.1
HOST: ipecho.net
BROWSER: web-kit

HTTP/1.1 200 OK
Date: Tue, 02 Jul 2013 07:11:42 GMT
Server: Apache
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-cache
Pragma: no-cache
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/html

f
111.222.333.444
0

6
いいですね、これはうまく機能し、curlをインストールする必要がないという利点がありました。nc ipecho.net 80
オゾン14年


9

このために、STUNが発明されました。クライアントとして、公開されているSTUNサーバーにリクエストを送信し、表示されたIPアドレスを返すことができます。低レベルのwhatismyip.comは、HTTPと巧妙に作成されたDNSサーバーを使用せず、非常に高速なSTUNプロトコルを使用しているため、並べ替えられています。

を使用して stunclient

stunclientapt-get install stuntman-clientdebian / ubuntuに)インストールしている場合は、次のようにします。

$stunclient stun.services.mozilla.com
Binding test: success
Local address: A.B.C.D:42541
Mapped address: W.X.Y.Z:42541

ここA.B.C.Dで、ローカルネット上のマシンのIPアドレスはW.X.Y.Z、外部(および探しているWebサイト)から見えるIPアドレスサーバーです。を使用sedすると、上記の出力をIPアドレスのみに減らすことができます。

stunclient stun.services.mozilla.com |
    sed -n -e "s/^Mapped address: \(.*\):.*$/\1/p"

ただし、質問はコマンドラインを使用して見つける方法であり、STUNクライアントの使用を除外する場合があります。だから私は...

を使用して bash

STUN要求は、手作り使って外部のSTUNサーバに送信することが可能netcatと使用して後処理することddhexdumpおよびsedそのように:

$echo -en '\x00\x01\x00\x08\xc0\x0c\xee\x42\x7c\x20\x25\xa3\x3f\x0f\xa1\x7f\xfd\x7f\x00\x00\x00\x03\x00\x04\x00\x00\x00\x00' |
    nc -u -w 2 stun.services.mozilla.com 3478 |
    dd bs=1 count=4 skip=28 2>/dev/null |
    hexdump -e '1/1 "%u."' |
    sed 's/\.$/\n/'

エコーは、Cookie 0xc00ceeと、wiresharkから貼り付けられたものを含む、長さ8(0x0008)のバイナリSTUN要求(0x0001はBinding Requestを示します)を定義します。外部IPを表す4バイトのみが回答から取得され、クリーニングおよび印刷されます。

動作しますが、実稼働での使用は推奨されません:-)

PS多くのSTUNサーバーは、SIPおよびWebRTCのコアテクノロジーであるため利用できます。Mozillaのいずれかを使用することはプライバシーに関して安全であるはずですが、別のSTUNサーバーリストを使用することもできます。


最も熱心で実際に最も適切なテクノロジーに対して+1。httpクエリは機能します。これは私がこれまでずっと使ってきたものですが、実際にはいくつかの考えが質問に入れられていることが好きです。私はこれを知りませんでした。ありがとう!
マイクS

7

このために、telnetで愚かなサービスを提供しています。このようなもの:

telnet myip.gelma.net

Your IPv4: xxx.xxx.xxx.xxx
Your IPv6: ::ffff:xxxx:xxxx

気軽に使用してください。


5

あなたは、bashのみを使用して、なしcurlでWebページを読むことができますwget

$ exec 3<> /dev/tcp/icanhazip.com/80 && # open connection
  echo 'GET /' >&3 &&                   # send http 0.9 request
  read -u 3 && echo $REPLY &&           # read response
  exec 3>&-                             # close fd

これcheckip.amazonaws.comは私にとって最速です
アビンドラグールチャラン

1
@AvindraGoolcharanはDNSリクエストを
jfs

2

ルーターへのログインアクセス権を持つユーザーにとって、スクリプトを使用してルーターのWAN IPアドレスを尋ねるのが、外部IPアドレスを決定する最も効率的な方法です。たとえば、次のpythonスクリプトは、Medialink MWN-WAPR300Nルーターの外部IPを出力します。

import urllib, urllib2, cookielib
import re
from subprocess import check_output as co

cookie_jar = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie_jar))
urllib2.install_opener(opener)

def get(url, values=None):
  data = None
  if values: data = urllib.urlencode(values)
  req = urllib2.Request(url, data)
  rsp = urllib2.urlopen(req)
  return rsp.read()

router = co(['ip', '-o', 'ro', 'list', '0.0.0.0/0']).split()[2]
url = "http://" + router

get(url+"/index.asp")
get(url+"/LoginCheck", dict(checkEn='0', Username='admin', Password='admin'))
page = get(url+"/system_status.asp")

for line in page.split("\n"):
  if line.startswith("wanIP = "):
    print line.split('"')[1]
    exit(1)

これは非常に安全ではないことに注意してください(プレーンテキストの資格情報とほとんどのルーターへのログインの場合のように)、そして確かに移植性がありません(ルーターごとに変更する必要があります)。しかし、それは非常に高速で、物理的に安全なホームネットワーク上で完全に合理的なソリューションです。

別のルーター用にスクリプトをカスタマイズするには、firefoxのtamperdataアドオンを使用して、作成するHTTPリクエストを決定することをお勧めします。


2
ルーターのIPアドレスを文法的に取得してみてください。たとえばrouter = subprocess.check_output(['ip', '-o', 'ro', 'list', '0.0.0.0/0']).split()[2]
クリスティアン・チュピトゥ14年

2

これらはローカルIPを取得します:

ifconfig

または短い出力の場合:

ifconfig | grep inet

また

ip addr show

そしておそらく:

hostname -I

これにより、外部IPが取得されます。

wget http://smart-ip.net/myip -O - -q ; echo

curl:インストールすることを気にしない場合、これも:

curl http://smart-ip.net/myip

1
ifconfig | sed -nre '/^[^ ]+/{N;s/^([^ ]+).*addr: *([^ ]+).*/\1,\2/p}'ローカルインターフェイスと対応するV4 IPを印刷します
Hannu 14年

1
ifconfig | sed -nre '/^[^ ]+/{N;N;s/^([^ ]+).*addr: *([^ ]+).*addr: *([^ ]+).*/\1,\2,\3/p}'-v4およびv6 IP。
ハンヌ14年

2

多くのホームルーターは、UPnPで照会できます。

curl "http://fritz.box:49000/igdupnp/control/WANIPConn1" -H "Content-Type: text/xml; charset="utf-8"" -H "SoapAction:urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress" -d "<?xml version='1.0' encoding='utf-8'?> <s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'> <s:Body> <u:GetExternalIPAddress xmlns:u='urn:schemas-upnp-org:service:WANIPConnection:1' /> </s:Body> </s:Envelope>" -s

次に、回答からIPアドレスをgrepします。

grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>'

2

DD-WRTを使用している場合、これは私のために機能します:

curl -s 192.168.1.1 | grep "ipinfo" | awk -v FS="(IP: |</span)" '{print $2}'

または

curl -s -u your_ddwrt_username:your_ddwrt_password http://192.168.1.1 | grep "ipinfo" | awk -v FS="(IP: |</span)" '{print $2}'
  • 192.168.1.1は、DD-WRTルーターのゲートウェイ/ルーターLAN IPアドレスです。

  • -s成分(すなわちカール進捗情報は表示されません)サイレントを意味します。

  • ああ、私は上記を"DD-WRT v24-sp2(01/04/15)std"で使用していることに言及する必要があります。

1

Ubuntuタイプにlynxをインストールした場合

lynx bot.whatismyipaddress.com

curl bot.whatismyipaddress.comも動作します。
友文

0

使用するip

ip addr show

次に、関連するアダプタ(ではなくlo、通常はeth0)を探し、の近くのIPアドレスを見つけますinet


2
質問は、パブリックない内部IPアドレスについてです
ウルフ

0

私は少し遅れているかもしれませんが、inxiはかなり簡単にできます。

インストール inxi

sudo apt install inxi

次に、次のコマンドを実行します

inxi -i

次のzようなサイトへのコピーと貼り付けのオプションを使用してブロックされた私の情報の例:

~$ inxi -iz
Network:   Card: NVIDIA MCP77 Ethernet driver: forcedeth
           IF: eth0 state: up speed: 1000 Mbps duplex: full mac: <filter>
           WAN IP: <filter>
           IF: eth0 ip-v4: <filter> ip-v6-link: N/A

それは言うどこに<filter>あなたのWAN IPはIPv4、MACアドレスなどが表示される場所であります


-2

Webサイトまたはサービスのtracerouteを発行するだけです。

sudo traceroute -I google.com

2行目は、ルーターゲートウェイを通過した後は常にパブリックIPアドレスのようです。

user@user-PC ~ $ sudo traceroute -I google.com
traceroute to google.com (173.194.46.104), 30 hops max, 60 byte packets
 1  25.0.8.1 (25.0.8.1)  230.739 ms  231.416 ms  237.819 ms
 2  199.21.149.1 (199.21.149.1)  249.136 ms  250.754 ms  253.994 ms**

そのため、bashコマンドを作成します。

sudo traceroute -I google.com | awk -F '[ ]' '{ if ( $2 ="2" ) { print $5 } }'

そして出力...

(199.21.149.1)

PHPスクリプトに依存することはないと思うので、並べ替えは良い習慣です。


これは面白いですが、本当に遅いのですが、このような外部IPを取得できません
-rubo77

この答えは不正確すぎて役に立たない。私の企業環境では、IPアドレスをまったく取得していません。それが機能する唯一の方法は、ローカルルーターとスイッチがどのように作成されるかを理解している場合であり、その場合でも、ジャンプするローカルホップの数によってはライン2にない場合があります。この手法からコヒーレントなアルゴリズムを作成する方法はありません。また、より簡単で、毎回適切な答えを得ることができる他の多くのソリューションがあります。
マイクS

いくつかの特別な構成で機能する場合もありますが、実際にはtracerouteで外部IPを見たことはありません。通常は、ゲートウェイ(NATの背後にいない場合)またはルーターのゲートウェイのいずれかですが、大部分は他のルーターです。
mivk

エイリアスip = 'lynx --dump ipecho.net/plain '
phildobbin

-2

GOogle DNSである8.8.8.8以外の依存関係のないコマンド:

echo $(ip route get 8.8.8.8 | awk '{print $NF; exit}')

これは、ローカルの発信インターフェイスのIPアドレスのみを示します。
ガントベルト

クラウドサーバーで実行すると、コマンドはパブリックIPアドレスを表示します。質問ではないですか?
ロルフ

いいえ、「クラウドサーバー」はどこに表示されますか?
ガントベルト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.