Nhận đất nước của tôi bằng IP trong bash


9

Tôi muốn sử dụng tên của quốc gia nơi tôi đang ở trong một tập lệnh bash. Tôi có thể lấy IP bên ngoài bằng lệnh tiếp theo:

curl ifconfig.me

Nhưng làm thế nào tôi có thể có được tên quốc gia của tôi?



@bhau Tôi không thích cài đặt bất kỳ gói nào để làm điều này.
Radu Rădeanu

@ MichaelKjorling Tôi muốn lấy quốc gia cho địa chỉ IP công cộng cụ thể của mình. Có thể nghe có vẻ lạ, nhưng tôi đã thoát ra tại sao.
Radu Rădeanu

@Radu Có gì sai khi cài đặt một gói?
stommestack

1
@Jop Chỉ là một phỏng đoán, nhưng có lẽ OP không có quyền truy cập root vào hệ thống? Cài đặt một gói, đặc biệt nếu nó mang lại các phụ thuộc thư viện có thể tham chiếu đến các tệp theo đường dẫn đầy đủ, có thể yêu cầu quyền truy cập root.
một CVn

Câu trả lời:


12

Sử dụng công cụ định vị IP khác ngoài ifconfig.me cung cấp thông tin đó như:

Không có sẵn nữa kể từ 2015 / 03-09

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

hoặc là:

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

(xem API để biết chi tiết)

hoặc là:

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

hoặc là:

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

để chính xác hơn, hoặc:

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

cho tọa độ.

Điều đó làm cho các giả định về định dạng HTML của trang. Vì vậy, nó có thể ngừng hoạt động nếu họ quyết định thay đổi định dạng đó trong tương lai.


Đây là một minh họa tuyệt vời về lý do tại sao nên chờ một chút trước khi chấp nhận câu trả lời. +1 từ tôi.
một CVn

@ MichaelKjorling ... Tôi có thể thấy, nhưng bây giờ tôi nghĩ rằng điều đó không phù hợp với bạn để thay đổi câu trả lời được chấp nhận.
Radu Rădeanu

1
@Radu Không sao - nếu bạn cảm thấy câu trả lời này hữu ích hơn, Stephane xứng đáng được chấp nhận (mặc dù tôi hy vọng tôi sẽ nhận được hoặc giữ một / upvote từ bạn :)). Nói chung, thông thường nên đợi ít nhất 12-24 giờ trước khi chấp nhận câu trả lời, để cho nhiều người có cơ hội trả lời. Chấp nhận một câu trả lời về cơ bản nói rằng "câu hỏi đã được trả lời thỏa đáng", làm giảm sự khuyến khích cho người khác thêm câu trả lời.
một CVn

Stéphane, không hoạt động nữa, nhưng curl --silent https://whatismycountry.com/ grep --only-matching --perl-regexp 'Your Country is \K[^<]+'không.
Fabby

13

Bạn có thể đến gần bằng cách truy vấn cơ sở dữ liệu whois công khai. Có thể sẽ hơi khó "sản xuất" để xử lý mọi trường hợp có thể, nhưng một xấp xỉ hợp lý có thể là:

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

nơi a.b.c.dlà địa chỉ IP trong câu hỏi.

whoisthường được cài đặt theo mặc định, do đó, điều này đáp ứng một cách giải thích hợp lý về "Tôi không muốn cài đặt bất kỳ gói nào để thực hiện việc này" đọc là "Tôi không muốn cài đặt phần mềm bổ sung ".

Để chỉ in giá trị của countrytrường và buộc nó chỉ viết hoa (để làm cho việc so sánh dễ dàng hơn chẳng hạn), bạn có thể làm một cái gì đó như:

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

whois $(curl ifconfig.me) | grep -iE ^country: | awk '{print $2}'cho tôi những gì tôi muốn; cảm ơn!
Radu Rădeanu

1
@Radu Bạn có thể tiết kiệm cho mình một đường ống bằng cách whois $(curl ifconfig.me) | awk 'tolower($1) ~ /^country:/ { print $2 }'thay thế.
một CVn

10

ipinfo.io có API JSON đẹp để sử dụng từ dòng lệnh:

$ 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
Thanh lịch chỉ nhận được mã quốc gia bằng cách sử dụngjq : curl -s ipinfo.io/ | jq ".country".
Pablo A

1

Ngoài việc ipinfo.iođề cập đến trong câu trả lời khác, bạn cũng có thể sử dụng freegeoip.net, dường như chính thức sử dụng mã / cơ sở dữ liệu có sẵn công khai (mà bạn có thể chạy trên cá thể của mình, nếu cần) và dường như có giới hạn cao hơn cho số lượng yêu cầu - 15k / giờ, so với 1k / ngày trên 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}
%
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.