리눅스 IP를 변수로

2014. 2. 4. 23:27 | 리눅스
리눅스 쉘 스크립트에서 IP를 변수로 받아와야 하는 경우

일반적으로 hostname 커맨드를 활용하면 짧고 편리하다.

[root@CentOS ~]# hostname -I
192.168.0.28 192.168.0.40
[root@CentOS ~]#
[root@CentOS ~]# ips=`hostname -I`
[root@CentOS ~]#
[root@CentOS ~]# echo $ips
192.168.0.28 192.168.0.40

※ 이 글에서는 테스트를 위해 일부러 NIC를 2개 생성했기 때문에 위와 같이 IP가 2개 나왔고, 일반적인 경우 1개만 나올 것이다.

그런데 hostname 커맨드로는 loopback device의 IP를 확인할 수 없다. 127.0.0.1이야 그렇다 치더라도 L4를 DSR 구조로 사용하는 경우 lo:0 등의 IP도 확인이 필요할 것이다.

따라서 ifconfig 또는 ip 커맨드로 가공을 한번 해보자.

[root@CentOS ~]# ifconfig | grep -w inet | awk '{ print $2 }' | cut -c '6-'
192.168.0.28
192.168.0.40
127.0.0.1
192.168.0.100

위 예제는 ifconfig와 grep, awk, cut 등을 활용한 것이다.

아래 예제는 ip 커맨드에 cut 대신 정규표현식을 조합했다. 좀 더 정교한 느낌이 든다.

[root@CentOS ~]# ip addr | grep -w inet | awk '{ print $2 }' | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
127.0.0.1
192.168.0.100
192.168.0.28
192.168.0.40

사실 이 글을 작성하게 된 계기는 L4를 DSR 구조로 사용할 때 loopback IP를 가지고 뭔가를 하려 했기 때문이다. 최종적으로 나는 아래와 같은 구조로 사용하고 있다.

vips=`ip addr show lo | grep -w inet | grep -v 'inet 127' | awk '{ print $2 }' | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'`
for vip in $vips
do
    echo $vip
done

echo $vip 부분은 예제로 적어본 것이고, 저 자리에 내가 vip를 가지고 하고싶은 작업을 진행하고 있다.