我想在 bash 脚本中使用我现在所在的国家/地区的名称。我可以使用下一个命令获取外部IP:
curl ifconfig.me
但我怎样才能得到我的国家名称呢?
答案1
ipinfo.io有很好的 JSON API 可以从命令行使用:
$ curl ipinfo.io
{
"ip": "X.X.X.X",
"hostname": "No Hostname",
"city": "Hanoi",
"region": "Ha Noi",
"country": "VN",
"loc": "21.0333,105.8500",
"org": "AS18403 The Corporation for Financing & Promoting Technology"
}
答案2
您可以通过查询公共 whois 数据库来获得一些接近的信息。 “产品化”来处理每种可能的情况可能会有些困难,但合理的近似可能是:
$ whois a.b.c.d | grep -iE ^country:
a.b.c.d
有问题的 IP 地址在哪里。
whois
通常是默认安装的,因此这符合您对“我不想安装任何软件包来执行此操作”的合理解释,读作“我不想安装额外的软件”。
打印仅有的字段的值country
并强制其仅大写(例如,为了使比较更容易),您可以执行以下操作:
$ whois a.b.c.d | awk -F':[ \t]+' 'tolower($1) ~ /^country$/ { print toupper($2) }'
答案3
使用 ifconfig.me 之外的另一个 IP 定位器来提供该信息,例如:
自 2015-03-09 起不再可用
curl -s 'http://geoiplookup.net/geoapi.php?output=countrycode'
或者:
curl -s 'http://geoiplookup.net/geoapi.php?output=country'
(看应用程序接口详情)
或者:
curl -s http://whatismycountry.com/ |
sed -n 's|.*,\(.*\)</h3>|\1|p'
或者:
curl -s http://whatismycountry.com/ |
sed -n 's|.*> *\(.*\)</h3>|\1|p'
为了更精确,或者:
curl -s http://whatismycountry.com/ |
sed -n 's/.*Coordinates \(.*\)<.*/\1/p'
为坐标。
这对页面的 HTML 格式做出了假设。因此,如果他们决定将来更改该格式,它可能会停止工作。
答案4
除了ipinfo.io
在其他答案中提到之外,您还可以使用freegeoip.net
,这似乎正式使用公开可用的代码/数据库(如果需要,您可以在自己的实例上运行),并且似乎有更高的限制请求数量 - 15k/小时,而 ipinfo.io 上的请求数量为 1000/天。
% curl -i ipinfo.io
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 17 Sep 2017 02:17:47 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 240
Vary: Accept-Encoding
x-cloud-trace-context: 86d62d74c999fc62715d7dff810ea16c/9504640995707975809;o=0
Access-Control-Allow-Origin: *
X-Content-Type-Options: nosniff
Via: 1.1 google
{
"ip": "88.198.54.xx",
"hostname": "static.88-198-54-xx.clients.your-server.de",
"city": "Nuremberg",
"region": "Bavaria",
"country": "DE",
"loc": "49.4478,11.0683",
"org": "AS24940 Hetzner Online GmbH",
"postal": "90455"
}%
% curl -i freegeoip.net/json/
HTTP/1.1 200 OK
Date: Sun, 17 Sep 2017 02:17:54 GMT
Content-Type: application/json
Content-Length: 230
Connection: keep-alive
Set-Cookie: __cfduid=dacbae017e5ee70d57b251c89c4ba418b1505614674; expires=Mon, 17-Sep-18 02:17:54 GMT; path=/; domain=.freegeoip.net; HttpOnly
Vary: Origin
X-Database-Date: Thu, 07 Sep 2017 04:08:50 GMT
X-Ratelimit-Limit: 15000
X-Ratelimit-Remaining: 14996
X-Ratelimit-Reset: 2697
Server: cloudflare-nginx
CF-RAY: 39f89263d43c6367-FRA
{"ip":"88.198.54.xx","country_code":"DE","country_name":"Germany","region_code":"BY","region_name":"Bavaria","city":"Nuremberg","zip_code":"90455","time_zone":"Europe/Berlin","latitude":49.4478,"longitude":11.0683,"metro_code":0}
%