Проверьте, работает ли удаленный хост в Python - PullRequest
5 голосов
/ 29 марта 2010

Как я могу проверить, работает ли удаленный хост без номера порта? Есть ли какой-то другой способ, которым я мог бы проверить другой, чем с помощью обычного пинга.

Существует вероятность того, что удаленный хост может отбросить пинг-пакеты

Ответы [ 6 ]

10 голосов
/ 29 ноября 2016

Для меня это работало нормально:

HOST_UP  = True if os.system("ping -c 1 " + SOMEHOST) is 0 else False
1 голос
/ 29 марта 2010

Лучше всего PING на уровне протокола, т. Е. Подключаться к серверу и взаимодействовать с ним таким образом, который не выполняет реальной работы. Это потому, что это единственный реальный способ убедиться, что service работает. ICMP ECHO (a.k.a. ping) только скажет вам, что сетевой интерфейс другого конца работает, и даже в этом случае может быть заблокирован; FWIW, я видел машины, где все пользовательские процессы были заблокированы, но которые все еще могли быть проверены. В наши дни серверов приложений даже подключения к сети может быть недостаточно; Что делать, если размещенное приложение не работает или иным образом не работает? Как я уже сказал, разговор сладостей с интересующим вас сервисом - лучший, самый верный подход.

0 голосов
/ 20 мая 2015

Я бы использовал сканер портов. Исходный вопрос гласит, что вы не хотите использовать порт. Затем вам нужно указать, какой протокол (да, для этого нужен порт) вы хотите отслеживать (HTTP, VNC, SSH и т. Д.). Если вы хотите осуществлять мониторинг через ICMP, вы можете использовать подпроцесс и управлять параметрами пинга, количеством пингов, временем ожидания, размером и т. Д.

import subprocess 
    try:
        res = subprocess.Popen(['ping -t2 -c 4 110.10.0.254 &> /dev/null; echo $?'],shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
        out, err = res.communicate()
        out = out.rstrip()
        err = err.rstrip()
        print 'general.connectivity() Out: ' + out
        print 'general.connectivity() Err: ' + err
        if(out == "0"):
            print 'general.connectivity() Successful'
            return True     
        else:
            print 'general.connectivity() Failed'
            return False
    except Exception,e:
        print 'general.connectivity() Exception'
        return False

Если вы хотите сканер портов

import socket
from functools import partial
from multiprocessing import Pool
from multiprocessing.pool import ThreadPool
from errno import ECONNREFUSED

NUM_CORES = 4

def portscan(target,port):
    try:
        # Create Socket
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        socketTimeout = 5
        s.settimeout(socketTimeout)
        s.connect((target,port))
        print('port_scanner.is_port_opened() ' + str(port) + " is opened")
        return port
    except socket.error as err:
        if err.errno == ECONNREFUSED:
            return False

# Wrapper function that calls portscanner
def scan_ports(server=None,port=None,portStart=None,portEnd=None,**kwargs):
    p = Pool(NUM_CORES)
    ping_host = partial(portscan, server)
    if portStart and portStart:
        return filter(bool, p.map(ping_host, range(portStart, portStart)))
    else:
        return filter(bool, p.map(ping_host, range(port, port+1)))

# Check if port is opened
def is_port_opened(server=None,port=None, **kwargs):
    print('port_scanner.is_port_opened() Checking port...')
    try:
        # Add More proccesses in case we look in a range
        pool = ThreadPool(processes=1)
                     try:
                        ports = list(scan_ports(server=server,port=int(port)))
                        print("port_scanner.is_port_opened() Port scanner done.")
                        if len(ports)!=0:
                            print('port_scanner.is_port_opened() ' + str(len(ports)) + " port(s) available.")
                            return True
                        else:
                            print('port_scanner.is_port_opened() port not opened: (' + port  +')')
                            return False
                    except Exception, e:
                        raise

    except Exception,e:
        print e
        raise
0 голосов
/ 14 июня 2013

А как насчет попытки чего-то, что требует RPC, такого как команда 'tasklist' в сочетании с пингом?

0 голосов
/ 29 марта 2010

Многие брандмауэры настроены для отбрасывания пакетов ping без ответа. Кроме того, некоторые сетевые адаптеры будут отвечать на запросы проверки связи ICMP без ввода данных из сетевого стека операционной системы, что означает, что операционная система может быть недоступна, но хост все равно отвечает на запросы проверки связи (обычно вы заметите, если перезагрузите сервер, скажем , он начнет реагировать на эхо-запросы некоторое время, прежде чем операционная система начнет работать и начнут запускаться другие службы).

Единственный способ убедиться, что хост работает, - это попытаться подключиться к нему через какой-то известный порт (например, порт 80 веб-сервера).

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

0 голосов
/ 29 марта 2010

Лучшее, что вы можете сделать, это:

  • Попробуйте подключиться к известному порту (например, порт 80 или 443 для HTTP или HTTPS); или
  • Пинг на сайте. См. Пинг сайта в Python?

Многие сайты блокируют ICMP (протокол, используемый для проверки связи с сайтами), поэтому вы должны заранее знать, активирован ли данный хост или нет.

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

Это действительно все зависит от того, что вам нужно знать.

...