Ich möchte den Namen des Landes, in dem ich mich gerade befinde, in einem Bash-Skript verwenden. Ich kann die externe IP mit dem nächsten Befehl erhalten:
curl ifconfig.me
Aber wie kann ich meinen Ländernamen bekommen?
Ich möchte den Namen des Landes, in dem ich mich gerade befinde, in einem Bash-Skript verwenden. Ich kann die externe IP mit dem nächsten Befehl erhalten:
curl ifconfig.me
Aber wie kann ich meinen Ländernamen bekommen?
Antworten:
Verwenden Sie einen anderen IP-Locator als ifconfig.me, der folgende Informationen enthält:
Ab dem 09.03.2015 nicht mehr verfügbar
curl -s 'http://geoiplookup.net/geoapi.php?output=countrycode'
oder:
curl -s 'http://geoiplookup.net/geoapi.php?output=country'
( Einzelheiten finden Sie in der API. )
oder:
curl -s http://whatismycountry.com/ |
sed -n 's|.*,\(.*\)</h3>|\1|p'
oder:
curl -s http://whatismycountry.com/ |
sed -n 's|.*> *\(.*\)</h3>|\1|p'
für mehr Präzision oder:
curl -s http://whatismycountry.com/ |
sed -n 's/.*Coordinates \(.*\)<.*/\1/p'
für die Koordinaten.
Das macht Annahmen über die HTML-Formatierung der Seite. Daher funktioniert es möglicherweise nicht mehr, wenn sie dieses Format in Zukunft ändern.
curl --silent https://whatismycountry.com/ grep --only-matching --perl-regexp 'Your Country is \K[^<]+'
tut es aber .
Sie können etwas näher kommen, indem Sie die öffentliche whois-Datenbank abfragen. Es wird wahrscheinlich etwas schwierig sein, "zu produzieren", um jeden möglichen Fall zu behandeln, aber eine vernünftige Annäherung könnte sein:
$ whois a.b.c.d | grep -iE ^country:
Wo a.b.c.d
ist die betreffende IP-Adresse?
whois
wird häufig standardmäßig installiert, sodass dies einer vernünftigen Interpretation Ihres "Ich bevorzuge es, kein Paket zu installieren, um dies zu tun" entspricht: "Ich möchte keine zusätzliche Software installieren ".
Um nur den Wert des country
Felds auszudrucken und nur in Großbuchstaben zu setzen (um beispielsweise Vergleiche zu vereinfachen), können Sie Folgendes tun:
$ whois a.b.c.d | awk -F':[ \t]+' 'tolower($1) ~ /^country$/ { print toupper($2) }'
whois $(curl ifconfig.me) | grep -iE ^country: | awk '{print $2}'
gibt mir was ich will; Vielen Dank!
whois $(curl ifconfig.me) | awk 'tolower($1) ~ /^country:/ { print $2 }'
stattdessen eine Pipe sparen .
ipinfo.io hat eine nette JSON-API für die Verwendung über die Befehlszeile:
$ 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"
}
Zusätzlich zu der ipinfo.io
Erwähnung in der anderen Antwort könnten Sie auch verwenden freegeoip.net
, die anscheinend offiziell den öffentlich verfügbaren Code / die öffentlich verfügbare Datenbank verwendet (die Sie bei Bedarf auf Ihrer eigenen Instanz ausführen können) und für die anscheinend ein höheres Limit gilt die Anzahl der Anfragen - 15.000 / Stunde gegenüber 1.000 / Tag auf ipinfo.io.
% 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}
%