SharedIT | 묻고 답하기(AMP)

shell script 문의 드립니다.

클라우드 이용, 웹서비스중입니다.

그런데 자꾸 Ip가 변경이 되어서.. ㅠㅠ


ip 변경시 확인 후 dns zone 화일 수정 script 만들고자 합니다.


한 서비스에 관련 ip는 2개입니다.


ip1 = $(nslookup 도메인 | sed -n '/^Address:/p' | sed -n '2,$p' | awk '{ print $2 }' | sed -n '1p')

ip2 = $(nslookup 도메인 | sed -n '/^Address:/p' | sed -n '2,$p' | awk '{ print $2 }' | sed -n '2p')

명령어를 commond에서 개별 실행하면 ip1, ip2가 각각 다르게 표시됩니다만

shell script로 실행하면 ip1,ip2 가 동일 ip를 가져옵니다.

awk 까지 실행하면 2라인(2ip) 표시되는데 sed에서 1p든 2p든 동일 값입니다 ㅠㅠ

nslookup 결과치를 화일로 저장한 후 화일을 불러와서 실행하면 ip1, ip2가 개별 할당됩니다.


아마 2개 ip로 서비스중이라서 실행될때마다 ip 결과값의 위치가 변경되어 그런 것인지?


화일로 저장, 불러 오지 않고 처리할 수 있는 방법이 없을까요?


답변에 미리 감사드립니다.

Tags : 태그가 없습니다.

3개의 답변이 있습니다.

wansoo
  0 추천 | 3년 이하 전

아주 짧은 시간 DNS 쿼리를 반복해서 결과를 가져 왔다해도...

의문점이 드는게...

제일 끝에 있는 sed 명령에서

앞에 명령은 sed -n '1p'   로 결과 중에 첫번째 줄을 지정했고,

뒤에 명령은 sed -n '2p'   로 결과 중에 두번째 줄을 지정했는데...

두 명령의 결과가 동일한게 조금 이상하게 느껴지네요.


가능성을 추측해 보면...

스크립트에서 두 명령 모두 제일 끝에 있는 sed 명령에서 sed -n '1p' 와 같이 동일한 라인의 값을 가져 오게 잘못 작성한게 아닌가 하는 느낌이 들고요.


제대로 작성했는데도 그렇다면...

가능성은 우연찮게~ 앞에 쿼리 앞에 나온 결과가 다음번 쿼리에서 뒤에 나온게 아닌가 하는 생각도 들고요.


스크립트에다

nslookup 도메인 | sed -n '/^Address:/p' | sed -n '2,$p' | awk '{ print $2 }'

echo ==============

nslookup 도메인 | sed -n '/^Address:/p' | sed -n '2,$p' | awk '{ print $2 }'


와 같이 넣어 작성한 후에

스크립트를 반복 수행해 보세요.

어떤 결과가 나오는지...



혹시 위 명령 각각에 대한 내용을 잘 모를 수 있을 것 같아 하나 하나 설명드려 볼께요./


nslookup  도메인    명령은    도메인에 대한 DNS 쿼리를 하는 명령이 되겠고요.

그 결과는...


예를 들어 www.sharedit.co.kr 에 대해서 실행해 보면...


# nslookup www.sharedit.co.kr

Server: 168.126.63.1

Address: 168.126.63.1#53


Non-authoritative answer:

Name: www.sharedit.co.kr

Address: 104.26.13.155

Name: www.sharedit.co.kr

Address: 172.67.73.69

Name: www.sharedit.co.kr

Address: 104.26.12.155


와 같이 나오게 되겠고요.



다음에 파이프를 거쳐서 실행되는 명령인 

sed -n '/^Address:/p'  는


결과 중에 Address:가 들어간 라인만 추출하는 용도가 되겠고요.


불필요한 라인을 걸러내는 용도로

grep Address 와 같이 명령을 줘도 동일한 결과를 얻을 수 있겠고요.


# nslookup www.sharedit.co.kr |sed -n '/^Address:/p'

Address: 168.126.63.1#53

Address: 172.67.73.69

Address: 104.26.13.155

Address: 104.26.12.155



그 다음에 파이프를 거쳐서 실행되는 

sed -n '2,$p'  는

앞의 결과 중에서 첫번째 라인 ( DNS 서버 주소 )은 제거하고 

2번째 라인부터 나머지를 추출하는 용도가 되겠고요.


# nslookup www.sharedit.co.kr |grep Address | sed -n '2,$p'

Address: 172.67.73.69

Address: 104.26.12.155

Address: 104.26.13.155



그리고 다음에 파이프를 통해 나오는 결과를 수행하는 명령인

awk '{ print $2 }'   는   결과들 중에서 2번째 컬럼만 추출하기 위한 용도가 되겠고요.


여기서 사용된 sed 명령과 awk 명령은 인터프리터 언어에 해당하는 명령이기 때문에...

하나의 프로그램 언어를 공부한다는 생각으로 접근할 필요가 있는 명령이라 할 수 있고요.


awk 명령을 통해서 전달되는 내용 중에 2번째 파라미터를 print 명령을 사용해서 출력하는 형태로 작동되는 것이고요.


sed나 awk 같은 언어 대신에 perl이나 python 등의 언어를 이용할 수도 있겠지만...

가볍게 사용하기에는 특정 목적에 맞게 개발된 sed나 awk가 더 효율적일수 있기 때문에 sed와 awk 스크립트에서 많이 활용되고 있고요.


# nslookup www.sharedit.co.kr |grep Address | sed -n '2,$p' | awk '{ print $2 }'

172.67.73.69

104.26.13.155

104.26.12.155


최종적으로 추출해 내는 sed -n '1p'와  sed -n '2p'는 첫번째 줄과 두번째 줄을 각각 추출하게 되는 것인데...


동일 결과가 나온다면 스크립트에 제대로 타이핑한게 확실히 맞는지를 다시 한번 확인해 보셔야 하겠고요.


제대로 타이핑한게 확실하다면 다음으로는 1p, 2p를 추출하는 마지막 명령만 제외 시킨 상태에서 스크립트를 반복 수행해 보면서 어떤 결과가 나오는지를 검토해 봐야 할 것 같네요.


차니 | 3년 이하 전

sh 연달아 실행시 위아래 즉 shared it ip예를 들면

172.67.73.69

104.26.13.155   


나오다가 어느 순간


104.26.13.155 

172.67.73.69


나옵니다..  


조건문 돌려서 갱신이 제대로 되게 했습니다^^


aws 사용중인데 query 때마다 위아래가 바뀌네요 ㅠㅠ

wansoo
  0 추천 | 3년 이하 전

DNS 쿼리 2회 수행하는 명령을 수기 입력해서 직접 실행시킬때와 스크립트로 실행시킬때의 결과가 다르다는 내용인것 같은데요..

아마도 DNS 쿼리 명령을 실행시키는 시간 간격 때문이 아닐까 싶네요.

스크립트로 아주 짧은 시간에 반복 실행시킬때는 DNS 서버에다 쿼리해서 결과를 가져 오지 않고 캐시에 저장되어 있는 앞에 실행한 쿼리 결과를 가져오기 때문일걸로 추측되네요.


스크립트로 작성할때 아래 두 명령 사이에

ip1 = $(nslookup 도메인 | sed -n '/^Address:/p' | sed -n '2,$p' | awk '{ print $2 }' | sed -n '1p')

ip2 = $(nslookup 도메인 | sed -n '/^Address:/p' | sed -n '2,$p' | awk '{ print $2 }' | sed -n '2p')

sleep 3  과 같이 DNS 쿼리하는 시간 간격을 줘 보면 어떤 결과가 나올지 Test 해 보길 바랍니다.

예를 들어...


ip1 = $(nslookup 도메인 | sed -n '/^Address:/p' | sed -n '2,$p' | awk '{ print $2 }' | sed -n '1p')

sleep 3

ip2 = $(nslookup 도메인 | sed -n '/^Address:/p' | sed -n '2,$p' | awk '{ print $2 }' | sed -n '2p')


과 같이...


파일에 저장하면 다르게 나온다는 것도 아마 파일에 저장할때 소요되는 시간 때문에 쿼리 간의 시간 차가 생기기 때문이 아닐까 하는 추정도 되고요...

아니면 두번째 DNS 쿼리하는 ip2 환경 변수에 저장되는 값이 ip1과 같을 경우에는 1초 정도 대기했다가 다시 DNS 쿼리하는 형식으로 ip2가 ip2과 달라질때까지 반복적으로 DNS 쿼리하도록 스크립트를 만들어도 될거라 생각되고요.


파일의 어떤 문자를 어떻게 변경하려는지는 잘 모르겠지만...

파일의 특정 문자를 변경하는 건... find 명령으로 할 수 있는건 아닌것 같고요.

sed 명령이 파일의 특정 문자를 찾아서 변경할때 사용하기에 적합한 명령이라 생각되네요.



차니 | 3년 이하 전

감사합니다. sed로 해결했습니다. 이것도 문법이 제각가이네요. 


싱글, 더블 따옴표가 다 다르네요 ㅠㅠ


sleep을 줘도 안되네요. 


아마도 query때마다 1,2번째 가져오는 결과값이 다른가 봅니다.

어떤때는 ip1이 2번 나오고 어떤대는 ip2가 2번 나옵니다 ㅠㅠ


결국 화일로 해야 겠습니다.

wansoo | 3년 이하 전

결과가 앞뒤로 바뀌어 나올 경우라면...

if 문과 반복 루프문을 사용해서 값이 다르게 나올때 까지 반복하는 방법도 있겠고요.


nslookup 쿼리 결과를 file에 담지 않고 변수에 담아서 사용하는 방법을 사용해도 되겠고요.


예를 들어...


ip_list=$( nslookup www.sharedit.co.kr |grep Address | sed -n '2,$p' | awk '{ print $2 }' )

echo $ip_list | awk '{ print $1 } '

echo $ip_list | awk '{ print $2 } '


와 같이 스크립트를 만들어 사용해도 되겠네요~


wansoo | 3년 이하 전

스크립트를 


ip_list=$( nslookup www.sharedit.co.kr |grep Address | sed -n '2,$p' | awk '{ print $2 }' )

ip1=$( echo $ip_list | awk '{ print $1 } ' )

ip2=$( echo $ip_list | awk '{ print $2 } ' )


와 같이 만드는게...

질문에서 제시한 결과와 동일하게 되겠네요~ ㅎㅎㅎ


차니
  0 추천 | 3년 이하 전

추가 문의 드립니다.

find를 이용 화일의 특정 문자열을 치환하려고 합니다.

 예제를 입력하려고 하니 게시판에서 저장이 안됩니다 ㅠㅠ

변수 표현식 부탁드립니다.