짧은 대답은 다음과 같습니다.

짧은 대답은 다음과 같습니다.

내 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로 전달되지만 이는 거의 필요하지 않습니다. 이를 보면 경험이 적은 사람의 조언을 받고 있다는 경고 신호가 보내질 것입니다.grepsedhead이는 "해결책"이 잘못되었다는 의미는 아닙니다.그러나 약간의 합리화가 필요할 수 있습니다.

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모두 표시됩니다 .tun0eth0

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)

관련 정보