쉘 스크립트에서 퍼블릭 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.