쉘 스크립트에서 외부 IP 주소를 얻으려면 어떻게해야합니까?


273

쉘 스크립트에서 외부 IP 주소를 찾아야합니다. 현재이 기능을 사용합니다 :

myip () { 
    lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}

그러나이에 따라 perl-libwww, perl-html-format, perl-html-tree설치. 외부 IP를 얻을 수있는 다른 방법은 무엇입니까?


8
외부 IP의 의미는 무엇입니까? 지금까지 두 답변은 HTTP를 사용합니다. 응답은 ISP 프록시 서버의 IP가 될 수 있습니다. (당신이 원하는 것일 수도 있습니다.)
billpg

@billpg : NAT 라우터의 IP를 의미합니다
Eugene Yarmash

그런 다음 HTTPS를 사용하는 what-is-my-IP 웹 서비스가 필요합니다. 아아, 나는 아무것도 모른다.
billpg

1
@billpg ipcheckit.com
Gilles

checkip.amazonaws.com 는 잘 알려진 공급자로부터 이것을 사용합니다
arulraj.net

답변:


441

DNS 서버에서 직접 가져 오는 것이 좋습니다.

아래의 다른 답변의 대부분은 HTTP를 통해 원격 서버로 이동하는 것과 관련이 있습니다. 이들 중 일부는 출력을 구문 분석해야하거나 서버가 일반 텍스트로 응답하도록 User-Agent 헤더에 의존했습니다. 그것들은 아주 자주 바뀝니다 (아래로 내려 가고, 이름을 바꾸고, 광고를 올리거나, 출력 형식을 바꿀 수 있습니다).

  1. DNS 응답 프로토콜은 표준화되어 있습니다 (형식은 계속 호환됩니다).
  2. 역사적으로, DNS 서비스 ( OpenDNS , Google Public DNS ..)는 오늘날 새로운 힙합 whatismyip.com HTTP 서비스보다 더 오래 지속되고보다 안정적이며 확장 가능하며 일반적으로 더 잘 보입니다.
  3. 이 방법은 본질적으로 더 빠릅니다 (몇 밀리 초 만 가능합니다).

리졸버 digOpenDNS 와 함께 사용 :

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

아마도 당신의 별명 bashrc으로 기억하기 쉽습니다.

alias wanip='dig @resolver1.opendns.com ANY myip.opendns.com +short'

일반 IP 주소로 응답합니다.

$ wanip
80.100.192.168 # or, 2606:4700:4700::1111

통사론

( https://ss64.com/bash/dig.html 에서 요약 됨 ) :

usage:  dig [@global-dnsserver] [q-type] <hostname> <d-opt> [q-opt]

    q-type   one of (A, ANY, AAAA, TXT, MX, ...). Default: A.

    d-opt    ...
             +[no]short          (Display nothing except short form of answer)
             ...

    q-opt    one of:
             -4                  (use IPv4 query transport only)
             -6                  (use IPv6 query transport only)
             ...

ANY쿼리 유형은 AAAA 또는 A 레코드 중 하나를 반환합니다. 특히 IPv4 또는 IPv6 연결을 선호하려면 -4또는 -6옵션을 적절히 사용하십시오 .

응답이 IPv4 주소가되도록하려면 ANY를 A;로 바꾸십시오 . IPv6의 경우이를.로 바꾸십시오 AAAA. 연결에 사용 된 주소 만 반환 할 수 있습니다. 예를 들어 IPv6을 통해 연결하면 A 주소를 반환 할 수 없습니다.

대체 서버 및 예

OpenDNS 외에도 Akamai와 Google에서 제공하는 유사한 DNS 서비스가 있습니다.

$ dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
80.100.192.168

$ dig @ns1.google.com TXT o-o.myaddr.l.google.com +short
"80.100.192.168"

IPv4 주소를 구체적으로 요청하는 별명 예 :

alias wanip4='dig @resolver1.opendns.com A myip.opendns.com +short -4'

$ wanip4
80.100.192.168

그리고 IPv6의 경우 :

alias wanip6='dig @resolver1.opendns.com AAAA myip.opendns.com +short -6'

$ wanip6
2606:4700:4700::1111

문제 해결

어떤 이유로 명령이 작동하지 않으면 업스트림 공급자, 명령 줄 도구 또는 기타 문제가있을 수 있습니다. 작동하지 않는 이유를 이해하려면 +short옵션 없이 명령을 실행 하여 DNS 조회의 세부 사항을 표시하십시오. 예를 들면 다음과 같습니다.

$ dig @resolver1.opendns.com ANY myip.opendns.com

;; Got answer: ->>HEADER<<- opcode: QUERY, status: NOERROR

;; QUESTION SECTION:
;myip.opendns.com.      IN  ANY

;; ANSWER SECTION:
myip.opendns.com.   0   IN  AAAA    2606:4700:4700::1111

;; Query time: 4 msec
;; WHEN: Fri Apr 11 00:00:01 GMT 2011

18
너무 빠릅니다 ..
Rahul Patil

4
@Krinkle은 훌륭한 답변입니다. 에 대한 동등한 거기에 myip.opendns.com구글의 공공 DNS에이?
Kannan Mohan

12
나는 ~보다 19 배 빠릅니다 curl http://canhazip.com. 참조 askubuntu.com/a/427092/2273
아담 Monsen에게

3
당신이 포트 80에 바인딩하지 않는 한이 깨끗한 사랑 / 종속성은 다른 모든 제안보다 훨씬 더 접근하지
binaryanomaly

5
경우에 따라 NAT를 제공하는 라우터는 DNS 응답도 변환합니다 ( wiki.nil.com/Network_address_translation_of_DNS_responses 참조 ). 이 경우 DNS 이외의 다른 방법을 권장하는 답변으로 대체해야합니다.
Razvan Stefanescu

146

참고 : 이것은 외부 IP 주소 (인터넷에있는 서버가 서버를 연결할 때 표시되는 주소)에 대한 것입니다. 내부 IP 주소 를 원할 경우 (자체 컴퓨터가 연결에 사용하는 것과 다를 수 있음)이를 참조 하십시오. 대답 .

TL; DR-2015 년 가장 빠른 방법

DNS를 사용하는 가장 빠른 방법 :

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

또는 externalip 사용 :

externalip dns

HTTP를 사용하는 가장 빠른 방법 :

curl -s http://whatismyip.akamai.com/

또는 externalip 사용 :

externalip http

유효한 인증서로 HTTPS를 사용하는 것이 가장 빠릅니다.

curl -s https://4.ifcfg.me/

또는 externalip 사용 :

externalip https

텔넷 사용 :

nc명령

nc 4.ifcfg.me 23 | grep IPv4 | cut -d' ' -f4

또는 externalip 사용 :

externalip telnet

telnet명령

telnet 4.ifcfg.me 2>&1 | grep IPv4 | cut -d' ' -f4

FTP 사용 :

echo close | ftp 4.ifcfg.me | awk '{print $4; exit}'

또는 externalip 사용 :

externalip ftp

위의 모든 내용은 다음과 같이 externalip 스크립트를 사용하여 실행할 수 있습니다 .

externalip dns
externalip http
externalip https
externalip telnet
externalip ftp

이제 긴 이야기 ...

특히 여기 또는 다른 곳에 게시 된 HTTP를 통해 외부 IP를 제공하는 다양한 서버 옵션이 많이 있습니다.

나는 그들 중 하나가 다른 것보다 더 나은지 확인하기 위해 벤치 마크를 만들었고 결과에 놀랐습니다. 예를 들어 가장 널리 권장되는 ifconfig.me 중 하나가 거의 항상 느리게 반응하기까지 몇 초가 걸리기도했습니다. 많은 사람들이 HTTPS를 통해 작동하지 않거나 작동하지만 유효하지 않은 인증서를 가지고 있습니다. 일부 응답 시간이 매우 일치하지 않습니다.

벤치 마크

HTTP와 HTTPS

이것이 내가 사용한 externalip-benchmark 스크립트의 소스입니다.

여기에 언급 된 서비스 중 어떤 서비스를 사용할 가치가 있는지 직접 확인할 수 있습니다.

wget https://raw.githubusercontent.com/rsp/scripts/master/externalip-benchmark
chmod a+x externalip-benchmark
./externalip-benchmark

바르샤바에서 2015-04-03에 얻은 결과-무고한 사람들을 보호하기 위해 주소가 변경되었습니다.

최고의 HTTP 응답 시간 :

0.086s http://ip.tyk.nu/ - answer='172.31.133.7'
0.089s http://whatismyip.akamai.com/ - answer='172.31.133.7'
0.091s http://tnx.nl/ip - answer='172.31.133.7'
0.117s http://ifcfg.me/ - answer='172.31.133.7'
0.156s http://l2.io/ip - answer='172.31.133.7'
0.317s http://ip.appspot.com/ - answer='172.31.133.7'
0.336s http://ident.me/ - answer='172.31.133.7'
0.338s http://ipof.in/txt - answer='172.31.133.7'
0.347s http://icanhazip.com/ - answer='172.31.133.7'
0.496s http://curlmyip.com/ - answer='172.31.133.7'
0.527s http://wgetip.com/ - answer='172.31.133.7'
0.548s http://curlmyip.com/ - answer='172.31.133.7'
0.665s http://bot.whatismyipaddress.com/ - answer='172.31.133.7'
0.665s http://eth0.me/ - answer='172.31.133.7'
1.041s http://ifconfig.me/ - answer='172.31.133.7'
1.049s http://corz.org/ip - answer='172.31.133.7'
1.598s http://ipecho.net/plain - answer='172.31.133.7'

최고의 https 응답 시간 :

0.028s https://curlmyip.com/ - answer=''
0.028s https://curlmyip.com/ - answer=''
0.029s https://l2.io/ip - answer=''
0.029s https://tnx.nl/ip - answer=''
0.072s https://whatismyip.akamai.com/ - answer=''
0.113s https://ipecho.net/plain - answer=''
0.117s https://ident.me/ - answer=''
0.207s https://ip.tyk.nu/ - answer='172.31.133.7'
0.214s https://ipof.in/txt - answer='172.31.133.7'
0.259s https://ifcfg.me/ - answer='172.31.133.7'
0.289s https://corz.org/ip - answer=''
0.436s https://ip.appspot.com/ - answer='172.31.133.7'
0.448s https://bot.whatismyipaddress.com/ - answer=''
0.454s https://eth0.me/ - answer=''
0.673s https://icanhazip.com/ - answer='172.31.133.7'
5.255s https://ifconfig.me/ - answer=''
10.000s https://wgetip.com/ - answer=''

(참고 : 내용이 비어있는 일부 빠른 응답이 있습니다. 잘못된 응답입니다.)

최고의 평균 핑 시간 :

10.210 //whatismyip.akamai.com/
36.820 //tnx.nl/ip
37.169 //ip.tyk.nu/
39.412 //ipof.in/txt
40.967 //ident.me/
41.257 //ipecho.net/plain
43.918 //ifcfg.me/
45.720 //l2.io/ip
64.749 //ip.appspot.com/
123.412 //corz.org/ip
134.245 //wgetip.com/
157.997 //icanhazip.com/
161.613 //curlmyip.com/
162.100 //curlmyip.com/
268.734 //ifconfig.me/
999999 //bot.whatismyipaddress.com/
999999 //eth0.me/

다음은 암스테르담에서 2015-04-03에 얻은 결과입니다.

최고의 HTTP 응답 시간 :

0.021s http://ipecho.net/plain - answer='172.31.13.37'
0.027s http://tnx.nl/ip - answer='172.31.13.37'
0.035s http://whatismyip.akamai.com/ - answer='172.31.13.37'
0.039s http://ifcfg.me/ - answer='172.31.13.37'
0.045s http://l2.io/ip - answer='172.31.13.37'
0.142s http://ident.me/ - answer='172.31.13.37'
0.144s http://ipof.in/txt - answer='172.31.13.37'
0.150s http://ip.appspot.com/ - answer='172.31.13.37'
0.150s http://ip.tyk.nu/ - answer='172.31.13.37'
0.170s http://icanhazip.com/ - answer='172.31.13.37'
0.190s http://eth0.me/ - answer='172.31.13.37'
0.191s http://wgetip.com/ - answer='172.31.13.37'
0.301s http://curlmyip.com/ - answer='172.31.13.37'
0.330s http://bot.whatismyipaddress.com/ - answer='172.31.13.37'
0.343s http://curlmyip.com/ - answer='172.31.13.37'
0.485s http://corz.org/ip - answer='172.31.13.37'
3.549s http://ifconfig.me/ - answer='172.31.13.37'

최고의 https 응답 시간 :

0.004s https://curlmyip.com/ - answer=''
0.012s https://curlmyip.com/ - answer=''
0.012s https://tnx.nl/ip - answer=''
0.016s https://ipecho.net/plain - answer=''
0.071s https://whatismyip.akamai.com/ - answer=''
0.096s https://ifcfg.me/ - answer='172.31.13.37'
0.097s https://ident.me/ - answer=''
0.187s https://corz.org/ip - answer=''
0.187s https://ip.appspot.com/ - answer='172.31.13.37'
0.189s https://ip.tyk.nu/ - answer='172.31.13.37'
0.195s https://eth0.me/ - answer=''
0.253s https://l2.io/ip - answer=''
0.300s https://ipof.in/txt - answer='172.31.13.37'
0.324s https://bot.whatismyipaddress.com/ - answer=''
0.512s https://icanhazip.com/ - answer='172.31.13.37'
1.272s https://ifconfig.me/ - answer=''
10.002s https://wgetip.com/ - answer=''

최고의 평균 핑 시간 :

1.020 //ipecho.net/plain
1.087 //whatismyip.akamai.com/
5.011 //ip.appspot.com/
6.942 //ident.me/
7.017 //ipof.in/txt
8.209 //tnx.nl/ip
11.343 //ip.tyk.nu/
12.647 //ifcfg.me/
13.828 //l2.io/ip
81.642 //icanhazip.com/
85.447 //wgetip.com/
91.473 //corz.org/ip
102.569 //curlmyip.com/
102.627 //curlmyip.com/
247.052 //ifconfig.me/
999999 //bot.whatismyipaddress.com/
999999 //eth0.me/

999999 핑은 100 % 패킷 손실을 의미합니다.

DNS

비교를 위해 바르샤바와 암스테르담에서 2015-06-16에 테스트 한 다른 방법이 있습니다.

사용 :

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

일반적으로 소요되는 시간 (실시간 시계 시간) :

  • 바르샤바에서 0.035
  • 암스테르담에서 0.015 초

실제로있다 이 방법을 사용할 수 있습니다 리졸버는 :

  • resolver1.opendns.com
  • resolver2.opendns.com
  • resolver3.opendns.com
  • resolver4.opendns.com

바르샤바와 암스테르담에서 모두 동일한 응답 시간을 제공하지만 다른 지역에서는 그렇지 않을 수 있습니다.

208.67.222.222 사용-도메인 이름 대신 resolver1.opendns.com의 IP가 더 빠릅니다.

  • 바르샤바에서 0.023
  • 암스테르담에서 0.009 초

그러나 IP가 변경되면 향후에는 작동하지 않을 수 있습니다 (잘 알려진 DNS 해석 프로그램에는 적합하지 않을 수 있습니다-아마도 외부 IP 스크립트 에서 IP를 사용해야합니다 -의견을 보내 주십시오).

텔넷

텔넷 nc또는 telnet명령 (위 참조)은 일반적으로 다음을 수행합니다.

  • 바르샤바에서 0.103
  • 암스테르담에서 0.035s

( nctelnet명령 사이에는 눈에 띄는 차이가 없습니다 .)

FTP

  • 바르샤바에서 0.104s
  • 암스테르담에서 0.036s

도메인 이름

주어진 서비스의 도메인 이름 대신 IP 주소가 사용될 때 (특히 처음으로 실행될 때) 모든 방법이 더 빠릅니다 (호스트 기반 가상 서버를 사용할 수 있고 베어 IP에서는 작동하지 않는 HTTP 제외)- 서비스가 IP 주소를 변경하면 더 빠르지 만 미래에 대한 증거는 줄어들 수 있습니다.

코멘트

귀하의 위치에서 흥미로운 결과를 보거나 내가 선택한 호스트 대신 다른 호스트를 추천해야한다고 생각되면 의견을 게시하십시오. 중요한 서비스가 누락 된 경우 GitHub에 의견을 게시하거나 문제 를 게시하십시오. 이 게시물을 최신 성능의 최신 서비스로 업데이트하고 싶습니다.


2
Krinkle의 답변myip.opendns.com 에서와 같이 DNS 방법 을 벤치마킹 했습니까 ? 현재이 방법에 대한 다른 공급자를 모르기 때문에 기본적으로 승자가되는 것처럼 보이지만 다른 방법과 비교하는 것이 여전히 유용합니다.
James Haigh

@JamesHaigh 제안 해 주셔서 감사합니다. DNS와 다른 방법 (telnet, ftp)을 대답에 추가했습니다. 가장 빠른 방법은 리졸버의 도메인 이름 대신 IP 주소를 직접 사용하는 DNS 인 것 같습니다.
rsp

canhazip.com / canhazip.com (HTTP 및 HTTPS)도 추가 / 테스트해야합니다 .
xxdesmus

myip.addr.space 를 목록에 추가 할 수 있습니다 . 내가 당시에 보았던 다른 어떤 것에도 특히 만족하지 않았기 때문에 나는 이것을 직접 만들었다.
Michael Hampton

때로는 dig +short myip.opendns.com @resolver1.opendns.com(36.86.63.180), dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short(118.98.115.34) 및 curl http://canhazip.com(36.71.64.71)을 사용하여 다른 결과를 얻습니다 . 어느 것이 올바른지 어떻게 알 수 있습니까?
Sutandiono

80
 curl -s http://whatismijnip.nl |cut -d " " -f 5

네덜란드 작업 사이트로 교체되었습니다.


3
+1 whatismyip.com에 대해 알고 있었지만 whatismyip.org에 대해서는 알지 못했습니다.
Julian

그것에 대해 전혀 몰랐습니다! 좋은 사이트!
bbosak

2
@MaciekSawicki이 경우 -s옵션이 정말로 필요한가요? 나는 내 페도라 15-bash 4.2.10 (1)에서 /없이 시도했지만 두 가지 방식으로 작동했습니다.
ztank1013

4
CLI를 통해 더 이상 작동하지 않지만 웹 브라우저에서 웹 페이지로 이동하면 작동합니다. openSUSE 12.1 x64를 사용하고 있습니다.
SaultDon

5
whatismyip.com외부 IP를 확인하기 위해 무료 서비스 를 제거했습니다 . 따라서 이것이 더 이상 정확하지 않을까 걱정됩니다. icanhazip.com여전히 작동합니다.
daSong

54

이후 whatsmyip.orgifconfig.me은 이미 언급되었다 :

curl -s icanhazip.com

4
또 다른 하나 : ip.appspot.com 또는 ip.appspot.com
Lekensteyn

1
이 두 가지는 IPv6을 지원합니다.
Josh Lee

1
@ JoshLee, icanhazip 은 ipv6도 지원합니다. 또한 OP에 대한 참고 사항에 따르면 이러한 모든 curl솔루션 (유효하지만)은 여전히 ​​외부 라이브러리 ( libcurl) 에 의존합니다 .
HalosGhost

또 하나 : ifcfg.me
Eun

18

whatismyip.org의 대안으로 ifconfig.me 를 사용할 수 있습니다 .

curl -s http://ifconfig.me

또한 ifconfig.me에는 추가 기능이 있습니다. 다른 정보를 얻으려면 웹 사이트를 방문하십시오.


5
그것은이다 매우 느린 . 나는 종종 30 초 이상, 때로는 1 분 이상 응답 시간을받습니다! 때로는 0.5 초 (아직 많이 있음)이고 15 초 정도입니다. 이것은 다른 위치에서 테스트되었습니다. 자세한 정보 및 벤치 마크는 내 답변을
rsp

15
wget -O - -q http://whatismyip.org/

3
나는 이런 식으로 내 IP를 얻을 수 없었습니다.<img src='ipimg.php'/>
Yuugian

괜찮은 정규식 마술을 사용했지만 쉽지는 않았습니다. 이 서비스 사용을 고집하려면 해당 줄을 스크립트로 $ curl -s http://whatismyip.org | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}'
묶어야합니다


9

curlmyip.com을 사용하는 것을 선호합니다.

curl curlmyip.com

짧고 기억하기 쉽습니다.


bashOP의 목적으로 사용하기 위해 -s다른 답변에서 언급 한 옵션 없이는 사용할 수 없습니다 .
Sroo Stroobandt

3
@SergeStroobandt 그렇습니다. 모든 -s스위치는 자동 모드로 실행합니다. 오류 메시지가 표시되지 않습니다. 따라서 스크립트가 오류를 처리하기를 원하는 방식으로 이어집니다. 명령 자체는를 사용하는 것처럼 IP 주소를 안정적으로 반환합니다 -s.
Garrett Fogerlie

1
지금까지이 사이트는 여러 테스트에서 가장 신뢰할 수있는 사이트였습니다.
아모스 샤피 라

9
curl ident.me

또는

curl ifconfig.me

또는

curl tnx.nl/ip

또는

curl ipecho.net/plain

또는

curl ip.appspot.com

또는

curl whatismyip.akamai.com

또는

curl icanhazip.com

또는

curl wgetip.com

또는

curl ip.tyk.nu

또는

curl curlmyip.com

또는

curl corz.org/ip

또는

curl bot.whatismyipaddress.com

참고


6
netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1

사이트가 작동하지만 여기에 공백 출력. 왜 그런지 알아? 관련이 있다면 프록시 뒤에 있지만 wget icanhazip.com작동합니다.
l0b0

@ l0b0 | tail -n1부분 을 생략하고 당신이 프록시에서 무엇을 참조하십시오
Eugene Yarmash

코드 1을 종료하십시오. Ditto for netcat icanhazip.com 80. $http_proxy프록시와 포트를 지정하면 -x프로세스가 중단 되었기 때문에 무시 하고 친구 처럼 보입니다 .
l0b0

@ l0b0 : netcat proxy 3128 <<<$'GET http://icanhazip.com/ HTTP/1.0\n\n' | tail -n 1기본 HTTP 프록시의 경우 (포트 3128에서 실행 중이라고 가정). 그래도 프록시의 IP 주소를 다시 얻을 수 있습니다.
tripleee

1
HTTP 1.0에는 Host:요청 헤더 가 없습니다. 이름 기반 가상 호스팅은 HTTP 1.1의 주요 개선 사항 중 하나였습니다. HTTP / 1.1을 지정하도록 요청을 변경하거나 호스트 헤더를 제거하십시오 (이를 권장합니다).
CVn

4

이 모든 제안을 읽은 후에 더 많은 것을 읽고 싶다면, 과도하게 엔지니어링 된 Bash 스크립트가 있습니다.

2017 년 2 월 현재 제대로 작동하는 것으로 보이는 DNS 및 HTTP 서버 목록이 포함되어 있습니다.

이 있으면 dig먼저 다양한 HTTP 서비스보다 훨씬 빠른 DNS를 시도합니다.

첫 번째 응답에서 종료됩니다.

dig모든 DNS 서버 가 없거나 실패한 경우 응답을받을 때까지 HTTP 서비스를 시도합니다.

서버는 알파벳순으로 나열되어 있지만 항상 같은 서버를 사용하지 않도록 사용 전에 섞습니다.

#!/bin/bash

## Get my external IP

timeout=2   # seconds to wait for a reply before trying next server
verbose=1   # prints which server was used to STDERR

dnslist=(
    "dig +short            myip.opendns.com        @resolver1.opendns.com"
    "dig +short            myip.opendns.com        @resolver2.opendns.com"
    "dig +short            myip.opendns.com        @resolver3.opendns.com"
    "dig +short            myip.opendns.com        @resolver4.opendns.com"
    "dig +short    -t txt  o-o.myaddr.l.google.com @ns1.google.com"
    "dig +short -4 -t a    whoami.akamai.net       @ns1-1.akamaitech.net"
    "dig +short            whoami.akamai.net       @ns1-1.akamaitech.net"
)

httplist=(
    4.ifcfg.me
    alma.ch/myip.cgi
    api.infoip.io/ip
    api.ipify.org
    bot.whatismyipaddress.com
    canhazip.com
    checkip.amazonaws.com
    eth0.me
    icanhazip.com
    ident.me
    ipecho.net/plain
    ipinfo.io/ip
    ipof.in/txt
    ip.tyk.nu
    l2.io/ip
    smart-ip.net/myip
    tnx.nl/ip
    wgetip.com
    whatismyip.akamai.com
)



# function to shuffle the global array "array"
shuffle() {
   local i tmp size max rand
   size=${#array[*]}
   max=$(( 32768 / size * size ))
   for ((i=size-1; i>0; i--)); do
      while (( (rand=$RANDOM) >= max )); do :; done
      rand=$(( rand % (i+1) ))
      tmp=${array[i]} array[i]=${array[rand]} array[rand]=$tmp
   done
}


## if we have dig and a list of dns methods, try that first
if hash dig 2>/dev/null && [ ${#dnslist[*]} -gt 0 ]; then
    eval array=( \"\${dnslist[@]}\" )
    shuffle

    for cmd in "${array[@]}"; do
        [ "$verbose" == 1 ] && echo Trying: $cmd 1>&2
        ip=$(timeout $timeout $cmd)
        if [ -n "$ip" ]; then
            echo $ip
            exit
        fi
    done
fi


# if we haven't succeeded with DNS, try HTTP

if [ ${#httplist[*]} == 0 ]; then
    echo "No hosts in httplist array!" >&2
    exit 1
fi

# use curl or wget, depending on which one we find
curl_or_wget=$(if hash curl 2>/dev/null; then echo "curl -s"; elif hash wget 2>/dev/null; then echo "wget -qO-"; fi);

if [ -z "$curl_or_wget" ]; then
    echo "Neither curl nor wget found. Cannot use http method." >&2
    exit 1
fi

eval array=( \"\${httplist[@]}\" )
shuffle

for url in "${array[@]}"; do
    [ "$verbose" == 1 ] && echo Trying: $curl_or_wget  "$url" 1>&2
    ip=$(timeout $timeout $curl_or_wget "$url")
    if [ -n "$ip" ]; then
        echo $ip
        exit
    fi
done

샘플 사용법 (스크립트라고 함 myip) :

$ myip
Trying: dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com
"151.101.65.69"

$ ip=$(myip); echo "IP = '$ip'"
Trying: dig +short myip.opendns.com @resolver1.opendns.com
IP = '151.101.65.69'

verbose사용 된 서버가 인쇄되지 않도록 스크립트 상단에서 변수를 주석 처리하십시오 .

업데이트 :이 스크립트는 이제 필요할 때 업데이트 할 수있는 Github에도 있습니다 :
https://github.com/mivk/myip


3

잠재적 인 함정을 피하기 위해 HTTPS를 사용하려는 경우 :

_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"

2
아마도 여기서 피해야 할 잠재적 인 함정이 무엇인지 자세히 설명 할 수 있습니까?
Caleb

도메인 ipcheckit.com은 분명히 판매용이며 더 이상 IP 주소 표시 서비스를 호스팅하지 않습니다.
manatwork


@Chris Down 기술은 여전히 ​​유효합니다.이 기술을 사용하려면 다른 SSL 지원 사이트가 필요합니다.
Caleb

3

비즈니스가 동적 IP 관리를 해결하는 호스트에 의존하는 또 다른 대안은 다음과 같습니다. "공공 서비스"사이트가 사라지거나 형식이 변경 될 수 있습니다.

  1. 많은 무료 동적 DNS 서비스 중 하나에 서버를 등록하십시오 (예 : no-ip.com) xxx.no-ip.org와 같은 DNS 항목을 제공합니다.
  2. 서비스의 동적 업데이트 도구를 설치합니다 (IP 변경 사항을 서비스에보고).

스크립트에서 IP 주소를 얻으려면 다음을 수행하십시오.

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

cron 작업에서 동적 IP가 변경되었고 일부 구성 항목을 변경해야하는지 확인하는 데 유용합니다.


3

이것은 항상 나를 위해 작동합니다, 나는 내 IP 주소를 얻기 위해 내 conky에서 사용합니다.

wget -q -O - checkip.dyndns.org | sed -e 's/[^[:digit:]\|.]//g'

+1 너무 어색해 보이지만이 접근 방식은 나에게 너무나도 생명을 구해 주었다. 때문에 인터넷은 WWW하지 않습니다 . 인터넷에 액세스 할 수 있지만 (일반적으로 서버 룸에서) GUI가 아닌 콘솔로 파견 될 수 있습니다.이 경우 checkIP 서비스 URL 중 하나 를 기억 하는 것이 중요 합니다. 그리고 이것은 매우 일반적이기 때문에 DynDNS 중 하나보다 DynDNS를 기억할 가능성이 높기 때문에 컴파일 된 것처럼 보입니다amazonaws . 즉, 구글에 대한 방법이 없다면. (조차도 lynx).
syntaxerror

3

연결이나 서비스에 의존하지 않기 때문에 다음 코드를 사용합니다.이 코드는 다른 서비스를 사용하여 IP를 가져 오려고 시도합니다 (자유롭게 추가하십시오).

# Get my ip address and put in a file
declare -a arr=("ipecho.net/plain" "ident.me" "tnx.nl/ip" "ip.appspot.com" "https://shtuff.it/myip/short/")
IP=$(curl -s --retry 3 --retry-delay 10 ipecho.net/plain)

while [ -z "$IP" ] # If no IP found yet, keep trying!
do
    sleep 30
    IP=$(curl -s --retry 3 --retry-delay 10 ${arr[$((  RANDOM % ${#arr[@]}  ))]})  
done

echo -n "$IP" >  /root/clientIP.txt #puts ip address in clientIP.txt
echo "Our address is $IP" 

보다 강력한 기능을 추가하려면 (예 : 서비스 중 하나가 형식을 변경 $IP하는 경우) 다음 기능을 사용하여 유효한 IP인지 확인할 수 있습니다 .

# Verify that the parameter passed is an IP Address:
# http://zindilis.com/blog/2013/05/10/bash-check-that-string-is-ip.html
# @Author: Marios Zindilis
# @License: Creative Commons Attribution-ShareAlike 4.0 International License.
# @Date: 2013-05-10
function is_IP() {
if [ `echo $1 | grep -o '\.' | wc -l` -ne 3 ]; then
        echo "Parameter '$1' does not look like an IP Address (does not contain 3 dots).";
        exit 1;
elif [ `echo $1 | tr '.' ' ' | wc -w` -ne 4 ]; then
        echo "Parameter '$1' does not look like an IP Address (does not contain 4 octets).";
        exit 1;
else
        for OCTET in `echo $1 | tr '.' ' '`; do
                if ! [[ $OCTET =~ ^[0-9]+$ ]]; then
                        echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' is not numeric).";
                        exit 1;
                elif [[ $OCTET -lt 0 || $OCTET -gt 255 ]]; then
                        echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' in not in range 0-255).";
                        exit 1;
                fi
        done
fi

return 0;
}

3

ifcfg.me 는 다음을 지원합니다.

curl ifcfg.me
nslookup . ifcfg.me
telnet ifcfg.me
ftp ifcfg.me
finger @ifcfg.me

curl : ifcfg.me/?


nslookupdig방법은 Krinkle의 답변 에 있는 방법과 어떤 관련이 있습니까? 둘 다 DNS를 사용합니다. 여기에서 수행 dig하는 것과 동일한 DNS 레코드를 검색하도록 옵션을 전달할 수 nslookup있습니까?
James Haigh

dig +short . @ifcfg.me원한다면 사용할 수 있어요
Eun

2

나는 가족을 위해 클라우드 서비스를 운영하고 cron있으며 정적 IP를 구입하지 않을 것이기 때문에 매일 아침 5시에 실행하는이 빠른 스크립트를 만들었습니다 .

공개 IP를 가져 와서 내 사용자에게 이메일로 보냅니다. 엄마가 포트 나 다른 것을 입력 할 필요가 없도록 하이퍼 링크 형식으로 전자 메일을 만들었습니다. 다른 사람이 사용할 수 있습니다.

#!/bin/bash
ipvariable=$(wget http://ipecho.net/plain -O - -q);

echo "Today the location is http://$ipvariable:123456/foldertheyreach" | mail -s   "From your friendly cloud service provider" user1@someemail.com, user2@ect.com

1

팝업 창에 현재 IP 주소가 표시됩니다.

zenity --info --text "$(curl -s icanhazip.com)"

1

IP 주소를 JSON / XML 또는 일반 텍스트로 반환하는 서비스를 설정했습니다. 여기에서 찾을 수 있습니다

http://ipof.in/txt

/ json 및 / xml과 동일한 URL은 다른 형식도 제공합니다.

HTTPS를 원할 경우 https 접두사와 동일한 URL을 사용할 수 있습니다. Wi-Fi를 사용하더라도 공개 주소를 얻을 수 있다는 장점이 있습니다.

따라서 간단한 별칭 myip = "curl https://ipof.in/txt "는 IP를 얻습니다.


1

또는 STUN 을 사용 하여 자동화 된 방식으로이 질문에 대답하고 SIPWebRTC 와 같은 인터넷 통신에 광범위하게 사용됩니다 .

stunclient (debian / ubuntu do에서 apt-get install stuntman-client)를 사용하면 간단히 :

$ 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로컬 네트워크에있는 컴퓨터 W.X.Y.Z의 IP 주소는 외부 (및 원하는 서버)에서 볼 수있는 웹 사이트와 같은 IP 주소 서버입니다. 를 사용 sed하면 위의 출력을 IP 주소로만 줄일 수 있습니다.

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

기본 명령 줄 도구 만 사용하는 대안 STUN 조회 는 AskUbuntu에 대한 내 대답을 참조하십시오 (생산 용도가 아닌 재미있는 연습으로 의도 됨).


0

w3m Plaintext-Browser는 bash에 좋습니다. 다음과 같이 답을 사용 grep하고 tail단축 할 수 있습니다 .

w3m -no-cookie -dump "http://www.whatismyip.com/" | grep -A 1 -m 1 "Your IP:" | tail -n 1


0

DNS 주소를 변환하는 NAT 라우터 뒤에서도 DNS 요청을 사용하면 다음과 같이 작동합니다.

$ dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com | cut -d'"' -f2
x.y.z.t

또는 대신 HTTP 요청 방법을 사용할 수 있습니다.

$ curl -s ipinfo.io/ip
x.y.z.t

1
왜 다른 것을 추천 하시겠습니까?
roaima

@roaima 당신이 옳습니다, 결정하는 것은 각 사용자에게 달려 있습니다.
SebMa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.