지루한 구문 분석 없이 프로그래밍 방식으로 IP 주소를 추출하는 쉬운 방법이 있습니까 ifconfig
? 이 작업을 수행하기 위해 간단한 명령 출력 처리를 사용하는 것은 괜찮지만 sed
어딘가에서 여러 줄의 파일을 처리하는 것도 괜찮습니다. /etc
내가 하고 싶은 것은 .bashrc
안녕하세요 메시지에 호스트의 IP 주소를 표시하도록 수정하는 것입니다. 저는 를 사용하고 있지만 Ubuntu 12.04
이것이 배포판에 국한되지 않는다고 생각하기 때문에 Ubuntu 포럼 대신 여기에 게시하기로 결정했습니다.
답변1
노트
NIC 장치 핸들
다음 예에서는 네트워크 인터페이스 이름이 WirelessCard 라고 가정합니다
wlan0
. 이 예를 특정 상황에 맞게 조정하세요. 예를 들어, 유선 NIC 카드라면 아마도eth0
.IPv4 - (인터넷 프로토콜 버전 4)
이 예에서는 IPv4 주소도 반환합니다. 대부분의 사람들은 이를 "IP 주소"의 "점선 사각형"으로 생각합니다.
예를 들어:
inet addr:192.168.1.20 Bcast:192.168.1.255 Mask:255.255.255.0
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/'