2010-03-28 33 views
4

如何檢查遠程主機是否啓動而沒有端口號?有沒有其他方法可以使用常規ping來檢查其他方式。檢查遠程主機是否已啓動Python

有一種可能性,即遠程主機可能會下降ping包

+0

你能舉個例子嗎?你可以遍歷給定主機的所有端口(或者至少是公共端口),但是它開始與黑帽子交界。 – 2010-03-28 23:43:26

+2

從快速瀏覽答案我可以得出結論,你的問題有些模糊。如果您還說明您的最終/高級目標是什麼,您可能會得到更好的答案。你想監視一個服務的可用性還是你想寫一些網絡安全檢查工具,發現主機是「up」? – paprika 2010-03-29 00:24:54

回答

0

你能做的最好的是:

  • 嘗試和已知的端口(如端口80或443連接的HTTP或HTTPS );或
  • Ping該網站。見Ping a site in Python?

許多網站封鎖ICMP(用來ping網站portocol),所以你必須事先知道,如果有問題的主機有它啓用。

連接到端口會告訴您混合的信息。這真的取決於你想知道什麼。一個端口可能會打開,但該網站已被有效掛起,因此您可能會得到誤報。更嚴格的方法可能涉及使用HTTP庫來針對網站執行Web請求,並查看您是否收到響應。

這一切都取決於你需要知道的。

0

許多防火牆配置爲丟棄ping數據包而不作出響應。此外,一些網絡適配器會響應ICMP ping請求,而無需從操作系統網絡堆棧輸入數據,這意味着操作系統可能關閉,但主機仍然響應ping(通常您會注意到如果重新啓動服務器,請說,在操作系統啓動並啓動其他服務之前,它會開始響應ping一段時間)。

確定主機啓動的唯一方法是實際嘗試通過一些衆所周知的端口(例如Web服務器端口80)連接到主機。

爲什麼你需要知道主機是否「啓動」,也許有更好的方法來做到這一點。

1

協議級PING是最好的,即連接到服務器並以一種無法實際工作的方式與服務器交互。這是因爲這是唯一確保服務已啓動的真正方法。一個ICMP ECHO(a.k.a. ping)只會告訴你另一端的網絡接口已經打開,即使這樣也可能被阻塞; FWIW,我見過所有用戶進程都被磚砌的機器,但仍然可以ping通。在應用服務器的這些日子裏,即使獲得網絡連接也可能不夠;如果託管的應用程序關閉或無法使用,該怎麼辦?正如我所說的,談論你感興趣的實際服務是否是最好的,最可靠的方法。

0

如何嘗試一些需要像「tasklist」命令和ping一樣的RPC?

0

我會使用端口掃描儀。原始問題指出你不想使用端口。然後,您需要指定要監控的協議(是,需要端口)(HTTP,VNC,SSH等)。如果你想通過ICMP進行監控,你可以使用子進程和控制ping參數,ping的數量,超時,大小等。

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 
8

這個工作對我罰款:

HOST_UP = True if os.system("ping -c 1 " + SOMEHOST) is 0 else False 
相關問題