[bash] Linux 및 OS X에서 로컬 시스템의 기본 IP 주소를 얻는 방법은 무엇입니까? [닫은]
127.0.0.1 이외의 로컬 호스트의 기본 (첫 번째) IP 주소를 반환하는 명령 줄 솔루션을 찾고 있습니다.
이 솔루션은 적어도 Linux (Debian 및 RedHat) 및 OS X 10.7 이상에서 작동해야합니다.
나는 ifconfig
둘 다에서 사용할 수 있지만 그 플랫폼간에 그 출력이 일관성이 없다는 것을 알고 있습니다.
답변
다음 grep
에서 IP 주소를 필터링하는 데 사용 합니다 ifconfig
.
ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'
또는과 sed
:
ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'
특정 인터페이스 wlan0, eth0 등에 관심이있는 경우 :
ifconfig wlan0 | ...
예를 들어, 자신 의 명령에 별명을 지정 하여 자신 만의 명령 .bashrc
을 작성할 수 있습니다 myip
.
alias myip="ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'"
훨씬 간단한 방법은 hostname -I
( hostname -i
이전 버전의 hostname
경우 주석 참조)입니다. 그러나 이것은 Linux에만 있습니다.
답변
다음은 Linux에서는 작동하지만 OSX에서는 작동하지 않습니다.
이것은 전혀 DNS에 의존하지 않으며 /etc/hosts
올바르게 설정되지 않은 경우에도 작동 합니다 (의 1
약어 1.0.0.0
).
ip route get 1 | awk '{print $NF;exit}'
또는 명확성 awk
을 8.8.8.8
위해 Google의 공개 DNS를 피하고 사용하는 행위 :
ip route get 8.8.8.8 | head -1 | cut -d' ' -f8
덜 신뢰할 수있는 방법 : (아래 주석 참조)
hostname -I | cut -d' ' -f1
답변
Linux 머신 (OS X 아님)의 경우 :
hostname --ip-address
답변
리눅스에서
hostname -I
macOS에서
ipconfig getifaddr en0
hostname -I
신뢰할 수없는 순서 (참조에 여러 개의 주소를 반환 할 수 맨 페이지 ), 그러나 저 그것은 단지 반환을위한 , 이는 당신이 원하는 것입니다.hostname
192.168.1.X
답변
해결책
$ ip -o route get to 8.8.8.8 | sed -n 's/.*src \([0-9.]\+\).*/\1/p'
192.168.8.16
설명
네트워크 정보를 쿼리 하는 올바른 방법은 다음을 사용하는 것입니다 ip
.
-o
한 줄 출력route get to
실제 커널 경로를 목적지로 가져 오기8.8.8.8
Google IP이지만 도달하려는 실제 IP를 사용할 수 있습니다
예 : ip
출력 :
8.8.8.8 via 192.168.8.254 dev enp0s25 src 192.168.8.16 uid 1000 \ cache
src
ip 를 추출하려면 sed
가장 적고 정규식 지원과 가장 호환됩니다.
-n
기본적으로 출력이 없습니다's/pattern/replacement/p'
패턴 일치 및 인쇄 교체 만.*src \([0-9.]\+\).*
커널이 사용하는 src IP와 일치하여8.8.8.8
예 : 최종 출력 :
192.168.8.16
다른 답변들
앞의 답변 중 어느 것도 최근 컴퓨터 (Gentoo 2018)에서 작동하지 않기 때문에 나에게 충분하지 않다고 생각합니다.
이전 답변에서 찾은 문제 :
- 명령 출력에서 위치 열 사용;
- 사용
ifconfig
은 더 이상 사용되지 않으며 예를 들어 여러 IP를 나열하지 않습니다. - 사용
awk
sed가 더 잘 처리 할 수있는 간단한 작업에 ; ip route get 1
명확하지 않으며 실제로는ip route get to 1.0.0.0
- 모든 어플라이언스에 옵션
hostname
이없고 제 경우에는-I
반환 되는 명령 사용127.0.0.1
.
답변
편집 됨 ( 2014-06-01 2018-01-09)
더 많은 구성과 각 인터페이스에 많은 IP가 구성된 더 강력한 구성을 위해 올바른 인터페이스 와 ip를 기반으로 하는 순수한 bash 스크립트를 기반으로하지 않았습니다 . 나는이 답변을 맨 아래 에이 스크립트를 게시합니다.127.0.0.1
default route
소개
두 Os 모두가 세게 때리다 기본적으로 설치되면 Mac과 Linux 모두에 대한 bash 팁이 있습니다.
로케일 문제는 다음을 사용하여 방지됩니다 LANG=C
.
myip=
while IFS=$': \t' read -a line ;do
[ -z "${line%inet}" ] && ip=${line[${#line[1]}>4?1:2]} &&
[ "${ip#127.0.0.1}" ] && myip=$ip
done< <(LANG=C /sbin/ifconfig)
echo $myip
이것을 함수에 넣는 것 :
최소 :
getMyIP() {
local _ip _line
while IFS=$': \t' read -a _line ;do
[ -z "${_line%inet}" ] &&
_ip=${_line[${#_line[1]}>4?1:2]} &&
[ "${_ip#127.0.0.1}" ] && echo $_ip && return 0
done< <(LANG=C /sbin/ifconfig)
}
간단한 사용 :
getMyIP
192.168.1.37
멋진 정리 :
getMyIP() {
local _ip _myip _line _nl=$'\n'
while IFS=$': \t' read -a _line ;do
[ -z "${_line%inet}" ] &&
_ip=${_line[${#_line[1]}>4?1:2]} &&
[ "${_ip#127.0.0.1}" ] && _myip=$_ip
done< <(LANG=C /sbin/ifconfig)
printf ${1+-v} $1 "%s${_nl:0:$[${#1}>0?0:1]}" $_myip
}
용법:
getMyIP
192.168.1.37
또는 동일한 기능을 실행하지만 인수가 있습니다.
getMyIP varHostIP
echo $varHostIP
192.168.1.37
set | grep ^varHostIP
varHostIP=192.168.1.37
참고 : 인수가 없으면이 함수는 STDOUT, IP 및 newline 에서 인수와 함께 출력되며 아무 것도 인쇄되지 않지만 arguments라는 변수가 만들어지고 newline 없이 IP가 포함 됩니다.
Nota2 : Debian, LaCie hacked nas 및 MaxOs에서 테스트되었습니다. 이것이 귀하의 환경에서 작동하지 않으면 피드백에 매우 관심이 있습니다!
이 답변의 이전 버전
(기반이 아니기 때문에 삭제 sed
되지 않았습니다 bash
.)
경고 : 로케일에 대한 문제가 있습니다!
빠르고 작은 :
myIP=$(ip a s|sed -ne '/127.0.0.1/!{s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p}')
폭발 (일도한다)
myIP=$(
ip a s |
sed -ne '
/127.0.0.1/!{
s/^[ \t]*inet[ \t]*\([0-9.]\+\)\/.*$/\1/p
}
'
)
편집하다:
어떻게! 이것은 Mac OS에서 작동하지 않는 것 같습니다 …
좋아, 이것은 내 리눅스 에서 와 맥 OS 에서 작동하는 것처럼 보인다 .
myIP=$(LANG=C /sbin/ifconfig | sed -ne $'/127.0.0.1/ ! { s/^[ \t]*inet[ \t]\\{1,99\\}\\(addr:\\)\\{0,1\\}\\([0-9.]*\\)[ \t\/].*$/\\2/p; }')
쪼개짐 :
myIP=$(
LANG=C /sbin/ifconfig |
sed -ne $'/127.0.0.1/ ! {
s/^[ \t]*inet[ \t]\\{1,99\\}\\(addr:\\)\\{0,1\\}\\([0-9.]*\\)[ \t\/].*$/\\2/p;
}')
내 스크립트 (2018 년 1 월) :
이 스크립트는 먼저 사용 된 기본 경로 및 인터페이스 를 찾은 다음 게이트웨이의 로컬 IP 일치 네트워크를 검색 하고 변수를 채 웁니다. 마지막 두 줄은 다음과 같이 인쇄됩니다.
Interface : en0
Local Ip : 10.2.5.3
Gateway : 10.2.4.204
Net mask : 255.255.252.0
Run on mac : true
또는
Interface : eth2
Local Ip : 192.168.1.31
Gateway : 192.168.1.1
Net mask : 255.255.255.0
Run on mac : false
글쎄요 :
#!/bin/bash
runOnMac=false
int2ip() { printf ${2+-v} $2 "%d.%d.%d.%d" \
$(($1>>24)) $(($1>>16&255)) $(($1>>8&255)) $(($1&255)) ;}
ip2int() { local _a=(${1//./ }) ; printf ${2+-v} $2 "%u" $(( _a<<24 |
${_a[1]} << 16 | ${_a[2]} << 8 | ${_a[3]} )) ;}
while IFS=$' :\t\r\n' read a b c d; do
[ "$a" = "usage" ] && [ "$b" = "route" ] && runOnMac=true
if $runOnMac ;then
case $a in
gateway ) gWay=$b ;;
interface ) iFace=$b ;;
esac
else
[ "$a" = "0.0.0.0" ] && [ "$c" = "$a" ] && iFace=${d##* } gWay=$b
fi
done < <(/sbin/route -n 2>&1 || /sbin/route -n get 0.0.0.0/0)
ip2int $gWay gw
while read lhs rhs; do
[ "$lhs" ] && {
[ -z "${lhs#*:}" ] && iface=${lhs%:}
[ "$lhs" = "inet" ] && [ "$iface" = "$iFace" ] && {
mask=${rhs#*netmask }
mask=${mask%% *}
[ "$mask" ] && [ -z "${mask%0x*}" ] &&
printf -v mask %u $mask ||
ip2int $mask mask
ip2int ${rhs%% *} ip
(( ( ip & mask ) == ( gw & mask ) )) &&
int2ip $ip myIp && int2ip $mask netMask
}
}
done < <(/sbin/ifconfig)
printf "%-12s: %s\n" Interface $iFace Local\ Ip $myIp \
Gateway $gWay Net\ mask $netMask Run\ on\ mac $runOnMac
답변
우분투의 특정 빌드에만 해당합니다. 그것은 단지 당신에게 말할 수 있지만 127.0.0.1
:
hostname -i
또는
hostname -I