Bash 스크립트에서 시스템의 지리적 위치를 가져오는 방법

원격 리눅스 시스템의 지리적 위치를 파악하기 위해, 공개 API와 간단한 bash 스크립트를 활용할 수 있습니다. 서버의 지리적 위치를 확인함으로써, 실제 환경에서 서버를 추적하고 지역적인 중요 지점에 서버를 배치하는 데 도움을 받을 수 있습니다.

인터넷에 연결된 모든 서버는 고유한 공용 IP 주소를 가집니다. 이 IP 주소는 서버에 직접 할당되거나, 서버로 트래픽을 전달하는 라우터에 할당됩니다. IP 주소는 서버가 세계 어느 곳에 위치하는지에 대한 단서를 제공합니다. ipinfo.co와 IP Vigilante에서 제공하는 두 개의 공개 API를 통해 이러한 지리적 위치 정보를 얻을 수 있으며, 이를 이용해 서버 또는 다른 원격 시스템과 연결된 도시, 주, 국가 정보를 확인할 수 있습니다. 이는 정확한 GPS 좌표를 제공하는 것은 아니지만, IP 주소의 대략적인 영역을 파악하는 데 유용합니다.

원격 시스템 접속

지리적 위치를 확인하고자 하는 리눅스 서버나 기타 원격 시스템에 대해 다음 명령어를 실행해야 하므로, 우선 해당 서버에 연결하고 셸에 접근해야 합니다. SSH를 이용하여 연결하는 것이 대표적인 예입니다. 로컬 시스템에서도 위치를 확인할 수 있지만, 이미 본인의 위치를 알고 있을 것입니다!

curl 및 jq 설치

지리적 위치 API를 사용하려면 두 가지 도구가 필요합니다. HTTP 요청을 생성하는 curl과 JSON 형식으로 반환되는 데이터를 처리하는 jq입니다. 터미널을 열고 apt-get 명령어를 사용하여 Ubuntu 또는 Debian 기반 시스템에 이 도구들을 설치하세요. 다른 리눅스 배포판에서는 해당 배포판의 패키지 설치 도구를 사용하면 됩니다.

sudo apt-get install curl jq

서버의 공용 IP 주소 확인

지리적 위치 정보를 얻기 전에 서버의 공용 IP 주소를 먼저 알아야 합니다. 터미널 창에서 curl 명령어를 사용하여 ipinfo.io에 API 호출을 수행합니다.

curl https://ipinfo.io/ip

API로부터 위치 데이터 가져오기

이제 서버의 공용 IP 주소를 알았으니, ipvigilante.com API를 호출하여 지리적 위치 정보를 얻을 수 있습니다. <your ip address> 부분을 이전 명령어로 얻은 실제 IP 주소로 대체해야 합니다.

curl https://ipvigilante.com/<your ip address>

API 호출 결과로 반환되는 데이터를 좀 더 자세히 살펴보겠습니다.

API는 서버가 위치한 도시, 국가, 대륙 정보를 반환합니다. 또한 대략적인 위도 및 경도 좌표를 제공하여, 인터랙티브 지도에 서버 위치를 표시할 때 사용할 수 있습니다. 스크립트에서는 “latitude”, “longitude”, “city_name”, “country_name” 필드를 활용할 것입니다. jq 명령어는 API 데이터를 처리하고 이 네 가지 필드를 추출하는 역할을 합니다.

API 호출 자동화 스크립트 생성

지리적 위치 정보를 가져와 CSV 형식으로 파일에 저장하는 스크립트를 만들 수 있습니다. 이 데이터는 /tmp/ 디렉토리 내의 server_location.txt 파일에 기록됩니다. 선호하는 편집기를 사용하여 geolocate.sh 스크립트를 생성하고 아래 코드를 삽입하되, IP 주소는 본인의 것으로 변경해야 합니다.

#!/bin/sh

OUTPUT_FILE=/tmp/server_location.txt

# 서버의 공용 IP 주소 가져오기
PUBLIC_IP=`curl -s https://ipinfo.io/ip`

# 지리적 위치 API 호출 및 결과 캡처
curl -s https://ipvigilante.com/${PUBLIC_IP} |
        jq '.data.latitude, .data.longitude, .data.city_name, .data.country_name' |
        while read -r LATITUDE; do
                read -r LONGITUDE
                read -r CITY
                read -r COUNTRY
                echo "${LATITUDE},${LONGITUDE},${CITY},${COUNTRY}" |
                        tr --delete "> ${OUTPUT_FILE}
        done

스크립트를 저장한 후 터미널로 돌아갑니다. 해당 파일에 실행 권한을 부여하여 터미널에서 스크립트를 실행 가능하게 만드세요.

chmod u+x geolocate.sh

이제 테스트를 진행할 수 있습니다. geolocate.sh 스크립트를 실행하고 출력 파일의 내용을 확인합니다.

./geolocate.sh
cat /tmp/server_location.txt

Cron 작업을 통한 지리적 위치 데이터 일일 업데이트

서버가 지리적 위치 정보를 업데이트하고 매일 파일에 저장하도록 cron 작업을 생성해 봅시다. 매일 실행되는 cron 작업은 서버의 /tmp/ 폴더에 있는 server_location.txt 파일을 업데이트합니다. 24시간마다 cron 작업을 설정하는 가장 쉬운 방법은 스크립트를 /etc/cron.daily 디렉토리에 복사하는 것입니다. 권한 문제를 피하기 위해 sudo 명령어를 사용하여 루트 사용자 권한으로 파일을 복사해야 합니다. 다음 명령어를 실행하여 geolocate.sh를 /etc/cron.daily 디렉토리로 복사하십시오.

sudo cp geolocate.sh /etc/cron.daily

이 변경 사항은 즉시 적용되며, 스크립트는 24시간마다 실행되어 /tmp/server_location.txt 파일 내용을 업데이트합니다. 이 데이터를 활용하여 지도에 서버를 표시하고, 지리적 위치와 트래픽 로그를 결합하여 전 세계 어디에 서버 핫스팟이 있는지 확인하는 등 다양한 활용이 가능합니다.