Есть ли в Python способ пропинговать сервер через ICMP и возвращать TRUE, если сервер отвечает, или FALSE, если ответа нет?
python
python-3.x
ping
icmp
Куду
источник
источник
Ответы:
Эта функция работает в любой ОС (Unix, Linux, macOS и Windows)
Python 2 и Python 3
Правок:
По @radato
os.system
был замененsubprocess.call
. Это позволяет избежать уязвимости внедрения оболочки в тех случаях, когда строка имени вашего хоста может не проверяться.Обратите внимание, что, согласно @ikrase в Windows, эта функция все равно будет возвращаться,
True
если вы получитеDestination Host Unreachable
ошибку.объяснение
Команда применяется
ping
как в Windows, так и в Unix-подобных системах.Опция
-n
(Windows) или-c
(Unix) контролирует количество пакетов, которое в этом примере было установлено на 1.platform.system()
возвращает имя платформы Ex.'Darwin'
на macOS.subprocess.call()
выполняет системный вызов. Ex.subprocess.call(['ls','-l'])
,источник
ping 8.8.8.8 -n 1
3)echo %ERRORLEVEL%
. Код: измените последнюю строку кода Python наreturn system_call(command)
. При правильном подключении вы получите 0 (ноль). При выключенном модеме вы должны получить код ошибки. Конечно, оба метода должны возвращать один и тот же код ошибки при одинаковых условиях.Если вам не нужна поддержка Windows, вот очень краткий способ сделать это:
Это работает, потому что ping возвращает ненулевое значение в случае сбоя соединения. (Возвращаемое значение на самом деле отличается в зависимости от ошибки сети.) Вы также можете изменить время ожидания пинга (в секундах), используя опцию -t. Обратите внимание, это выведет текст на консоль.
источник
response = os.system("ping -c 1 -w2 " + hostname + " > /dev/null 2>&1")
man ping
чтобы убедиться.hostname
строку от пользователя, он может легко взломать ваш сервер, дав вам URL-адрес'google.com; rm -rf /*'
. Используйтеsubprocess.run(["ping", "-c", "1", hostname]).returncode
вместо этого.Существует модуль, называемый pyping, который может сделать это. Может быть установлен с пипс
Использовать его довольно просто, однако при использовании этого модуля вам нужен root-доступ, поскольку он создает необработанные пакеты под капотом.
источник
os.system('ping -c 1 -t 1 hostname')
решение. Кроме того,pyping
библиотека очень проста в использовании по сравнению с библиотекой сокетов TCP / IP. Я написал свою программу ping, используя и то, и другое, иpyping
, на мой взгляд, гораздо быстрее и проще в использовании, особенно если кто-то не знаком с использованием библиотеки сокетов TCP / IP.pip install ping3
источник
whereis ping
чтобы получить правильный путь.ping_response = subprocess.Popen(["ping", hostname, "-n", '1'], stdout=subprocess.PIPE).stdout.read()
Для python3 есть очень простой и удобный модуль python ping3 : (
pip install ping3
, требуются права суперпользователя ).Этот модуль также позволяет настраивать некоторые параметры.
источник
Поскольку мне нравится, что моя программа Python универсальна для версий 2.7 и 3.x, а также для платформ Linux, Mac OS и Windows, мне пришлось изменить существующие примеры.
источник
False if platform.system().lower()=="windows" else True
вы могли, конечно, просто использоватьplatform.system().lower() != "windows"
.os.name!="nt"
работает? По общему признанию я не пробовал это на всех вер / платформах!def ping(host): process = subprocess.Popen(["ping", "-n", "1",host], stdout=subprocess.PIPE, stderr=subprocess.PIPE) streamdata = process.communicate()[0] if 'unreachable' in str(streamdata): return 1 return process.returncode
unreachable
он найден в канале, нет?После осмотра я написал свой собственный модуль ping, который предназначен для мониторинга большого количества адресов, является асинхронным и не использует много системных ресурсов. Вы можете найти его здесь: https://github.com/romana/multi-ping/ Он лицензирован Apache, поэтому вы можете использовать его в своем проекте любым удобным для вас способом.
Основными причинами реализации моих собственных являются ограничения других подходов:
источник
источник
Убедитесь, что установлен pyping или установите его pip install pyping
источник
Программный ICMP-пинг сложен из-за повышенных привилегий, необходимых для отправки необработанных ICMP-пакетов, а вызывающий
ping
двоичный код является уродливым. Для мониторинга сервера вы можете достичь того же результата, используя метод TCP ping :Внутренне это просто устанавливает TCP-соединение с целевым сервером и немедленно сбрасывает его, измеряя прошедшее время. Эта конкретная реализация немного ограничена в том, что она не обрабатывает закрытые порты, но для ваших собственных серверов она работает довольно хорошо.
источник
источник
Я решаю это с помощью:
«TTL» - это способ узнать, правильно ли выполнен пинг. Saludos
источник
Мое сокращение - использование идей из ответов в этом посте, но только с использованием более нового рекомендованного модуля подпроцесса и python3:
источник
True if condition else False
для возврата True или False в зависимости от условия. Просто используйте egshell_needed = operating_sys == 'Windows'
иreturn success == 0
Этот скрипт работает в Windows и должен работать в других ОС: он работает в Windows, Debian и macosx, требуется тестирование на Solaris.
источник
Я закончил тем, что нашел этот вопрос относительно похожего сценария. Я попробовал pyping, но пример, приведенный Naveen, не работал для меня в Windows под Python 2.7.
Пример, который работал для меня:
источник
pyping
не похоже на стандартный модуль. Возможно, вы могли бы предоставить ссылку?Используя Multi-ping (
pip install multiPing
), я сделал этот простой код ( просто скопируйте и вставьте, если хотите! ):Использование:
Если вы хотите один образец, второй параметр "
10
" можно игнорировать!Надеюсь, поможет!
источник
Моя версия функции ping:
Не стесняйтесь использовать его, как вы будете.
источник
Кажется достаточно простым, но дал мне припадки. Я продолжал получать сообщение «Работа с открытым сокетом ICMP запрещена», иначе решения зависали бы, если бы сервер был отключен. Если, однако, вы хотите знать, что сервер активен и на этом сервере запущен веб-сервер, то curl сделает эту работу. Если у вас есть ssh и сертификаты, то достаточно ssh и простой команды. Вот код:
источник
У меня было похожее требование, поэтому я реализовал его, как показано ниже. Он протестирован на 64-битной Windows и Linux.
Когда IP недоступен, subprocess.check_output () вызывает исключение. Дополнительную проверку можно выполнить путем извлечения информации из строки вывода «Пакеты: отправлено = 2, получено = 2, потеряно = 0 (потеря 0%)».
источник
Вот решение с использованием
subprocess
модуля Python иping
инструмента CLI, предоставляемого базовой ОС. Проверено на Windows и Linux. Поддержка установки таймаута сети. Не нужны права root (по крайней мере, в Windows и Linux).источник
Используйте это, он протестирован на python 2.7 и работает нормально, он возвращает время проверки в миллисекундах в случае успеха и возвращает False при ошибке.
источник
Одна вещь, которую многие ответы упускают, заключается в том, что (по крайней мере, в Windows)
ping
команда возвращает 0 (что указывает на успех), если она получает ответ «Узел назначения недоступен».Вот мой код, который проверяет, есть ли
b'TTL='
в ответе, так как он присутствует, только когда пинг достиг хоста. Примечание: большая часть этого кода основана на других ответах здесь.Примечание. Это захватывает вывод вместо его печати, поэтому, если вы хотите увидеть вывод
ping
, вам нужно будет распечататьcompletedPing.stdout
перед возвратом.источник
ТОЛЬКО для WINDOWS - Не могу поверить, что никто не взломал Win32_PingStatus Используя простой WMI-запрос, мы возвращаем объект, полный действительно подробной информации, бесплатно
образец вывода
источник
Я беру заимствования из других ответов. Попытка упростить и минимизировать запросы.
источник
Мне нужна была более быстрая проверка пинга, и я не хотел использовать какие-либо внешние библиотеки, поэтому я решил использовать параллелизм с использованием встроенного
asyncio
.Этот код требует Python 3.7+ и сделан и протестирован только на Linux . Он не будет работать в Windows, но я уверен, что вы можете легко изменить его для работы в Windows.
Я не эксперт,
asyncio
но я использовал эту замечательную статью « Ускорьте вашу программу на Python с параллелизмом» и придумал эти строки кода. Я постарался сделать его максимально простым, поэтому, скорее всего, вам нужно будет добавить в него больше кода, чтобы удовлетворить ваши потребности.Он не возвращает true или false, я подумал, что было бы удобнее просто напечатать IP-адрес, который отвечает на запрос ping. Я думаю, что это довольно быстро, пинг 255 ips почти за 10 секунд.
Пример вывода:
Обратите внимание, что IP-адреса расположены не по порядку, поскольку IP-адрес печатается, как только он отвечает, поэтому тот, который отвечает первым, печатается первым.
источник
Простой, который я только что приготовил за минуту .. используя icmplib, нужны root-привилегии, приведенные ниже работают довольно хорошо! НТН
источник