генератор ip адресов python
Модуль ipaddress¶
Модуль ipaddress упрощает работу с IP-адресами.
С версии Python 3.3 модуль ipaddress входит в стандартную библиотеку Python.
ipaddress.ip_address ¶
Функция ipaddress.ip_address позволяет создавать объект IPv4Address или IPv6Address соответственно:
У объекта есть несколько методов и атрибутов:
С помощью атрибутов is_ можно проверить, к какому диапазону принадлежит адрес:
С полученными объектами можно выполнять различные операции:
ipaddress.ip_network ¶
Функция ipaddress.ip_network позволяет создать объект, который описывает сеть (IPv4 или IPv6):
Как и у адреса, у сети есть различные атрибуты и методы:
Метод hosts возвращает генератор, поэтому, чтобы посмотреть все хосты, надо применить функцию list :
Метод subnets позволяет разбивать на подсети. По умолчанию он разбивает сеть на две подсети:
Параметр prefixlen_diff позволяет указать количество бит для подсетей:
С помощью параметра new_prefix можно указать, какая маска должна быть у подсетей:
По IP-адресам в сети можно проходиться в цикле:
Или обращаться к конкретному адресу:
Таким образом можно проверять, находится ли IP-адрес в сети:
ipaddress.ip_interface ¶
Функция ipaddress.ip_interface позволяет создавать объект IPv4Interface или IPv6Interface соответственно:
Используя методы объекта IPv4Interface, можно получать адрес, маску или сеть интерфейса:
Пример использования модуля¶
Так как в модуль встроены проверки корректности адресов, можно ими пользоваться, например, чтобы проверить, является ли адрес адресом сети или хоста:
Модуль ipaddress в Python.
Создания и работа с IPv4 и IPv6 адресами, сетями и интерфейсами.
Модуль ipaddress предоставляет возможности для создания, управления и работы с адресами и сетями IPv4 и IPv6.
Функции и классы в этом модуле упрощают выполнение различных задач, связанных с IP-адресами, включая проверку того, находятся ли два хоста в одной подсети, итерацию по всем хостам в определенной подсети, проверку того, представляет ли строка действительный IP-адрес или определение сети и т. д.
Содержание:
Создание объектов IP-адреса, сети и интерфейса.
Примечание к версиям IP адресов: Для пользователей, которые не знакомы с IP-адресацией, важно знать, что Интернет-протокол в настоящее время находится в процессе перехода от версии 4 к версии 6. Этот переход происходит в основном потому, что версия 4 протокола не предоставляет достаточного количества адресов для удовлетворения потребностей всего мира, особенно учитывая растущее число устройств с прямым подключением к Интернету.
Определение IP-адресов.
Адреса также можно создавать непосредственно из целых чисел. Предполагается, что значения, которые соответствуют 32 битам, являются адресами IPv4:
Чтобы принудительно использовать адреса IPv4 или IPv6, соответствующие классы могут быть вызваны напрямую. Такое поведение полезно для принудительного создания адресов IPv6 для небольших целых чисел:
Определение IP-сетей.
Адреса хостов обычно группируются в IP-сети, поэтому модуль ipaddress позволяет создавать, проверять и управлять определениями сети. Сетевые объекты IP состоят из строк, которые определяют диапазон адресов хостов, которые являются частью этой сети. Простейшей формой этой информации является пара «сетевой адрес/сетевой префикс«, где префикс определяет количество ведущих битов, которые сравниваются, чтобы определить, является ли адрес частью сети, а сетевой адрес определяет ожидаемое значение этих бит.
Что касается адресов, предусмотрена фабричная функция, которая автоматически определяет правильную версию IP:
Объекты IP-сети не могут иметь никаких битов хоста. На практике это означает, что запись 192.0.2.1/24 не описывает сеть. Такие определения называются объектами сетевых интерфейсов, поскольку нотация ip-on-a-network обычно используется для описания сетевых интерфейсов компьютера в данной сети.
Хотя строковая форма предлагает значительно большую гибкость, объекты сети также можно определять с помощью целых чисел, как и адреса хостов. В этом случае считается, что сеть содержит только один адрес, обозначенный целым числом, поэтому префикс сети включает весь сетевой адрес:
Как и в случае с адресами, определенный тип сети может быть принудительно создан прямым вызовом конструктора класса вместо использования фабричной функции.
Определение IP-интерфейса.
Если нужно описать адрес в конкретной сети, ни объекта адреса, ни объекта сети недостаточно. Обозначение типа 192.0.2.1/24, используется сетевыми инженерами для определения правил маршрутизаторов и расшифровывается как «хост 192.0.2.1 в сети 192.0.2.0/24«. Соответственно, модуль ipaddress предоставляет набор гибридных классов, которые связывают адрес с определенной сетью. Интерфейс для создания идентичен интерфейсу для определения объектов сети, за исключением того, что часть адреса не ограничивается объектом сетевого адреса.
Для создания интерфейса могут использоваться целочисленные входные данные (как в случае с сетями), так же создание определенного типа интерфейса хоста может быть создано прямым вызовом конструктора соответствующего класса
Операции с объектами IP-адреса, сети и интерфейса.
И так, есть объект IPv(4/6) IP-адреса, сети или интерфейса, и вероятно, необходимо получить информацию о нем. Модуль ipaddress делает это простым и интуитивно понятным.
Извлечение версии IP:
Получение сети из интерфейса:
Узнаем, сколько отдельных адресов в сети:
Перебор полезных адресов в сети:
Получение сетевой маски (т. е. установки битов, соответствующих префиксу сети) или маски хоста (любых битов, не являющихся частью сетевой маски):
Расширение или сжатие IPv6-адреса:
Хотя IPv4 не поддерживает расширение или сжатие, связанные объекты по-прежнему предоставляют соответствующие свойства, поэтому нейтральный по версии код может легко гарантировать, что для адресов IPv6 используется наиболее краткая или самая подробная форма, при этом адреса IPv4, так же обрабатывая правильно.
Объект сети как список IP-адресов.
Полезное свойство модуля, это предоставление объекта сети как списка адресов. Это означает, что их можно индексировать следующим образом:
Проверка вхождения/членства IP-адреса в сеть.
Сетевые объекты можно проверять на вхождение/членство в списке следующим образом:
Вхождение/членство IP-адреса эффективно выполняется на основе префикса сети:
Сравнение IP-адресов.
Модуль ipaddress предоставляет несколько простых, интуитивно понятных способов сравнения объектов, где это имеет смысл:
Преобразование объекта IP-адреса в строку и число.
Другие модули, использующие IP-адреса (например, socket ), обычно не принимают объекты IP-адреса напрямую. Следовательно они должны быть приведены к целому числу или строке, которые примет другой модуль:
Информация при сбое создания экземпляра.
При создании объектов адреса, сети или интерфейса с использованием фабричных функций, не зависящих от версии протокола, любые ошибки будут генерировать исключение ValueError с общим сообщением об ошибке (переданное значение не было распознано как объект этого типа).
Конструкторы классов, имеющих в названии конкретный протокол, при ошибках создания объекта вызывают исключения ipaddress.AddressValueError и ipaddress.NetmaskValueError и точно указывают, какую часть определения не удалось правильно проанализировать
Сообщения об ошибках значительно более детализированы при прямом использовании конструкторов классов. Например:
Оба специфичных для модуля исключения имеют ValueError в качестве родительского класса, поэтому, если не беспокоит конкретный тип ошибки, все равно можно написать код, подобный следующему:
Пишем генератор ip-адресов на Python со свистелками, дуделками и графической оболочкой Tkinter
Те, кто выбрал Python в качестве одного из первых изучаемых языков программирования общего назначения, нередко горят желанием написать внушительное количество мелких программ, наподобие UPD-клиентов, простеньких текстовых редакторов, чтобы отточить навыки на практике.
В этой статье я опишу процесс создания простенького генератора ip-адресов. Статья ориентирована на новичков. Среда разработки не так важна — вполне можно писать в IDLE, сложностей возникнуть не должно, однако я буду использовать Eclipse с плагином PyDev.
Что конкретно будет выполнять программа?
Представление адреса компьютера по протоколу IPv4 являет собой 32-битное число, разделенное на четыре блока для удобства записи. Такие блоки мы и будем генерировать. Следует отметить, что такая форма вывода удобна, поскольку зачастую списки ip-адресов, прокси-серверов и т. п. загружаются в сторонние программы именно текстовым файлом.
Определённо, первым параметром, который должен указать пользователь, будет количество адресов, которые нужно сгенерировать.
Пишем функцию generator()
GUI на Tkinter
Что же, пожалуй, есть всё, что нам необходимо, функционал допишем чуть позже, а сейчас приступим к созданию графического интерфейса. Использовать будем библиотеку Tkinter.
Подробную документацию о ней на русском языке можно прочитать тут.
Нам нужно создать поле ввода (виджет Entry ), кнопку (виджет Button ), желательно поле вывода логов, ну и добавить название программы, чтобы было с первого взгляда понятно, для чего она предназначена:
Используем упаковщик grid, который размещает элементы по принципу табличной вёрстки. После компиляции окно должно выглядеть вот так:
Обрабатываем введённые параметры
Теперь нам нужно написать функцию, которая будет считывать количество, введённое в поле ввода, при нажатии на кнопку «Сгенерировать», и передавать его в generator. При этом стоит сделать так, чтобы функция выдавала в поле логов сообщение об ошибке, если пользователь ввёл не число. Для этого будем пользоваться конструкцией try-except:
Тогда описание виджета будет выглядеть так:
При добавлении метода command возможно потребуется прописать from distutils import command в импортах. Вот и всё, собственно, программа выполняет свою основную задачу.
Добавляем всякие полезности
Кнопка «Удалить файл»
При проверке корректности программы стало неудобно удалять текстовый файл вручную, так почему бы не добавить кнопку «Удалить файл»? Создаём функцию def delete() :
Особо с названием файла я заморачиваться не стал, но при желании можно реализовать пользовательское имя файла на выводе (и удалять соответствующий файл). Теперь пишем кнопку, которая будет вызывать delete :
Прогресс-бар
При генерации списка ip с 500 и более адресов становится заметно, что программе требуется некоторое время, чтобы обработать цикл for. Чтобы пользователь не подумал, что наша программа зависла, реализуем простенький прогресс-бар.
Сразу хочу сказать: Tkinter не подойдёт для этой цели. Мы не сможем реализовать вывод сообщения о прогрессе в окно Tkinter’а, поскольку компилятор не в состоянии обрабатывать окна графического интерфейса во время хода цикла for, даже если мы будем выводить сообщение не каждый ход, а, допустим, через 10, хоть через 100 ходов. Всё равно компилятор в состоянии вывести сообщение только последнего хода цикла (проще говоря, Tkinter таким образом будет выводить только 99%). То есть, создать кошерный прогресс-бар в том же окне, к сожалению, обычными средствами не получится. Так что логичнее всего на фоне основного интерфейса программы открыть терминал логов (обычную консоль), и в него выводить прогресс генерации. Заметка: консоль в привычном для пользователя виде откроется только при запуске программы из проводника; при запуске из компилятора сообщения выводятся в консоль компилятора.
Дорабатываем функцию generator :
Компилируем, генерируем список в 500, например, адресов. В консоль выводится следующее:
Здорово. А как убрать лишние повторяющиеся проценты? Создаём небольшой велосипед и сохраняем предыдущее значение:
Готово! С прогресс-баром, будем считать, разобрались.
Добавляем порты к ip-адресам
entry_port по умолчанию у нас скрыт. Каждый check_port выполняет функцию lock() при активации, которая соответственно скрывает/активирует поле ввода портов. Опишем функцию lock :
Теперь наш GUI имеет вид:
Добавляем в функцию-обработчик handler конструкцию if-else, которая выполняется в зависимости от режима генерации (от значения var1 ):
Стоп, функция-генератор принимает только один аргумент. Тогда вновь возвращаемся к ней и объявляем её следующим образом:
Добавив инициализацию аргумента port непосредственно в объявлении функции, мы сделали его необязательным, и он у нас изменит значение при вызове функции в режиме генерации с портами. Также добавляем его при записи в текстовый файл:
В конечном счёте, исходный код программы:
На этом всё. Конечно, можно добавить ещё много интересных функций, например, сортировку, генерацию в пределах определённого диапазона адресов, а можно и вовсе сделать парсер какого-нибудь фри-прокси.ру, однако для начальной практики по Python сойдет и такой простой генератор.
🌐 Концепция IP-адресов на примере Python-модуля ipaddress
Вводные сведения об IP-адресах
В самом грубом представлении IP-адрес – это просто число. В случае протокола IPv4 IP-адрес– это 32-разрядное целое число, используемое для представления хоста в сети. То есть существует 2 32 возможных IPv4 адреса – от 0 до 4 294 967 295. IPv4-адреса записывают в виде четырех октетов – целых чисел, разделенных точками:
Далее мы рассмотрим, как модуль ipaddress выполняет преобразования адреса так, что нам не приходится отвлекаться на строение адреса.
Модуль ipaddress
Этот запрос узнает наш IP-шник на сайте ifconfig.me. Сайт также выдает множество другой полезной информации о вашем сетевом подключении.
Теперь откроем интерпретатор Python. Чтобы создать объект Python с инкапсулированным адресом, создадим класс IPv4Address :
Передача строки «220.14.9.37» в конструктор IPv4Address – наиболее распространенный подход, но класс может принимать и другие типы:
Адрес можно распаковать в требуемую форму:
Экземпляры IPv4Address являются хэшируемыми и могут использоваться в качестве ключей словаря:
Класс IPv4Address также реализует методы, позволяющие проводить сравнения:
Можно использовать любой стандартный оператор сравнения целочисленных значений адресных объектов.
IP-сети и интерфейсы
В CIDR сеть определяется с помощью сетевого адреса и префикса /
В данном случае префикс равен 24. Префикс – это количество ведущих битов, соответствующих входящим в сеть адресам. Ведущие биты отсчитываются слева направо.
Пример: входит ли адрес 192.4.2.12 в сеть 192.4.2.0/24?
Воспользуемся netmask для маскирования битов в сравниваемых адресах.
На рисунке ниже показано, как сравниваются ведущие биты, чтобы определить, является ли адрес частью сети.
Побитовое сравнение
Последние 8 бит в 192.4.2.12 маскируются нулем и игнорируются при сравнении.
Рассмотрим еще один важный тип адреса – широковещательный.
Это единственный адрес, который может использоваться для связи со всеми хостами сети:
Чаще всего вы будете сталкиваться с длиной префикса кратной 8.
Распространенные подсети
Любое целое число от 0 до 32 является допустимым, но такой вариант встречается реже:
Перебор IP-адресов в цикле
Класс IPv4Network позволяет перебирать отдельные адреса в цикле for:
Инструмент net.hosts() возвращает генератор, выдающий адреса, исключая сетевые и широковещательные:
Подсети IP-адресов
Подсеть – это часть IP-сети:
В коде выше small_net содержит 16 адресов, а big_net – 65 536.
Распространенный способ разбиения на подсети – это увеличение длины префикса на 1:
Разбиение сети
К счастью, IPv4Network расчеты подсетей поддерживаются встроенным методом subnets() :
В передаваемом subnets() аргументе можно задать, каким должен быть новый префикс:
Специальные диапазоны IP-адресов
Администрация адресного пространства Интернет (Internet Assigned Numbers Authority, IANA) совместно с Инженерном советом Интернета (Internet Engineering Task Force, IETF) осуществляют надзор за распределением диапазонов адресов. Реестр подобных адресов – важная таблица, которая описывает, для каких целей зарезервированы диапазоны IPv4-адресов.
К примеру, это частные IP-адреса, используемые для внутренней связи между устройствами в сети, не требующей подключения к интернету:
Зарезервированные диапазоны
Модуль ipaddress предоставляет набор свойств для проверки того, относится ли адрес к специальным:
Вот еще несколько зарезервированных сетей:
Что происходит внутри ipaddress
В дополнение к хорошо документированному API, исходный код CPython и класс IPv4Address показывают некоторые отличные идеи, как улучшить собственный код.
Компоновщик
Модуль ipaddress использует преимущества шаблона проектирования «Компоновщик». Класс IPv4Address представляет собой компоновщик, который оборачивает обычное целое число.
Цепочка вызовов в компоновщике
Помимо перегрузки оператора, есть возможность добавить новые свойства:
Методы binary_repr() и from_binary_repr() позволяют проводить двустороннюю конвертацию:
Таким образом, мы разобрали несколько способов использования преимуществ шаблона IP-as-integer, который может помочь расширить функциональность IPv4Address с небольшим количеством дополнительного кода.
Заключение
Если вам нравится язык Python и вы хотите детально овладеть стандартной библиотекой, у нас есть множество родственных публикаций:
Случайный генератор IP-адресов
Я знаю, что есть, вероятно, лучшие и простые способы сделать это. Это было всего лишь учебное упражнение для ознакомления с Python.
Требуется один аргумент (позиционный параметр):
Либо 4 (IPv4), либо 6 (IPv6).
Соответствующие выходы будут выглядеть примерно так:
61.104.170.242
b4fc:391d:3ec8:68ef:0ec8:529b:166d:ece2
6 ответов
Python часто описывается как язык с включенными «аккумуляторами», и это не исключение.
Существует только модуль для обработки IP-адресов и другой модуль для генерации случайных чисел. Составленные вместе, они делают именно то, что вы хотите, таким образом, что это немного читаемо (IMO).
Здесь addr_str будет содержать полностью случайный IPv4 или IPv6-адрес.
Вы даже можете генерировать случайные адреса из такой подсети:
Вот несколько идей о вашем коде.
Проверьте аргументы командной строки
Использовать понимание списка
Список понятий чрезвычайно полезен и очень Pythonic. Это действительно хорошо, чтобы овладеть ими. Вот как использовать один для генерации случайного IPv4-адреса:
И адрес IPv6 немного сложнее, потому что нам нужны шестнадцатеричные цифры.
Это работает, потому что randint генерирует число в диапазоне от 0x10000 до 0x20000, и затем мы выбираем последние четыре шестнадцатеричных цифры.
Для кого-то, не знакомого с Python, вы выбрали довольно хорошие привычки. Не все используют функции или код if __name__ == ‘__main__’ сначала попытаются.
Осталось только проверить правильность подтверждения ввода 4 или 6:
Проверьте наличие недопустимых выходов и восстановите их.
Подтвердите ввод: В настоящее время ваша программа
Отсутствующие или недопустимые аргументы должны печатать полезное сообщение об ошибке. Большинство инструментов командной строки Unix выводит сообщение на стандартную ошибку и завершение с ненулевым статусом выхода в случае сбоя.
Было бы проще сравнить данный аргумент с строки «4» и «6» вместо преобразования его в целое число (который может выйти из строя).
Используйте понимание списка вместо добавления к массиву в цикле. Используйте _ как переменную итератора, если конкретное значение не требуется.
В качестве примера, случай «IPv4» может быть реализован как
Поскольку у вас уже есть несколько ответов, в которых говорится, что вы проверяете свои входы, вот как это сделать, используя модуль argparse :
Затем вы можете использовать его в командной строке следующим образом:
Если вы сделаете что-нибудь еще, опубликовано полезное сообщение об использовании: