回答
你能做的最好的是:
- 嘗試和已知的端口(如端口80或443連接的HTTP或HTTPS );或
- Ping該網站。見Ping a site in Python?
許多網站封鎖ICMP(用來ping網站portocol),所以你必須事先知道,如果有問題的主機有它啓用。
連接到端口會告訴您混合的信息。這真的取決於你想知道什麼。一個端口可能會打開,但該網站已被有效掛起,因此您可能會得到誤報。更嚴格的方法可能涉及使用HTTP庫來針對網站執行Web請求,並查看您是否收到響應。
這一切都取決於你需要知道的。
許多防火牆配置爲丟棄ping數據包而不作出響應。此外,一些網絡適配器會響應ICMP ping請求,而無需從操作系統網絡堆棧輸入數據,這意味着操作系統可能關閉,但主機仍然響應ping(通常您會注意到如果重新啓動服務器,請說,在操作系統啓動並啓動其他服務之前,它會開始響應ping一段時間)。
確定主機啓動的唯一方法是實際嘗試通過一些衆所周知的端口(例如Web服務器端口80)連接到主機。
爲什麼你需要知道主機是否「啓動」,也許有更好的方法來做到這一點。
協議級PING是最好的,即連接到服務器並以一種無法實際工作的方式與服務器交互。這是因爲這是唯一確保服務已啓動的真正方法。一個ICMP ECHO(a.k.a. ping)只會告訴你另一端的網絡接口已經打開,即使這樣也可能被阻塞; FWIW,我見過所有用戶進程都被磚砌的機器,但仍然可以ping通。在應用服務器的這些日子裏,即使獲得網絡連接也可能不夠;如果託管的應用程序關閉或無法使用,該怎麼辦?正如我所說的,談論你感興趣的實際服務是否是最好的,最可靠的方法。
如何嘗試一些需要像「tasklist」命令和ping一樣的RPC?
我會使用端口掃描儀。原始問題指出你不想使用端口。然後,您需要指定要監控的協議(是,需要端口)(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
這個工作對我罰款:
HOST_UP = True if os.system("ping -c 1 " + SOMEHOST) is 0 else False
- 1. 我如何檢查遠程機器是否啓動?
- 2. 如何瞭解遠程Linux機器是否已啓動?
- 3. 如何檢查IntentService是否已啓動
- 4. 檢查網址是否已啓動?
- 5. python:檢查主機名是否已解決
- 6. 用ssh檢查遠程主機上是否存在文件
- 7. 如何檢查進程是否遠程啓動
- 8. WCF客戶端檢查WCF主機是否啓動並運行?
- 9. c#重新啓動遠程機器,主機名是文本框
- 10. 檢查mysql連接到遠程主機
- 11. Android:檢查過程是否已完成啓動其他
- 12. Linux腳本來檢查進程是否已啓動
- 13. 檢查啓動文件夾是否已經包含程序
- 14. 如何知道應用程序池是否已遠程啓動?
- 15. 先從Rails站點本地主機或遠程主機啓動?
- 16. 啓動前檢查遠程計算機上的進程
- 17. 如何檢查遠程Oracle服務器已啓動並運行
- 18. 檢查應用程序啓動時是否插入了耳機
- 19. 如何檢查SeAssignPrimaryTokenPrivilege是否已啓用?
- 20. 檢查斷言是否已啓用
- 21. 檢查藍牙是否已啓用
- 22. 如何檢查NumLock是否已啓用
- 23. 是否有Python函數檢查發生器是否啓動?
- 24. 檢查耳機是否已插入
- 25. Nant - 檢查遠程共享是否已存在
- 26. 如何檢查XBOX控制檯是否已打開? (遠程)
- 27. 檢查遠程文件是否已更改
- 28. 如何檢查Firebase是否已遠程更新?
- 29. 如何檢查遠程主機上的文件是否存在與shell腳本
- 30. 使用Reachability檢查遠程主機的可用性是否明智?
你能舉個例子嗎?你可以遍歷給定主機的所有端口(或者至少是公共端口),但是它開始與黑帽子交界。 – 2010-03-28 23:43:26
從快速瀏覽答案我可以得出結論,你的問題有些模糊。如果您還說明您的最終/高級目標是什麼,您可能會得到更好的答案。你想監視一個服務的可用性還是你想寫一些網絡安全檢查工具,發現主機是「up」? – paprika 2010-03-29 00:24:54