Holen Sie sich mein Land per IP in Bash

9

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?

Radu Rădeanu
quelle
@bhau Ich bevorzuge es, kein Paket dafür zu installieren.
Radu Rădeanu
@ MichaelKjörling Ich möchte das Land für meine spezielle öffentliche IP-Adresse erhalten. Klingt vielleicht seltsam, aber ich habe erklärt, warum.
Radu Rădeanu
@Radu Was ist falsch an der Installation eines Pakets?
Stommestack
1
@Jop Nur eine Vermutung, aber vielleicht hat das OP keinen Root-Zugriff auf das System? Die Installation eines Pakets, insbesondere wenn Bibliotheksabhängigkeiten auftreten, die möglicherweise auf Dateien mit vollständigem Pfad verweisen, kann Root-Zugriff erfordern.
Ein Lebenslauf vom

Antworten:

12

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.

Stéphane Chazelas
quelle
Dies ist ein hervorragendes Beispiel dafür, warum es eine gute Idee ist, ein wenig zu warten, bevor Sie eine Antwort annehmen. +1 von mir.
Ein Lebenslauf vom
@ MichaelKjörling ... Ich kann sehen, aber jetzt denke ich, dass es nicht richtig für dich ist, die akzeptierte Antwort zu ändern.
Radu Rădeanu
1
@Radu Es ist okay - wenn Sie der Meinung sind, dass diese Antwort nützlicher ist, verdient Stephane die Annahme (obwohl ich hoffe, dass ich eine / die positive Bewertung von Ihnen bekomme oder behalte :)). Im Allgemeinen ist es eine gute Idee, mindestens 12 bis 24 Stunden zu warten, bevor eine Antwort angenommen wird, um mehreren Personen die Möglichkeit zu geben, zu antworten. Das Akzeptieren einer Antwort besagt im Grunde, dass "die Frage zufriedenstellend beantwortet wurde", was den Anreiz für andere verringert, Antworten hinzuzufügen.
Ein
Stéphane funktioniert nicht mehr, curl --silent https://whatismycountry.com/ grep --only-matching --perl-regexp 'Your Country is \K[^<]+'tut es aber .
Fabby
13

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.dist die betreffende IP-Adresse?

whoiswird 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 countryFelds 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) }'
ein CVn
quelle
whois $(curl ifconfig.me) | grep -iE ^country: | awk '{print $2}'gibt mir was ich will; Vielen Dank!
Radu Rădeanu
1
@Radu Sie können sich whois $(curl ifconfig.me) | awk 'tolower($1) ~ /^country:/ { print $2 }'stattdessen eine Pipe sparen .
Ein Lebenslauf vom
10

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"
}
cuonglm
quelle
2
Elegant nur den Ländercode erhalten mitjq : curl -s ipinfo.io/ | jq ".country".
Pablo A
1

Zusätzlich zu der ipinfo.ioErwä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}
%
cnst
quelle