![짧은 대답은 다음과 같습니다.](https://linux55.com/image/16255/%EC%A7%A7%EC%9D%80%20%EB%8C%80%EB%8B%B5%EC%9D%80%20%EB%8B%A4%EC%9D%8C%EA%B3%BC%20%EA%B0%99%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
내 IP 주소를 어떻게 얻고 이를 쉘 스크립트의 변수에 저장합니까?
답변1
나는 ipv4 주소를 얻는 "현대적인 도구" 방법은 ip
대신 이를 구문 분석하는 것이라고 생각하므로 ifconfig
다음과 같습니다.
ip4=$(/sbin/ip -o -4 addr list eth0 | awk '{print $4}' | cut -d/ -f1)
ip6=$(/sbin/ip -o -6 addr list eth0 | awk '{print $4}' | cut -d/ -f1)
또는 그런 것.
답변2
그냥 간단하게 해보면 어떨까요 IP=$(hostname -I)
?
답변3
WLAN 및 기타 대체 인터페이스를 고려하고 싶다면 그렇게 쉽지 않습니다. 주소를 원하는 인터페이스(예: 첫 번째 이더넷 카드인 eth0)를 알고 있는 경우 다음 명령을 사용할 수 있습니다.
ip="$(ifconfig | grep -A 1 'eth0' | tail -1 | cut -d ':' -f 2 | cut -d ' ' -f 1)"
즉, 네트워크 구성 정보를 가져오고, find를 eth0
가져와서 이 행과 다음 행( -A 1
)을 가져오고,오직마지막 줄의 경우 로 분할할 때 줄의 두 번째 부분을 가져온 :
다음 공백으로 분할할 때 줄의 첫 번째 부분을 가져옵니다.
답변4
나는 바보가 되려고 노력하는 것이 아니지만 하나가 있습니다옳은그게 다야. ip route
소스 IP만 얻으려면 출력을 다듬어야 합니다 . "내 IP 주소"(OP의 단어)는 액세스하려는 IP에 따라 다릅니다. 공용 인터넷 액세스에 관심이 있다면 Google의 8.8.8.8 DNS 서버를 사용하는 것이 매우 표준입니다. 그래서...
짧은 대답은 다음과 같습니다.
ip route get 8.8.8.8 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
자세한 설명입니다
내가 도달하는 데 사용하는 IP를 원하는 경우인터넷, 나는 이것을 사용합니다 :
pi@et3:~ $ ip route get 8.8.8.8 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
10.55.0.200
내 IP를 사용하여 내 웹사이트의 내용에 액세스하려는 경우VPN, 나는 이것을 사용합니다 :
pi@et3:~ $ ip route get 172.31.0.100 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
172.29.0.9
다음 게시물은 실제로 설명을 위한 것입니다. 그러나 모든 Linux 시스템에서 작동해야 합니다. 따라서 이를 사용하여 모든 컴퓨터가 항상 여러 개의 IP 주소를 가지고 있음을 증명할 수 있습니다.
내가 도달하는 데 사용하는 IP를 원하는 경우나, 나는 이것을 사용합니다 :
pi@et3:~ $ my_ip=$(getent hosts $(cat /etc/hostname) | awk '{print $1; exit}')
pi@et3:~ $ ip route get $my_ip | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
127.0.0.1
명령 에 대한 sed
추가 정보
제가 가장 먼저 말씀드리고 싶은 것은 유닉스 도구를 선택할 때 최소한의 파이프가 필요한 도구를 선택하라는 것입니다. 따라서 일부 답변 은 ifconfig
로 전달되지만 이는 거의 필요하지 않습니다. 이를 보면 경험이 적은 사람의 조언을 받고 있다는 경고 신호가 보내질 것입니다.grep
sed
head
이는 "해결책"이 잘못되었다는 의미는 아닙니다.그러나 약간의 합리화가 필요할 수 있습니다.
sed
.(아래에 awk 예제가 있습니다.) 이 두 가지 도구 외에 다른 도구 는 적합 하지 awk
않을 것이라고 생각합니다.
sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'
그것이 무엇을 하는지 보자 :
sed # the sed executable located via $PATH
-n # no output unless explicitly requested
' # begin the command space
/src/ # regex match the string 'src'
{ # begin a block of commands **
s/ # begin a substitution (match)
.*src * # match anything leading up to and including src and any number of spaces
\([^ ]*\) # define a group containing any number of non spaces
.* # match any trailing characters (which will begin with a space because of the previous rule).
/ # begin the substitution replacement
\1 # reference the content in the first defined group
/ # end the substitution
p # print (explicitly, remember) the result
; # designate the end of the command
q # quit
} # end the block of commands
' # end the command space
** all of which will be performed "on match"
- otherwise only the first command to following the match would be performed "on match"
- any other commands would be performed whether there was a match or not
노트:
나는 그것을 사용했지만 댓글 작성자는 일부 시스템이 필드 뒤에 후행 데이터를 가지고 있음 sed -n '/src/{s/.*src *//p;q}'
을 지적했습니다 .src
awk를 사용하세요
ip route get 8.8.8.8 | \
awk '{gsub(".*src",""); print $1; exit}'
# or
ip route get 8.8.8.8 | \
awk '{for(i=1; i<NF; i++){if($i=="src"){i++; print $i; exit}}}'
내 네트워크에 대한 추가 정보
내 VPN과 LAN이 ifconfig
모두 표시됩니다 .tun0
eth0
pi@et3:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.55.0.200 netmask 255.255.252.0 broadcast 10.55.3.255
inet6 fe80::71e6:5d7c:5b4b:fb25 prefixlen 64 scopeid 0x20<link>
ether b8:27:eb:b2:96:84 txqueuelen 1000 (Ethernet)
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 172.29.0.9 netmask 255.255.255.255 destination 172.29.0.10
inet6 fe80::3a8e:8195:b86c:c68c prefixlen 64 scopeid 0x20<link>
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
wlan0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether b8:27:eb:e7:c3:d1 txqueuelen 1000 (Ethernet)