프로그래밍 방식으로 IP 주소를 추출하는 쉬운 방법이 있습니까? [복사]

프로그래밍 방식으로 IP 주소를 추출하는 쉬운 방법이 있습니까? [복사]

지루한 구문 분석 없이 프로그래밍 방식으로 IP 주소를 추출하는 쉬운 방법이 있습니까 ifconfig? 이 작업을 수행하기 위해 간단한 명령 출력 처리를 사용하는 것은 괜찮지만 sed어딘가에서 여러 줄의 파일을 처리하는 것도 괜찮습니다. /etc내가 하고 싶은 것은 .bashrc안녕하세요 메시지에 호스트의 IP 주소를 표시하도록 수정하는 것입니다. 저는 를 사용하고 있지만 Ubuntu 12.04이것이 배포판에 국한되지 않는다고 생각하기 때문에 Ubuntu 포럼 대신 여기에 게시하기로 결정했습니다.

답변1

노트

  1. NIC 장치 핸들

    다음 예에서는 네트워크 인터페이스 이름이 WirelessCard 라고 가정합니다 wlan0. 이 예를 특정 상황에 맞게 조정하세요. 예를 들어, 유선 NIC 카드라면 아마도 eth0.

  2. IPv4 - (인터넷 프로토콜 버전 4)

    이 예에서는 IPv4 주소도 반환합니다. 대부분의 사람들은 이를 "IP 주소"의 "점선 사각형"으로 생각합니다.

    예를 들어:

    inet addr:192.168.1.20  Bcast:192.168.1.255  Mask:255.255.255.0
    
  3. IPv6 - (인터넷 프로토콜 버전 6)

    시스템이 IPv6을 지원하도록 구성된 경우 출력에 IPv6 IP 주소와 함께 "점선 사변형"이 표시됩니다 ifconfig.

    예를 들어:

    inet6 addr: fe80::226:c7ff:fe85:a720/64 Scope:Link
    

    아래 명령은 이를 명시적으로 무시하지만 이 정보를 얻기 위해 쉽게 조정할 수 있습니다.

솔루션(사용 ifconfig)

이를 수행하는 방법에는 여러 가지가 있습니다. 예를 들어, 이 awk스크립트를 사용하여 무선 LAN NIC(wlan0)의 IP 주소를 확인할 수 있습니다.

$ ifconfig wlan0 | grep "inet " | awk -F'[: ]+' '{ print $4 }'
192.168.1.20

이렇게 하면 더 컴팩트하게 만들 수 있습니다.

$ ifconfig wlan0 | awk '/t addr:/{gsub(/.*:/,"",$2);print$2}'
192.168.1.20

다음을 사용할 수도 있습니다 perl.

$ ifconfig wlan0 | perl -nle'/t addr:(\S+)/&&print$1'
192.168.1.20

Perl 예제는 가능한 한 간결하게 유지됩니다.

이를 수행하는 다른 방법은 셀 수 없이 많습니다. 다음은 시작하기 위한 몇 가지 예일 뿐입니다.

편집 #1

몇 가지 추가 참고사항 및 의견입니다. @StephaneChazelas는 다음을 사용하여 더 컴팩트한 버전이 있음을 증명했습니다 grep.

$ ifconfig wlan0|grep -Po 't addr:\K[\d.]+'
192.168.1.20

grep이 솔루션은 최신 버전의 PCRE(Perl 정규 표현식) 기능을 활용 하고 -o정규 표현식과 일치하는 콘텐츠만 반환하도록 전환합니다.

솔루션(사용 ip)

댓글에서도 언급했듯이 ifconfig네트워크 장치에 여러 개의 IP 주소가 할당된 시스템에서 사용하는 것은 첫 번째 IP 주소만 반환하기 때문에 번거로울 수 있습니다. 따라서 ip이러한 상황에서는 이 명령을 사용하는 것이 가장 좋습니다.

예를 들어:

$ ip addr show wlan0 | grep -Po 'inet \K[\d.]+'
192.168.1.20

ip특정 네트워크 인터페이스에 대한 IPv4 정보만 표시되도록 지정할 수도 있습니다 . 이 예에서는 다음과 같은 인터페이스만 살펴봅니다 wlan0.

$ ip -f inet addr show wlan0 | grep -Po 'inet \K[\d.]+'
192.168.1.20

인용하다

답변2

$ hostname -I

예를 들어:

$ hostname -I
192.168.1.18

정보. 맨페이지에서:

http://manpages.ubuntu.com/manpages/raring/en/man1/hostname.1.html
http://unixhelp.ed.ac.uk/CGI/man-cgi?호스트 이름

답변3

이는 "ip"를 사용하는 또 다른 방법이지만 장치가 다른 인터페이스(예: 때로는 유선 이더넷, 때로는 WiFi)에 연결될 수 있을 때 더 잘 작동합니다. 다양성을 위해 "grep"이나 "perl" 대신 "sed"도 사용합니다.

그러면 인터넷으로 연결되는 경로가 있는 모든 소스 IP가 검색됩니다. 아니면 어쨌든 Google의 DNS입니다.

ip -o route get 8.8.8.8 | sed -e 's/^.* src \([^ ]*\) .*$/\1/'

관련 정보