#networking #ping
#сеть #пинг
Вопрос:
Кто-нибудь знает, как использовать python для пинга локального хоста, чтобы узнать, активен он или нет? Мы (моя команда и я) уже пытались использовать
os.system("ping 192.168.1.*")
Но ответ для недоступного назначения такой же, как и ответ для хоста.
Спасибо за вашу помощь.
Ответ №1:
Используйте это …
import os
hostname = "localhost" #example
response = os.system("ping -n 1 " hostname)
#and then check the response...
if response == 0:
print(hostname, 'is up!')
else:
print(hostname, 'is down!')
При использовании этого скрипта в unix / Linux замените -n switch на -c !
Вот и все 🙂
Комментарии:
1. в случае, если я получу ответ «Конечный хост недоступен». он не работает.
2. конечно, вопрос мог бы быть лучше. но, как он указал в описании, он не работает с «Недоступным хостом назначения». — так что ваш ответ я полностью ошибочен.
Ответ №2:
Я обнаружил, что использование os.system (…) приводит к ложным срабатываниям (как сказано в OP, «конечный хост недоступен» == 0).
Как указывалось ранее, с помощью подпроцесса.Popen работает. Для простоты я рекомендую сделать это с последующим анализом результатов. Вы можете легко сделать это следующим образом:
if ('unreachable' in output):
print("Offline")
Просто проверьте различные выходные данные, которые вы хотите проверить, из результатов пинга. Сделайте «это» в «том», проверьте это.
Пример:
import subprocess
hostname = "10.20.16.30"
output = subprocess.Popen(["ping.exe",hostname],stdout = subprocess.PIPE).communicate()[0]
print(output)
if ('unreachable' in output):
print("Offline")
Комментарии:
1. Будьте осторожны, чтобы синтаксический анализ выходных данных зависел от языка операционной системы хоста.
Ответ №3:
Лучший способ, который я мог бы найти для этого в Windows, если вы не хотите анализировать выходные данные, — это использовать Popen следующим образом:
num = 1
host = "192.168.0.2"
wait = 1000
ping = Popen("ping -n {} -w {} {}".format(num, wait, host),
stdout=PIPE, stderr=PIPE) ## if you don't want it to print it out
exit_code = ping.wait()
if exit_code != 0:
print("Host offline.")
else:
print("Host online.")
Это работает, как и ожидалось. Код выхода не дает ложных срабатываний. Я тестировал его в Python 2.7 и 3.4 в Windows 7 и Windows 10.
Ответ №4:
Некоторое время назад я закодировал небольшую программу. Возможно, это не совсем то, что вы ищете, но вы всегда можете запустить программу в ОС хоста, которая открывает сокет при запуске. Вот сама программа ping:
# Run this on the PC that want to check if other PC is online.
from socket import *
def pingit(): # defining function for later use
s = socket(AF_INET, SOCK_STREAM) # Creates socket
host = 'localhost' # Enter the IP of the workstation here
port = 80 # Select port which should be pinged
try:
s.connect((host, port)) # tries to connect to the host
except ConnectionRefusedError: # if failed to connect
print("Server offline") # it prints that server is offline
s.close() #closes socket, so it can be re-used
pingit() # restarts whole process
while True: #If connected to host
print("Connected!") # prints message
s.close() # closes socket just in case
exit() # exits program
pingit() #Starts off whole process
И здесь у вас есть программа, которая может получать запрос ping:
# this runs on remote pc that is going to be checked
from socket import *
HOST = 'localhost'
PORT = 80
BUFSIZ = 1024
ADDR = (HOST, PORT)
serversock = socket(AF_INET, SOCK_STREAM)
serversock.bind(ADDR)
serversock.listen(2)
while 1:
clientsock, addr = serversock.accept()
serversock.close()
exit()
Чтобы запустить программу, фактически не показывая ее, просто сохраните файл как .pyw вместо .py .
Это делает его невидимым, пока пользователь не проверит запущенные процессы.
Надеюсь, это помогло вам
Комментарии:
1. Извините, но вопрос касался пинга сервера, что является другим сценарием. Подключение имеет смысл только тогда, когда вы знаете, что сервер существует и работает!
Ответ №5:
Для простоты я использую самодельные функции на основе сокета.
def checkHostPort(HOSTNAME, PORT):
"""
check if host is reachable
"""
result = False
try:
destIp = socket.gethostbyname(HOSTNAME)
except:
return result
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(15)
try:
conn = s.connect((destIp, PORT))
result = True
conn.close()
except:
pass
return result
если Ip:порт доступен, верните True
Если вы хотите имитировать пинг, можете обратиться к ping.py
Ответ №6:
Попробуйте это:
ret = os.system("ping -o -c 3 -W 3000 192.168.1.10")
if ret != 0:
print "Host is not up"
-o ожидает только один пакет
-W 3000 дает ему только 3000 мс для ответа на пакет.
-c 3 позволяет попробовать несколько раз, чтобы ваш пинг не выполнялся вечно
Ответ №7:
Используйте это и проанализируйте вывод строки
import subprocess
output = subprocess.Popen(["ping.exe","192.168.1.1"],stdout = subprocess.PIPE).communicate()[0]
Ответ №8:
Как насчет модуля запроса?
import requests
def ping_server(address):
try:
requests.get(address, timeout=1)
except requests.exceptions.ConnectTimeout:
return False
return True
- Нет необходимости разделять URL-адреса для удаления портов или тестирования портов, и нет ложного срабатывания localhost.
- Количество времени ожидания на самом деле не имеет значения, поскольку оно достигает времени ожидания только тогда, когда нет сервера, что в моем случае означало, что производительность больше не имеет значения. В противном случае это возвращается со скоростью запроса, что для меня достаточно быстро.
- Тайм-аут ожидает первого бита, а не общего времени, если это имеет значение.