Перейти к содержимому

Api ipify org что это

  • автор:

ipify API

Ever needed to get your public IP address programmatically?
Maybe you’re provisioning new cloud servers and need to know your IP — maybe you’re behind a corporate firewall and need to tunnel information — whatever the reason: sometimes having a public IP address API is useful!

You should use ipify because:

You can use it without limit (even if you’re doing millions of requests per minute.

It works flawlessly with both IPv4 and IPv6 addresses, so no matter what sort of technology you’re using, there won’t be issues.

It’s always online and available, and its infrastructure is powered by Heroku, which means that regardless of whether the server running the API dies, or if there’s an enormous tornado which destroys half of the east coast, ipify will still be running!

ipify is completely open source (check out the GitHub repository ).

No visitor information is ever logged. Period.

Lastly, ipify is open source so there’s no need to worry about the domain name disappearing in three years or anything like that: ipify is here to stay!

API Usage

Using ipify is ridiculously simple. You have three options. You can get your public IP directly (in plain text), you can get your public IP in JSON format, or you can get your public IP information in JSONP format (useful for Javascript developers).

IPv4

API URL Response Type Sample Output (IPv4)
https://api.ipify.org text 98.207.254.136
https://api.ipify.org?format=json json
https://api.ipify.org?format=jsonp jsonp callback();
https://api.ipify.org?format=jsonp&callback=getip jsonp getip();

Universal: IPv4/IPv6

API URL Response Type Sample Output (IPv4/IPv6)
https://api64.ipify.org text 98.207.254.136 or 2a00:1450:400f:80d::200e
https://api64.ipify.org?format=json json or
https://api64.ipify.org?format=jsonp jsonp callback(); or callback();
https://api64.ipify.org?format=jsonp&callback=getip jsonp getip(); or getip();

Code samples

This section contains some common usage patterns from a variety of programming languages. Want something included that isn’t listed here? Email us!

Bash

#!/bin/bash ip=$(curl -s https://api.ipify.org) echo "My public IP address is: $ip"

NGS (Next Generation Shell)

ip=`curl -s https://api.ipify.org` echo("My public IP address is: $ip")

Python

# This example requires the requests library be installed. You can learn more # about the Requests library here: http://docs.python-requests.org/en/latest/ from requests import get ip = get('https://api.ipify.org').text print('My public IP address is: <>'.format(ip))

Ruby

require "net/http" ip = Net::HTTP.get(URI("https://api.ipify.org")) puts "My public IP Address is: " + ip

PHP

Java

try (java.util.Scanner s = new java.util.Scanner(new java.net.URL("https://api.ipify.org").openStream(), "UTF-8").useDelimiter("\\A")) < System.out.println("My current IP address is " + s.next()); >catch (java.io.IOException e)

Perl

use strict; use warnings; use LWP::UserAgent; my $ua = new LWP::UserAgent(); my $ip = $ua->get('https://api.ipify.org')->content; print 'My public IP address is: '. $ip;

C#

var httpClient = new HttpClient(); var ip = await httpClient.GetStringAsync("https://api.ipify.org"); Console.WriteLine($"My public IP address is: ");

VB.NET

Dim httpClient As New System.Net.Http.HttpClient Dim ip As String = Await httpClient.GetStringAsync("https://api.ipify.org") Console.WriteLine($"My public IP address is: ")

NodeJS

var http = require('http'); http.get(, function(resp) < resp.on('data', function(ip) < console.log("My public IP address is: " + ip); >); >);

Go

package main import ( "io/ioutil" "net/http" "os" ) func main() < res, _ := http.Get("https://api.ipify.org") ip, _ := ioutil.ReadAll(res.Body) os.Stdout.Write(ip) >

Racket

(require net/url) (define ip (port->string (get-pure-port (string->url "https://api.ipify.org")))) (printf "My public IP address is: ~a" ip)

Lisp

;This example requires the drakma http package installed. ;It can be found here: http://www.weitz.de/drakma (let ((stream (drakma:http-request "https://api.ipify.org" :want-stream t))) (let ((public-ip (read-line stream))) (format t "My public IP address is: ~A" public-ip)))

Xojo

Dim s As New HTTPSecureSocket Dim t As String = s.Get("https://api.ipify.org",10) MsgBox "My public IP Address is: " + t

Scala

val addr = scala.io.Source.fromURL("https://api.ipify.org").mkString println(s"My public IP address is: $addr")

Javascript

 

jQuery

  

C#

using System; using System.Net; namespace Ipify.Examples < class Program < public static void Main (string[] args) < WebClient webClient = new WebClient(); string publicIp = webClient.DownloadString("https://api.ipify.org"); Console.WriteLine("My public IP Address is: ", publicIp); > > >

Elixir

:inets.start > = :httpc.request('http://api.ipify.org') :inets.stop

nim

import HttpClient var ip = newHttpClient().getContent("https://api.ipify.org") echo("My public IP address is: ", ip)

PowerShell

$ip = Invoke-RestMethod -Uri 'https://api.ipify.org?format=json' "My public IP address is: $($ip.ip)"

Lua

socket_http = require "http.compat.socket" body = assert(socket_http.request("https://api.ipify.org")) print(body)

PureBasic

InitNetwork() *Buffer = ReceiveHTTPMemory("https://api.ipify.org?format=json") If *Buffer ParseJSON(0, PeekS(*Buffer, MemorySize(*Buffer), #PB_UTF8)) FreeMemory(*Buffer) Debug GetJSONString(GetJSONMember(JSONValue(0), "ip")) EndIf

LiveCode

put "My public IP address is" && url "https://api.ipify.org"

Objective-C

NSURL *url = [NSURL URLWithString:@"https://api.ipify.org/"]; NSString *ipAddress = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; NSLog(@"My public IP address is: %@", ipAddress);

Swift

import Foundation let url = URL(string: "https://api.ipify.org") do < if let url = url < let ipAddress = try String(contentsOf: url) print("My public IP address is: " + ipAddress) >> catch let error

Arduino

if (client.connect("api.ipify.org", 80)) < Serial.println("connected"); client.println("GET / HTTP/1.0"); client.println("Host: api.ipify.org"); client.println(); >else

AutoIT

$b = TimerInit() $Read = InetRead("https://api.ipify.org",1) $sData = BinaryToString($Read) MsgBox(64,"Information","Your IP Address: " & $sData & @CRLF & "Elapsed Time: " & StringLeft(TimerDiff($b) / 1000,4) & " seconds.")

SAS language

filename ipresp "%sysfunc(pathname(work))\ipify-response.html"; proc http url="https://api.ipify.org" method=GET out=ipresp ; run; data null; length ip $ 20; infile ipresp recfm=f lrecl=32000 encoding='utf-8' truncover; input ip :$20.; **Create a macro variable "IP" with the ip address: ; call symput('IP',cats(ip)); **Print the ip address to the log: ; put 'NOT' 'E: >>>>>>>>>>>> Official IP: ' ip ' 

Libraries

If you want to use ipify in your favorite programming language, but want to keep your code nice and tidy, feel free to use one of our libraries below! They'll make your life a little bit easier and more enjoyable =)

NOTE: Don't see a library for your favorite programming language? If you create one, I'll be happy to link to it below! Just shoot us an email with the details and I'll gladly link to it!

Library URL Language Author Official?
https://github.com/rdegges/go-ipify Go Randall Degges yes
https://github.com/rdegges/python-ipify Python Randall Degges yes
https://github.com/xtonousou/ipify.sh Bash Sotirios M. Roussis no
https://github.com/troglobit/lipify C Joachim Nilsson no
https://github.com/sideshowcoder/ipify-c C Philipp Fehre no
https://github.com/sindresorhus/ipify Node.js Sindre Sorhus no
https://github.com/davidepedrazzi/ipify2 Node.js Davide Pedrazzi no
https://bitbucket.org/stevenjeffries/java-ipify Java Steven Jeffries no
https://github.com/vincent-peng/swift-ipify Swift Vincent Peng no
https://github.com/gabulyaz/elixir-ipify Elixir Zoltán Gabulya no
https://github.com/benjamin-smith/php-ipify PHP Benjamin Smith no
https://github.com/gregce/ipify R Greg Ceccarelli no
https://github.com/aprendexojo/ipify Xojo Javier Rodriguez no
https://github.com/Chuongv/CHVIpify Objective-C Chuong Vu no
https://github.com/davidmus/Ipify.NET .NET David Musgrove no
https://github.com/mauricioabreu/crystal-ipify Crystal Mauricio de Abreu Antunes no
https://github.com/keltia/ipify-rs Rust Ollivier Robert no
https://github.com/surrenderoz/ipify-public-ip Rust Surendra Verma no
https://github.com/coldnew/ipify.clj Clojurescript Yen-Chin Lee no
https://github.com/Bujupah/dart_ipify Dart Khalil Mejdi no
https://github.com/chintan369/Ipify-Android Kotlin Chintak Patel no

IP-адрес с помощью Google Tag Manager

Контекстная, таргетированная реклама и веб-аналитика

В предыдущей статье мы с вами разобрали один из вариантов определения IP-адреса посетителя сайта на стороне сервера (с помощью PHP) и передачи этой информации в Google Analytics. В этом материале разберем пример сбора IP-адресов в переменную GTM, используя скрипт, который вы можете скопировать и вставить себе в проект.

Последовательность действий:

Используем универсальный метод - JavaScript, который будет работать практически в любой ситуации. Создаем "Пользовательский HTML – тег" и вставляем туда данный код:

function getIP ( json ) < dataLayer . push (< "event" : "ipEvent" , "ipAddress" : json . ip >);
В результате получим:

Передача IP-адреса в GTM

Пользовательский HTML-тег

Данный фрагмент JS-кода определяет IP-адрес каждого пользователя через ipify.org (является бесплатным API-интерфейсом IP-адресов), а затем помещает его в уровень данных (dataLayer) для чтения в GTM. Чтобы протестировать и определить свой IP, просто перейдите по ссылке: https://api.ipify.org?format=jsonp&callback=getIP

Передача IP-адреса в GTM

Ваш IP-адрес на ipify.org

window . dataLayer = window . dataLayer || [];
window . dataLayer . push (< 'event' : 'ipEvent' ,

Далее создаем триггер «Просмотр страницы», который будет активироваться только один раз за сеанс на сайте. Чтобы избежать многократного обращения к API-интерфейсу ipify и потенциального сбоя множества обращений, вы можете поочередно установить этот сценарий для запуска только на целевой странице. Для этого мы в качестве условия активации триггера можем выбрать: Некоторые просмотры страницы – Referrer – не содержит – домен вашего сайта

Передача IP-адреса в GTM

Условие активации триггера

Затем создаем переменную уровня данных ipAddress:

Передача IP-адреса в GTM

Переменная уровня данных ipAddress

И триггер типа «Пользовательское событие» ipEvent:

Передача IP-адреса в GTM

Пользовательское событие ipEvent

Важно: переменная и триггер должны быть такие же, как и в HTML-теге. После выполнения вышеописанных шагов у вас будет новый триггер GTM (ipEvent) и переменная (ipAddress), к которым вы можете получить доступ в других тегах. Теперь все, что осталось сделать, это проверить корректность передачи информации. Переходим в режим предварительного просмотра и видим:

Передача IP-адреса в GTM

Событие ipEvent в режиме отладки

IP-адрес пользователя определяется корректно. Проверить также можно через какое-нибудь расширение, например, dataLayer Checker для Chrome.

Передача IP-адреса в GTM

Проверка событий через DataLayer Checker

Осталось только создать в GA custom dimension и передать в отдельном теге Universal Analytics с типом "Событие" и триггером "Окно загружено" ее значение:

Передача IP-адреса в GTM

Специальный параметр в GTM

Не забываем про индекс. Значение параметра из переменной ipAddress>>:

IP-адрес Google Tag Manager

custom dimension

Результат с GTM такой же, как и передавать IP-адрес пользователя сайта напрямую в Google Analytics с помощью функции PHP и custom_map.

Передача IP-адреса в GTM

Отчет в Google Analytics

Запуск домашнего веб-сервера без статического IP с помощью Python

Задался тут вопросом, как можно обойтись без статического IP для экспериментов в домашних условиях. Наткнулся на вот эту статью.

Если вы хотите развернуть свой вебсервер с доступом извне, а платить провайдеру за статический IP не хотите, то данное решение вполне себе выход, которое можно в дальнейшем подогнать под свои нужды.

Недавно я решил установить веб-сервер на Rasberry Pi, работающий за моим домашним маршрутизатором. У меня есть опыт настройки веб-серверов на виртуальных машинах Linux со статическими IP-адресами, поэтому в настройке сервера apache2 на Pi нет ничего особенного, и в Интернете есть сотни руководств. Проблема только в том, что при изменении внешнего IP вашего роутера сайт сломается! Один из способов решить эту проблему — заплатить своему интернет-провайдеру за статический IP-адрес… но тогда в чём веселье?!

Во многих своих последних проектах я использовал Google Domains для покупки доменного имени и обычно запускал сайты без собственных гугловских серверов имен на отдельном VPS/«облачном сервере». Но для моего домашнего сервера я решил использовать невероятно простую в настройке функцию переадресации IP-адресов поддоменов, чтобы перенаправить базовый домен (@.example.com) на IP-адрес моего маршрутизатора (а затем настроить мой маршрутизатор на перенаправление с http портов на https порты на Pi). Тогда мне пришлось бы вручную проверять, работает ли сайт, и менять IP при необходимости. Очевидно, это не идеальный план, поэтому я решил написать скрипт для автоматизации этого процесса.

На заметку, вы можете найти полный скрипт на гитхабе или импортировать пакет Python с помощью pip install domains-api

Есть много способов проверить ваш внешний IP-адрес, и один из самых простых, которые я нашел, был через ipify API (api.ipify.org), который просто возвращает ваш общедоступный IP-адрес. При использовании Python библиотеки requests запрос выглядит следующим образом:

IP = requests.get('https://api.ipify.org').text

Вот и все, это ваш внешний IP. Легко, правда? Есть много других подобных способов получить внешний IP-адрес, но я считаю, что это самый простой.

Итак, что еще нам нужно для нашего скрипта? Нам нужно где-то хранить IP-адрес, чтобы проверять будущие запросы. Изначально я решил сохранить его в простом текстовом файле. Нам также нужен способ либо уведомить пользователя, либо обновить domain.google.com, либо и то, и другое. Первый вариант довольно легко реализовать с помощью библиотеки электронной почты для Python, поэтому я настроил её для работы с моей учетной записью Gmail следующим образом (вам нужно будет разрешить менее безопасные приложения (less secure apps) в своей учетной записи Google):

from email.message import EmailMessage def send_notification(new_ip): msg = EmailMessage() msg.set_content(f'IP has changed!\nNew IP: ') msg['Subject'] = 'IP CHANGED!' msg['From'] = GMAIL_USER msg['To'] = GMAIL_USER try: server = smtplib.SMTP_SSL('smtp.gmail.com', 465) server.ehlo() server.login(GMAIL_USER, GMAIL_PASSWORD) server.send_message(msg) server.close() log_msg = 'Email notification sent to %s' % GMAIL_USER) logging.info(log_msg) except (MessageError, ConnectionError) as e: log_msg = 'Something went wrong: %s' % e logging.warning(log_msg)

Одна вещь, которая немного беспокоит здесь, — это сохранение вашего пароля от учетки Gmail в переменной, поэтому я решил на этом этапе хотя бы немного зашифровать его, добавив один уровень кодирования к паролю перед его сохранением. Опять же, есть много способов, которые могут предложить более или менее сносную защиту, но я решил, что для моих целей будет в достаточной мере надежно, если пароль будет закодирован в base64 при сохранении на сервере, поэтому я написал следующие функций: одна для кодирования/сохранения пароля и одна для получения/декодирования сохраненного пароля:

def enc_pwd(): pwd = base64.b64encode(getpass("What's your email password?: ").encode("utf-8")) with open('cred.txt', 'wb') as f: f.write(pwd) def read_pwd(): if os.path.isfile(f"/cred.txt"): with open(f'/cred.txt', 'r') as f: if f.read(): password = base64.b64decode(pwd).decode('utf-8') logging.info('Password read successfully') return password else: enc_pwd() read_pwd() else: enc_pwd() read_pwd()

Теперь я мог бы заменить константу GMAIL_PASSWORD из функции уведомления на функцию read_pwd() (которая возвращает декодированный пароль), что всяко безопаснее.

Последнее, что мне нужно, чтобы программа стала эффективной, — это дописать функцию, которая свяжет всё вместе и сохранит/сравнит IP-адреса:

def check_ip(): if os.path.isfile('ip.txt'): # Снова проверим предыдущий IP with open('ip.txt', 'r') as rf: line = rf.readlines() if not line: first_run = True elif line[0] == IP: first_run = False change = False else: first_run = False change = True else: first_run = True if first_run or change: # Запишем новый IP в файл with open('ip.txt', 'w') as wf: if first_run: wf.write(IP) elif change: wf.write(IP) # Уведомим пользователя: send_notification(IP) time.sleep(21600) # в окончательной версии на моем боевом веб-сервере я удалил это 6-часовое ожидание и рекурсивный вызов в конце и просто добавил скрипт в crontab для запуска один раз в час. Мне также пришлось сделать все пути к файлам абсолютными, поскольку по умолчанию для crontab рабочий каталог - '/'. check_ip()

Бум! Это была первая реализация моей идеи. Когда я получаю уведомление по электронной почте, я могу просто изменить правила переадресации на сайте domains.google.com…

Стоп, что? Мне все еще нужно это делать самому? Конечно нет, есть способ проще!

Что ж, оказывается, есть два способа автоматизировать это — один значительно менее эффективный, но бесконечно более захватывающий, а другой довольно скучный, но бесконечно более эффективный! Я начну, как и сделал, с захватывающего и сложного способа: слышали когда-нибудь о Selenium для автоматизации тестирования веб-сайтов? Я решил написать сценарий, который будет физически входить в домены Google и перемещаться по сайту, чтобы изменить правила для меня, если и когда изменится IP. Однако это приводило к следующим проблемам:

Прежде всего, Google Domains (и другие сервисы Google, такие как Gmail) довольно хорошо обнаруживают автоматизацию браузера и просто не позволяют вам войти в систему через веб-драйвер Selenium. Мне посчастливилось найти этот ответ (есть и другие решения) в Stack Overflow, который предлагал войти в сам Stack Overflow с вашей учетной записью Google, прежде чем переключаться на желаемую службу Google, что действительно работало, пока я не брал под контроль браузер и при необходимости не вводил капчу. Со скриптом, запущенным на моем ноутбуке или десктопе, это замечательно — тем более, что после первоначальной проверки Captcha StackOverflow, похоже, больше не проверял тот же компьютер, поэтому после этого веб-драйвер можно было запустить в автономном режиме, но это не подходит для веб-сервера! Хотя я мог заставить веб-драйвер нормально работать с помощью PyVirtualDisplay и Geckodriver (веб-драйвер для Firefox), ему удавалось только один раз попасть на желаемую страницу «Мои домены», а в других случаях вообще не мог войти в систему из-за Captcha.

После того, как я провозился с этим и пытался дебежить/работать над этим полдня, я решил, что это безнадежное дело, так как в любом случае всё, что потребуется, — это немного изменить одну из страниц, на которой я просматривал информацию, и вся работа скрипта будет нарушена. Поэтому я решил прибегнуть к скучному методу, который до сих пор я по глупости не изучал очень глубоко.

Так уж получилось, что у Google Domains есть API именно для той цели, которая мне нужна. Я изначально отклонил APi, когда не смог заставить его работать с правилами переадресации поддоменов, которые я использовал, не понимая, что API предназначен для изменения правил динамического DNSэта документация стала намного более понятной после того, как я настроил запись динамического DNS вместо стандартного правила «Переадресация поддоменов» (спасибо Джереми Гейлу за его отличный урок о том, как сделать что-то подобное с помощью простого сценария bash, который помог мне победить эту проблему!)

Раздел «Synthetic records» на странице конфигурации DNS Google Domains должен выглядеть следующим образом:

Вот как должна выглядеть ваша запись

Выберите «Dynamic DNS» вместо «Subdomain forward».

Затем вы получите автоматически сгенерированные учетные данные, необходимые для аутентификации с помощью API:

Просто нажмите «Просмотреть учетные данные», скопируйте и вставьте их в свой запрос API.

Теперь, зная этот метод, я смог значительно уменьшить длину и нагрузку на скрипт! TTL динамического DNS также очень низок, по умолчанию: 1 мин, что сокращает возможное время простоя — ещё один дополнительный бонус. Всё, что мне было нужно, это включить вызов API в мою функцию check_ip(), и он сделает все за меня! И эта единственная строка кода (2 с вызовом логирования) выглядит так:

req = requests.post(f'https://:@domains.google.com/nic/update?hostname=@.example.com&myip=') logging.info(req.content)

Я заключил всё в блок try / except, чтобы перехватить любые исключения, и таким образом этот довольно простой, но удивительно полезный скрипт был почти готов. Теперь осталось только добавить его в crontab на моем веб-сервере и дать ему работать, и (теоретически) мне больше не придется беспокоиться о смене IP!

Стоп! … Время рефакторинга

Так, вот, о чем я позаботился! Чтобы сделать этот скрипт универсально доступным, я реорганизовал всё, чтобы использовать более объектно-ориентированный подход, основанный на классах, с классами User и IpChanger . Класс User содержит все учетные данные для входа в smtp и вызова API domains.google, а первый созданный экземпляр вместе с атрибутом previous_ip , для проверки, сохраняется в одном pickle файле (аналогично сериализации в JavaScript); в будущих экземплярах класса User() пользовательский экземпляр создается из pickle, если не указано иное. Класс User также содержит метод уведомления пользователя по электронной почте, который теперь включает условие ошибки на случай сбоя вызова API. Затем класс IpChanger вызывает класс User() каждый раз, когда он создается, а также выполняет все различные проверки и запросы, поэтому вы просто инициализируете класс IpChanger() и всё; он работает! Я также добавил несколько различных вариантов для уведомлений по электронной почте, более конкретную обработку ошибок/логирование, некоторые аргументы/параметры командной строки для управления профилем пользователя, а также смог избавиться от неуклюжей обработки файла ip.txt , сохранив всё в одном пользовательском экземпляре.

Готовый, практически уникальный (!) результат можно увидеть ниже во всей его полноте, а также его можно форкнуть/клонировать с моего GitHub (включая README.md с инструкциями по установке). Я также выпустил его как пакет Python на pypi.org, который вы можете просмотреть здесь или установить обычным способом с помощью: pip install domains-api

Любые вопросы, отзывы или предложения — пишите!

Какие ещё методы стабильной работы веб-сервера без статического адреса вы знаете? И как можно доработать это решение?

Полный скрипт (без file_handlers.py):

import os import sys import getopt import base64 import smtplib from email.message import EmailMessage from getpass import getpass from itertools import cycle from requests import get, post from requests.exceptions import ConnectionError as ReqConError from domains_api.file_handlers import FileHandlers fh = FileHandlers() def get_ip_only(): """Gets current external IP from ipify.org""" current_ip = get('https://api.ipify.org').text return current_ip class User: BASE_URL = '@domains.google.com/nic/update?hostname=' def __init__(self): """Create user instance and save it for future changes to API and for email notifications.""" self.domain, self.dns_username, self.dns_password, self.req_url = self.set_credentials() self.notifications, self.gmail_address, self.gmail_password = self.set_email() self.outbox = [] def set_credentials(self): """Set/return attributes for Google Domains credentials""" self.domain = input("What's your domain? (example.com / subdomain.example.com): ") self.dns_username = input("What's your autogenerated dns username?: ") self.dns_password = getpass("What's your autogenerated dns password?: ") self.req_url = f'https://:' return self.domain, self.dns_username, self.dns_password, self.req_url def set_email(self): """Set/return attributes for Gmail credentials if user enables notifications""" self.notifications = input("Enable email notifications? [Y]all(default); [e]errors only; [n]no: ").lower() if self.notifications != 'n': self.gmail_address = input("What's your email address?: ") self.gmail_password = base64.b64encode(getpass("What's your email password?: ").encode("utf-8")) if self.notifications != 'e': self.notifications = 'Y' return self.notifications, self.gmail_address, self.gmail_password else: return 'n', None, None def send_notification(self, ip=None, msg_type='success', error=None, outbox_msg=None): """Notify user via email if IP change is made successfully or if API call fails.""" if self.notifications != 'n': msg = EmailMessage() msg['From'] = self.gmail_address msg['To'] = self.gmail_address if ip and msg_type == 'success' and self.notifications not in : msg.set_content(f'IP for has changed! New IP: ') msg['Subject'] = 'IP CHANGED!' elif msg_type == 'error' and self.notifications != 'n': msg.set_content(f"Error with 's IPChanger: ()!") msg['Subject'] = 'IPCHANGER ERROR!' elif outbox_msg: msg = outbox_msg try: server = smtplib.SMTP_SSL('smtp.gmail.com', 465) server.ehlo() server.login(self.gmail_address, base64.b64decode(self.gmail_password).decode('utf-8')) server.send_message(msg) server.close() return True except Exception as e: log_msg = 'Email notification not sent: %s' % e fh.log(log_msg, 'warning') self.outbox.append(msg) fh.save_user(self) sys.exit(1) class IPChanger: ARG_STRING = 'cdehinu:' ARG_LIST = ['credentials', 'delete_user', 'email', 'help', 'ip', 'notifications', 'user_load='] def __init__(self, argv=None): """Check for command line arguments, load/create User instance, check previous IP address against current external IP, and change via the API if different.""" # Load old user, or create new one: if os.path.isfile(fh.user_file): self.user = fh.load_user(fh.user_file) fh.log('User loaded from pickle', 'debug') else: self.user = User() fh.log('New user created.\n(See `python -m domains_api --help` for help changing/removing the user)', 'info') self.current_ip = self.get_set_ip() # Parse command line options: try: opts, _args = getopt.getopt(argv, self.ARG_STRING, self.ARG_LIST) except getopt.GetoptError: print('''Usage: python/python3 -m domains_api --help''') sys.exit(2) if opts: self.arg_parse(opts) # Check IPs: try: if self.user.previous_ip == self.current_ip: log_msg = 'Current IP: %s (no change)' % self.user.previous_ip else: self.user.previous_ip = self.current_ip fh.save_user(self.user) self.domains_api_call() log_msg = 'Newly recorded IP: %s' % self.user.previous_ip fh.log(log_msg, 'info') except AttributeError: setattr(self.user, 'previous_ip', self.current_ip) fh.save_user(self.user) self.domains_api_call() finally: if fh.op_sys == 'pos' and os.geteuid() == 0: fh.set_permissions(fh.user_file) # Send outbox emails: if self.user.outbox: for i in range(len(self.user.outbox)): self.user.send_notification(outbox_msg=self.user.outbox.pop(i)) fh.log('Outbox message sent', 'info') fh.save_user(self.user) fh.clear_logs() def get_set_ip(self): """Gets current external IP from api.ipify.org and sets self.current_ip""" try: return get_ip_only() except (ReqConError, ConnectionError) as e: fh.log('Connection Error. Could not reach api.ipify.org', 'warning') self.user.send_notification(msg_type='error', error=e) def domains_api_call(self): """Attempt to change the Dynamic DNS rules via the Google Domains API and handle response codes""" try: req = post(f'&myip=') response = req.text log_msg = 'Google Domains API response: %s' % response fh.log(log_msg, 'info') # Successful request: _response = response.split(' ') if 'good' in _response or 'nochg' in _response: self.user.send_notification(self.current_ip) # Unsuccessful requests: elif response in : msg = "The hostname does not exist, is not a fully qualified domain" \ " or does not have Dynamic DNS enabled. The script will not be " \ "able to run until you fix this. See https://support.google.com/domains/answer/6147083?hl=en-CA" \ " for API documentation" fh.log(msg, 'warning') if input("Recreate the API profile? (Y/n):").lower() != 'n': self.user.set_credentials() self.domains_api_call() else: self.user.send_notification(self.current_ip, 'error', msg) else: fh.log("Could not authenticate with these credentials", 'warning') if input("Recreate the API profile? (Y/n):").lower() != 'n': self.user.set_credentials() self.domains_api_call() else: fh.delete_user() fh.log('API authentication failed, user profile deleted', 'warning') sys.exit(1) # Local connection related errors except (ConnectionError, ReqConError) as e: log_msg = 'Connection Error: %s' % e fh.log(log_msg, 'warning') self.user.send_notification(msg_type='error', error=e) def arg_parse(self, opts): """Parses command line options: e.g. "python -m domains_api --help" """ for opt, arg in opts: if opt in : print(''' [Domains API] Current external IP: %s ''' % get_ip_only()) elif opt in : print( """ domains-api help manual (command line options):
 You will need your autogenerated Dynamic DNS keys from https://domains.google.com/registrar/example.com/dns to create a user profile. python -m domains_api || -run the script normally without arguments python -m domains_api -h --help || -show this help manual python -m domains_api -i --ip || -show current external IP address python -m domains_api -c --credentials || -change API credentials python -m domains_api -e --email || -email set up wizard > use to delete email credentials (choose 'n') python -m domains_api -n --notifications || -toggle email notification settings > will not delete email address python -m domains_api -u user.file || (or "--user_load path/to/user.file") -load user from pickle file python -m domains_api -d --delete_user || -delete current user profile || User files are stored in "/var/www/domains_api/domains.user" """ ) elif opt in : self.user.set_credentials(update=True) self.domains_api_call() fh.save_user(self.user) fh.log('API credentials changed', 'info') elif opt in : fh.delete_user() fh.log('User deleted', 'info') print('>>>Run the script without options to create a new user, or ' '"python3 -m domains_api -u path/to/pickle" to load one from file') elif opt in : self.user.set_email() fh.save_user(self.user) fh.log('Notification settings changed', 'info') elif opt in : n_options = options_iter = cycle(n_options.keys()) for option in options_iter: if self.user.notifications == option: break self.user.notifications = next(options_iter) fh.save_user(self.user) log_msg = 'Notification settings changed to %s' % n_options[self.user.notifications] fh.log(log_msg, 'info') if self.user.notifications in and not self.user.gmail_address: fh.log('No email user set, running email set up wizard. ', 'info') self.user.set_email() fh.save_user(self.user) elif opt in : try: self.user = fh.load_user(arg) fh.save_user(self.user) fh.log('User loaded', 'info') except FileNotFoundError as e: fh.log(e, 'warning') sys.exit(2) sys.exit()

if name = :
IPChanger(sys.argv[1:])

Как узнать IP-адрес в Linux

IP означает «Интернет-протокол», и это уникальный адрес, по которому устройство распознается в Интернете. IP-адрес отличается для каждой машины, когда мы заходим в Google, Facebook или какую-либо другую платформу, она записывает IP-адрес, по которому мы заходим на этот веб-сайт. Этот адрес помогает Интернету обмениваться информацией между различными устройствами.

IP-адрес любой машины можно узнать в Linux с помощью разных команд, эти команды обсуждаются в этой статье.

Как узнать IP-адрес с помощью команды в Linux

В Linux есть разные команды для поиска IP-адресов, в основном есть два типа IP-адресов; общедоступные и частные IP-адреса; частный IP-адрес является уникальным и назначается каждой машине, а общедоступный IP-адрес используется для подключения устройства к Интернету.

Чтобы узнать общедоступный IP-адрес, мы можем использовать команду ifconfig.me с curl:

$ curl ifconfig.me

Другой способ найти его — запустить команду ipinfo:

$ curl ipinfo.io / ip /

Команда API также используется для отображения общедоступного IP-адреса:

$ curl api.ipify.org

Для поиска IP-адреса можно использовать метод команды checkip:

$ curl checkip.dyndns.org

Последняя удобная команда, используемая для определения общедоступного IP-адреса:

$ curl ident.me

Чтобы найти частные IP-адреса, мы можем просто использовать команду «ip address»:

$ ip address

Вместо адреса мы также можем использовать «addr» или просто «a» с командой IP:

Другой способ найти IP-адрес — использовать команду ip config, но перед этим вам может потребоваться установить пакет сетевых инструментов, если вы используете дистрибутивы Linux на основе Debian-Ubuntu, с помощью команды:

$ sudo apt install net-tools

После установки net-tools мы можем узнать IP-адрес с помощью команды:

$ ifconfig -a

Команда hostname используется для определения DNS-имени, но ее также можно использовать для поиска IP-адресов:

$ hostname -I | awk ''

Команду IP route также можно использовать для получения IP-адреса:

$ ip route get 1.2.3.4 | awk ''

Одним из наиболее распространенных методов, используемых для поиска IP-адреса, является команда nmcli, с помощью которой мы можем отобразить устройство и показать его сведения:

$ nmcli -p device show

Мы можем отобразить IP-адрес имени хоста, просто используя команду «hostname» с опцией «-I»:

$ hostname -I

Заключение

IP-адрес используется для идентификации машины в Интернете, отправки и получения данных на конкретной машине. IP-адрес каждой машины уникален и помогает Интернету передавать информацию между разными машинами. В этой статье мы обсудили различные команды, с помощью которых мы можем узнать IP-адрес машины в Linux. Мы объясним команды для поиска обоих; общедоступные и частные IP-адреса в Linux.

Все права защищены. © Linux-Console.net • 2019-2023

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *