Di Python, apakah ada cara untuk melakukan ping ke server melalui ICMP dan mengembalikan TRUE jika server merespon, atau FALSE jika tidak ada respon?
Jika anda don't perlu dukungan Windows, berikut ini's benar-benar ringkas cara untuk melakukannya:
import os
hostname = "google.com" #example
response = os.system("ping -c 1 " + hostname)
#and then check the response...
if response == 0:
print hostname, 'is up!'
else:
print hostname, 'is down!'
Ini bekerja karena ping kembali nilai non-nol jika koneksi gagal. (Mengembalikan nilai yang benar-benar berbeda tergantung pada kesalahan jaringan.) Anda juga bisa mengubah ping timeout (dalam detik) dengan menggunakan ' t' pilihan. Catatan, ini akan menampilkan teks ke console.
Fungsi ini bekerja di salah OS (Unix, Linux, macOS, dan Windows) Python 2 dan Python 3
SUNTINGAN:
Oleh @radato os.sistem
digantikan oleh subproses.panggilan
.
Oleh @Boris dokumentasi merekomendasikan menggunakan subproses.run()
jika anda're menggunakan Python 3.5+.
import platform # For getting the operating system name
import subprocess # For executing a shell command
def ping(host):
"""
Returns True if host (str) responds to a ping request.
Remember that a host may not respond to a ping (ICMP) request even if the host name is valid.
"""
# Option for the number of packets as a function of
param = '-n' if platform.system().lower()=='windows' else '-c'
# Building the command. Ex: "ping -c 1 google.com"
command = ['ping', param, '1', host]
return subprocess.call(command) == 0
Perhatikan bahwa, menurut @ikrase pada Windows fungsi ini masih akan mengembalikan True
jika anda mendapatkan Destination Host Unreachable
kesalahan.
Penjelasan
Perintah ping
di kedua Windows dan Unix-seperti sistem.
Opsi -n
(Windows) atau -c
(Unix) kontrol jumlah paket yang dalam contoh ini adalah set ke 1.
platform.sistem()
kembali platform nama. Ex. 'Darwin'
pada macOS.
subproses.call()
melakukan system call. Ex. subproses.panggilan(['ls','-l'])
.
Ada modul yang disebut pyping yang dapat melakukan hal ini. Hal ini dapat diinstal dengan pip
pip install pyping
Hal ini cukup sederhana untuk digunakan, namun, ketika menggunakan modul ini, anda perlu akses root karena fakta bahwa itu adalah kerajinan baku paket-paket di bawah tenda.
import pyping
r = pyping.ping('google.com')
if r.ret_code == 0:
print("Success")
else:
print("Failed with {}".format(r.ret_code))
Karena saya ingin punya Python program universal pada versi 2.7 dan 3.x dan pada platform Linux, Mac OS dan Windows, saya harus memodifikasi yang sudah ada contoh.
# shebang does not work over all platforms
# ping.py 2016-02-25 Rudolf
# subprocess.call() is preferred to os.system()
# works under Python 2.7 and 3.4
# works under Linux, Mac OS, Windows
def ping(host):
"""
Returns True if host responds to a ping request
"""
import subprocess, platform
# Ping parameters as function of OS
ping_str = "-n 1" if platform.system().lower()=="windows" else "-c 1"
args = "ping " + " " + ping_str + " " + host
need_sh = False if platform.system().lower()=="windows" else True
# Ping
return subprocess.call(args, shell=need_sh) == 0
# test call
print(ping("192.168.17.142"))
#!/usr/bin/python3
import subprocess as sp
def ipcheck():
status,result = sp.getstatusoutput("ping -c1 -w2 " + str(pop))
if status == 0:
print("System " + str(pop) + " is UP !")
else:
print("System " + str(pop) + " is DOWN !")
pop = input("Enter the ip address: ")
ipcheck()
Setelah mencari-cari, akhirnya saya menulis saya sendiri ping modul, yang dirancang untuk memantau jumlah yang besar dari alamat, asynchronous dan doesn't menggunakan banyak sumber daya sistem. Anda dapat menemukannya di sini: https://github.com/romana/multi-ping/ It's Apache lisensi, sehingga anda dapat menggunakannya dalam proyek anda dengan cara apapun yang anda lihat cocok.
Alasan utama untuk mengimplementasikan saya sendiri adalah pembatasan dari pendekatan-pendekatan lain:
Untuk python3 ada's sangat sederhana dan nyaman modul python ping3: (pip menginstal ping3)
.
from ping3 import ping, verbose_ping
ping('example.com') # Returns delay in seconds.
>>> 0.215697261510079666
Modul ini memungkinkan untuk kustomisasi dari beberapa parameter serta.
Aku menyelesaikan ini dengan:
def ping(self, host):
res = False
ping_param = "-n 1" if system_name().lower() == "windows" else "-c 1"
resultado = os.popen("ping " + ping_param + " " + host).read()
if "TTL=" in resultado:
res = True
return res
"TTL" adalah cara untuk mengetahui jika ping dengan benar. Saludos
Program ICMP ping lebih rumit karena hak tinggi yang diperlukan untuk mengirim baku paket ICMP, dan memanggil ping
biner adalah jelek. Untuk monitoring server, anda dapat mencapai hasil yang sama dengan menggunakan teknik yang disebut TCP ping:
# pip3 install tcping
>>> from tcping import Ping
# Ping(host, port, timeout)
>>> ping = Ping('212.69.63.54', 22, 60)
>>> ping.ping(3)
Connected to 212.69.63.54[:22]: seq=1 time=23.71 ms
Connected to 212.69.63.54[:22]: seq=2 time=24.38 ms
Connected to 212.69.63.54[:22]: seq=3 time=24.00 ms
Secara internal, ini hanya menetapkan koneksi TCP ke server target dan turun segera, mengukur waktu yang telah berlalu. Ini implementasi tertentu adalah sedikit terbatas dalam hal itu doesn't menangani port yang tertutup tetapi untuk server anda sendiri bekerja dengan cukup baik.
Saya pengurangan menggunakan ide-ide dari jawaban di posting ini, tetapi hanya menggunakan yang lebih baru direkomendasikan subproses modul dan python3:
import subprocess
import platform
operating_sys = platform.system()
nas = '192.168.0.10'
def ping(ip):
# ping_command = ['ping', ip, '-n', '1'] instead of ping_command = ['ping', ip, '-n 1'] for Windows
ping_command = ['ping', ip, '-n', '1'] if operating_sys == 'Windows' else ['ping', ip, '-c 1']
shell_needed = True if operating_sys == 'Windows' else False
ping_output = subprocess.run(ping_command,shell=shell_needed,stdout=subprocess.PIPE)
success = ping_output.returncode
return True if success == 0 else False
out = ping(nas)
print(out)
Versi saya ping fungsi:
def ping(host_or_ip, paket=1, timeout=1000): ''' Panggilan sistem "ping" perintah, mengembalikan True jika ping berhasil. Parameter yang dibutuhkan: host_or_ip (str, alamat host untuk melakukan ping) Parameter opsional: paket (int, jumlah pengulangan), timeout (int, ms untuk menunggu respon) Tidak menunjukkan output, baik sebagai jendela popup atau di command line. Python 3.5+, Windows dan Linux yang kompatibel (Mac tidak diuji, harus bekerja) '''
if platform.system().lower() == 'windows':
command = ['ping', '-n', str(packets), '-w', str(timeout), host_or_ip]
# run parameters: capture output, discard error messages, do not show window
result = subprocess.run(command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, creationflags=0x08000000)
# 0x0800000 is a windows-only Popen flag to specify that a new process will not create a window.
# On Python 3.7+, you can use a subprocess constant:
# result = subprocess.run(command, capture_output=True, creationflags=subprocess.CREATE_NO_WINDOW)
# On windows 7+, ping returns 0 (ok) when host is not reachable; to be sure host is responding,
# we search the text "TTL=" on the command output. If it's there, the ping really had a response.
return result.returncode == 0 and b'TTL=' in result.stdout
else:
command = ['ping', '-c', str(packets), '-w', str(timeout), host_or_ip]
# run parameters: discard output and error messages
result = subprocess.run(command, stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
return result.returncode == 0
`` Merasa bebas untuk menggunakannya sebagai anda akan.
Script ini bekerja pada Windows, dan harus bekerja pada Os lainnya : Ia bekerja pada Windows, Debian, dan macosx, perlu tes pada solaris.
import os
import platform
def isUp(hostname):
giveFeedback = False
if platform.system() == "Windows":
response = os.system("ping "+hostname+" -n 1")
else:
response = os.system("ping -c 1 " + hostname)
isUpBool = False
if response == 0:
if giveFeedback:
print hostname, 'is up!'
isUpBool = True
else:
if giveFeedback:
print hostname, 'is down!'
return isUpBool
print(isUp("example.com")) #Example domain
print(isUp("localhost")) #Your computer
print(isUp("invalid.example.com")) #Unresolvable hostname: https://tools.ietf.org/html/rfc6761
print(isUp("192.168.1.1")) #Pings local router
print(isUp("192.168.1.135")) #Pings a local computer - will differ for your network
Akhirnya saya menemukan pertanyaan ini mengenai skenario yang sama. Aku mencoba pyping tapi contoh yang diberikan oleh Naveen didn't bekerja untuk saya di Windows di bawah Python 2.7.
Contoh yang bekerja untuk saya adalah:
import pyping
response = pyping.send('Your IP')
if response['ret_code'] == 0:
print("reachable")
else:
print("unreachable")
Menggunakan Multi-ping (pip menginstal multiPing
) saya membuat ini sederhana kode (cukup copy dan paste jika anda akan!):
from multiping import MultiPing
def ping(host,n = 0):
if(n>0):
avg = 0
for i in range (n):
avg += ping(host)
avg = avg/n
# Create a MultiPing object to test hosts / addresses
mp = MultiPing([host])
# Send the pings to those addresses
mp.send()
# With a 1 second timout, wait for responses (may return sooner if all
# results are received).
responses, no_responses = mp.receive(1)
for addr, rtt in responses.items():
RTT = rtt
if no_responses:
# Sending pings once more, but just to those addresses that have not
# responded, yet.
mp.send()
responses, no_responses = mp.receive(1)
RTT = -1
return RTT
Penggunaan:
#Getting the latency average (in seconds) of host '192.168.0.123' using 10 samples
ping('192.168.0.123',10)
Jika anda ingin satu sampel, parameter kedua "10
" dapat diabaikan!
Harap ini membantu!
Berikut ini's solusi menggunakan Python's subproses
modul ping
CLI alat yang disediakan oleh OS yang mendasari. Diuji pada Windows dan Linux. Dukungan pengaturan jaringan batas waktu. Doesn't membutuhkan hak akses root (setidaknya pada Windows dan Linux).
import platform
import subprocess
def ping(host, network_timeout=3):
"""Send a ping packet to the specified host, using the system "ping" command."""
args = [
'ping'
]
platform_os = platform.system().lower()
if platform_os == 'windows':
args.extend(['-n', '1'])
args.extend(['-w', str(network_timeout * 1000)])
elif platform_os in ('linux', 'darwin'):
args.extend(['-c', '1'])
args.extend(['-W', str(network_timeout)])
else:
raise NotImplemented('Unsupported OS: {}'.format(platform_os))
args.append(host)
try:
if platform_os == 'windows':
output = subprocess.run(args, check=True, universal_newlines=True).stdout
if output and 'TTL' not in output:
return False
else:
subprocess.run(args, check=True)
return True
except (subprocess.CalledProcessError, subprocess.TimeoutExpired):
return False
Aku punya kebutuhan yang sama jadi saya menerapkan hal itu seperti yang ditunjukkan di bawah ini. Hal ini diuji pada Windows 64 bit dan Linux.
import subprocess
def systemCommand(Command):
Output = ""
Error = ""
try:
Output = subprocess.check_output(Command,stderr = subprocess.STDOUT,shell='True')
except subprocess.CalledProcessError as e:
#Invalid command raises this exception
Error = e.output
if Output:
Stdout = Output.split("\n")
else:
Stdout = []
if Error:
Stderr = Error.split("\n")
else:
Stderr = []
return (Stdout,Stderr)
#in main
Host = "ip to ping"
NoOfPackets = 2
Timeout = 5000 #in milliseconds
#Command for windows
Command = 'ping -n {0} -w {1} {2}'.format(NoOfPackets,Timeout,Host)
#Command for linux
#Command = 'ping -c {0} -w {1} {2}'.format(NoOfPackets,Timeout,Host)
Stdout,Stderr = systemCommand(Command)
if Stdout:
print("Host [{}] is reachable.".format(Host))
else:
print("Host [{}] is unreachable.".format(Host))
Ketika IP tidak terjangkau subproses.check_output() menimbulkan pengecualian. Tambahan verifikasi dapat dilakukan dengan penggalian informasi dari output line 'Packets: Sent = 2, yang Diterima = 2, Lost = 0 (0% loss)'.
Tampaknya cukup sederhana, tapi memberi saya cocok. Aku terus mendapatkan "icmp open socket operasi tidak diizinkan" atau solusi akan menutup jika server sedang off line. Jika, namun, apa yang anda ingin tahu adalah bahwa server hidup dan anda menjalankan sebuah web server pada server, maka curl akan melakukan pekerjaan. Jika anda memiliki ssh dan sertifikat, maka ssh dan perintah sederhana akan cukup. Berikut ini adalah kode:
from easyprocess import EasyProcess # as root: pip install EasyProcess
def ping(ip):
ping="ssh %s date;exit"%(ip) # test ssh alive or
ping="curl -IL %s"%(ip) # test if http alive
response=len(EasyProcess(ping).call(timeout=2).stdout)
return response #integer 0 if no response in 2 seconds