如何从 Bash 脚本中获取系统的地理位置

通过使用开放的应用程序编程接口(API)和简单的bash脚本,可以确定远程Linux系统的地理位置。地理定位服务能帮助你追踪服务器在物理世界中的位置,确保服务器部署在合适的区域。

互联网上的每一台服务器都有一个公开的IP地址。这个地址要么直接分配给服务器,要么分配给将流量导向该服务器的路由器。IP地址为我们提供了关于服务器在地球上大致位置的线索。通过ipinfo.co和IP Vigilante提供的两个开放API,我们可以获取地理定位数据,从而了解与服务器或其他远程系统相关的城市、州和国家。请注意,这不会提供精确的GPS坐标,而是显示IP地址的大致区域。

连接至远程系统

你需要在Linux服务器或你想要进行地理定位的远程系统上运行以下命令,因此你必须先连接到服务器并访问其终端。例如,你可以通过SSH连接。虽然也可以在本地系统上运行命令来查找其位置,但你可能已经知道你在哪里了!

安装curl和jq

我们需要两个工具来访问地理定位API:curl用于发起HTTP请求,jq用于处理返回的JSON数据。打开终端并使用apt-get在基于Ubuntu或Debian的系统上安装这些工具。对于其他Linux发行版,请使用你发行版的包管理器进行安装。

sudo apt-get install curl jq

获取服务器的公网IP地址

在获取地理位置数据之前,我们需要服务器的公网IP地址。使用curl在终端窗口中向ipinfo.io发起API请求。

curl https://ipinfo.io/ip

从API获取地理位置数据

现在我们有了服务器的公网IP,我们可以使用ipvigilante.com的API获取地理位置数据。将 <你的IP地址> 替换为上一个命令返回的IP地址。

curl https://ipvigilante.com/<你的IP地址>

让我们仔细看看这个API调用返回的数据:

API返回服务器所在的城市、国家和大陆信息。它还返回近似的纬度和经度坐标,以防我们需要在地图上标记服务器的位置。我们将在脚本中使用“纬度”、“经度”、“城市名称”和“国家名称”这四个字段。 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命令以root用户身份复制文件,以避免权限问题。运行以下命令将geolocate.sh复制到/etc/cron.daily目录。

sudo cp geolocate.sh /etc/cron.daily

这些更改会立即生效,脚本将每24小时运行一次,以更新/tmp/server_location.txt文件的内容。我们可以使用这些数据做一些有趣的事情,例如在地图上绘制服务器的位置,并将地理位置与流量日志结合起来,以了解服务器在世界上的热点位置。