쉘 스크립트에서 퍼블릭 IP 주소 찾기


39

ifconfig 또는 hostname -i 명령을 사용하여 IP 주소를 찾을 수 있습니다.

하지만 공개 IP는 어떻게 찾습니까?

(정적 공개 IP가 있지만 유닉스 명령을 사용하여 찾으려고합니다)


프로그래밍 방식 으로이 작업을 수행하려고합니까?
Andrew Keith

쉘 스크립트에서 예
shantanuo

1
Linux, MacOSX, FreeBSD 등을 사용하고 있습니까? 'ifconfig'의 출력은 이러한 OS마다 다르며 'ip'명령은 MacOSX에 존재하지 않습니다. 컴퓨터의 IP (ifconfig 등을 구문 분석하려면 셸 스크립트가 필요함) 또는 라우터 (아래 웹 사이트가 작동 할 수 있음)를 찾고 있습니까?
Stefan 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, protected : /
Aliostad 2016 년

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.
Michael Kropat

2
나에게 가장 dig @208.67.222.220 myip.opendns.com +short효과적인 것은 전체 답변을 거치지 않고 직접 IP를 얻는 것입니다.
Christopher Chiche

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, 당신은 구글을 제외하고 (이것은 미래에 분해 위험 txt에 대한 어떤 수도 실제로 일을 Google에서 올바르게 사용하도록 설정 한 경우 IPv6 1 일).

myip.opendns.com통해서만 해결할 수 resolver1.opendns.com있으며, 그렇지 않은 경우도 auth1.opendns.com있습니다. 따라서 DNS 하이재킹과 도메인 이름 중간자 (man-in-the-middle)를 수행하는 것 같습니다! 따라서에 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 2016 년

요즘 Google에서 TXT 레코드를 가져 오는 방법은 IPv4와 IPv6을 모두 지원하므로 특정 IP 버전을 지정 -4하거나 -6필요로해야합니다.
Martin

12

인터넷에 연결되어있는 경우 매우 간단한 답변은 다음과 같습니다.

curl icanhazip.com

IP에 대한 제 3 자 소스를 신뢰하는 것은 특히 해당 데이터로 수행하는 작업에 특별한 의미가있는 경우 문제가 될 수 있습니다.

보다 신뢰할 수있는 방법은 신뢰할 수있는 알려진 DNS 서버 (이상적으로 DNSSEC를 실행)를 선택하고 상자의 호스트 이름을 쿼리하여 DNS 서버에 이러한 항목이 포함되어있는 것입니다.

dig @trustworthysource.com +short `hostname`

8

이를 위해 간단하고 빠른 웹 서비스를 작성했습니다.

curl ident.me

IPv4를 요청할 수 있습니다 :

curl v4.ident.me

또는 IPv6 :

curl v6.ident.me

API는 http://api.ident.me/에 문서화되어 있습니다.



5

만약

  1. 당신은 오직이 하나 개의 공인 IP 주소 및
  2. 인터넷에 직접 연결되어 있습니다 (NAT / 프록시 / VPN 등 없음)

인터페이스의 IP 주소 ( "inet addr :"부분)에 대한 ifconfig의 출력을 구문 분석하여 모든 인터페이스의 IP 주소 목록을 얻을 수 있습니다. 개인 범위에없는 하나의 IP 주소 ( http://en.wikipedia.org/wiki/IP_address#IPv4_private_addresses 참조 )는 공용 IP 주소입니다.

동일한 목록을 통해 얻을 수도 있습니다

ip addr show

파싱하기가 더 쉬울 수 있습니다.

인터넷에 직접 연결되어 있지 않은 경우 (NAT 등) 외부 도움없이 컴퓨터를 알 수 없으므로 공용 IP 주소를 찾을 수 없습니다. 그런 다음 다른 답변과 마찬가지로해야합니다.


4

NAT Traversal을 위해 설계된 STUN 프로토콜을 사용하여 조금 다른 접근 방식을 취했습니다. Ubuntu를 사용하는 경우 다음을 입력하여 "stun"패키지를 설치할 수 있습니다.

sudo apt-get install stun

패키지는 아마도 필요하지 않은 STUN 서버를 설치하지만이 문제를 해결하는 데 사용 된 STUN 테스트 클라이언트와 함께 제공됩니다. 이제 간단하지 않은 하나의 명령으로 퍼블릭 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

한 가지 방법은에서 페이지를 요청할 수 있습니다.

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

시스템의 IP 주소를 반환합니다


텍스트 / html 유형의 일반 텍스트를 제공합니다.
bortzmeyer

브라우저에 IP가 표시되지 않습니까?

2
그러나 잘못된 유형으로.
bortzmeyer 2009

@ bortzmeyer 어, "올바른 유형"은 무엇입니까? text/html의사 API가 반환하는 것에 적합합니다 .XML 또는 JSON이 아닙니다. text/plain아마도,하지만 완전히 사용할 수 있습니다 text/html.
ceejayoz

3
grepping 할 필요가없는 페이지의 경우 +1 또한wget -q -O - http://wgetip.com/
xofer

3

Google은 이제 공개 IP 주소를 표시합니다 : http://www.google.com/search?q=ip


브라우저 나 컬을 통해 작동하지 않습니다.
Ladadadada 2016 년

이상하다. Mine은 첫 번째 serp 앞에 "공용 IP 주소는 XX.XX.XXX.XX-자세히 알아보십시오"라고 말합니다.
Jake Wilson


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')을 사용 하여이 작업을 수행 할 수도 있습니다 .
Redsandro

3

가장 간단한 방법은 제안 된대로 http://ifconfig.me/ 를 사용하는 것입니다 .

이 페이지에서 검색하려는 정보에 어떤 명령을 사용해야하는지 알 수 있습니다.

IP의 경우 :

ifconfig.me 컬
또는
ifconfig.me/ip를 말리십시오

퍼블릭 호스트 이름 :

ifconfig.me/host를 말리십시오

XML 파일의 모든 정보 :

ifconfig.me/all.xml 컬

등 ... http://ifconfig.me를 확인하십시오.


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. 커스텀 텔넷 서버로 빠른 해킹 : xinetd spawning / 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
    }
    

    그런 다음 텔넷으로 연결하십시오.

    $ 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

외부 소스에 의존하지 않기 위해 라우터에 텔넷으로 연결하고 공용 인터페이스의 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

물론 이것은 ifconfig 명령을 사용하여 라우터 및 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-덤프 http://www.whatismyip.com/ | grep -o '[0-9]. * \. [0-9]. * \. [0-9]. * \. [0-9]. *'
-m1 

0

나는 이것을한다. 그것은 단지 제 3 자의 개입없이 IP를 제공합니다 ..

IP 주소 표시 | grep eth0 | grep inet | tr -s ""| 컷 -f3 -d ""| 컷 -f1 -d "/"


3
그는 자신의 공개 IP 주소를 원합니다. 현지인이 아닙니다.
Jake Wilson

0
wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'

0

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

1) 많은 무료 동적 DNS 서비스 중 하나에 서버를 등록하십시오 (예 : no-ip.com) xxx.no-ip.org와 같은 DNS 항목을 제공합니다.

2) 서비스의 동적 업데이트 도구를 설치합니다 (IP 변경 사항을 서비스에보고).

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

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

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


0

OS X에는 프라이빗 및 퍼블릭 IP를 모두 얻을 수있는 두 가지 간단한 솔루션이 있습니다 (LaunchBar를 사용하는 경우 보너스 코드 포함).

개인 IP

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

런치 바 스크립트

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

런치 바 스크립트

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