Obter meu país por IP no bash

7

Eu quero usar o nome do país onde estou agora em um script bash. Eu posso pegar o IP externo usando o próximo comando:

curl ifconfig.me

Mas como posso obter o nome do meu país?

    
por Radu Rădeanu 18.07.2013 / 12:22

4 respostas

11

Use outro localizador de IP do que ifconfig.me que forneça informações como:

Not available anymore as of 2015-03-09

curl -s 'http://geoiplookup.net/geoapi.php?output=countrycode'

or:

curl -s 'http://geoiplookup.net/geoapi.php?output=country'

(see the API for details)

ou:

curl -s http://whatismycountry.com/ |
  sed -n 's|.*,\(.*\)</h3>||p'

ou:

curl -s http://whatismycountry.com/ |
  sed -n 's|.*> *\(.*\)</h3>||p'

para mais precisão, ou:

curl -s http://whatismycountry.com/ |
  sed -n 's/.*Coordinates \(.*\)<.*//p'

para as coordenadas.

Isso faz suposições sobre a formatação HTML da página. Por isso, pode deixar de funcionar se decidir alterar esse formato no futuro.

    
por 18.07.2013 / 15:43
11

Você pode chegar perto, consultando o banco de dados whois público. Provavelmente será um pouco difícil "produzir" para lidar com todos os casos possíveis, mas uma aproximação razoável pode ser:

$ whois a.b.c.d | grep -iE ^country:

em que a.b.c.d é o endereço IP em questão.

whois é geralmente instalado por padrão, portanto, isso atende a uma interpretação razoável do seu "Eu prefiro não instalar nenhum pacote para fazer isso", como "Não quero instalar adicional software ".

Para imprimir somente o valor do campo country e forçá-lo apenas para letras maiúsculas (para tornar as comparações mais fáceis, por exemplo), você pode fazer algo como:

$ whois a.b.c.d | awk -F':[ \t]+' 'tolower($1) ~ /^country$/ { print toupper($2) }'
    
por 18.07.2013 / 12:57
7

ipinfo.io tem uma boa API JSON para usar a partir da linha de comando:

$ 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"
}
    
por 09.03.2015 / 17:26
1

Além de ipinfo.io mencionar na outra resposta, você também pode usar freegeoip.net , que parece estar oficialmente usando o código / banco de dados disponível publicamente (que você pode executar em sua própria instância, se necessário) e parece ter um limite maior para o número de solicitações - 15k / hora, contra 1k / dia no 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}
%
    
por 17.09.2017 / 04:20