답변:
이 기능은 모든 OS (Unix, Linux, macOS 및 Windows)
Python 2 및 Python 3에서 작동합니다.
편집 :
으로 @radato은 os.system
대체되었다 subprocess.call
. 이렇게하면 호스트 이름 문자열의 유효성이 검사되지 않는 경우 쉘 삽입 취약점 이 방지 됩니다.
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
Windows의 @ikrase에 따르면 오류가 발생 해도이 함수는 계속 반환 True
됩니다 Destination Host Unreachable
.
설명
이 명령은 ping
Windows 및 Unix 계열 시스템에 있습니다. (Windows) 또는 (Unix)
옵션 은이 예에서 1로 설정된 패킷 수를 제어합니다.-n
-c
platform.system()
플랫폼 이름을 반환합니다. 전의. 'Darwin'
macOS에서.
subprocess.call()
시스템 호출을 수행합니다. 전의. subprocess.call(['ls','-l'])
.
ping 8.8.8.8 -n 1
3)을 엽니 다 echo %ERRORLEVEL%
. 코드 : Python 코드의 마지막 줄을로 수정하십시오 return system_call(command)
. 제대로 연결되면 0이됩니다. 모뎀을 끈 상태에서 오류 코드가 표시되어야합니다. 물론 두 조건 모두 동일한 조건에서 동일한 오류 코드를 반환해야합니다.
Windows를 지원할 필요가없는 경우 Windows를 지원하는 간결한 방법은 다음과 같습니다.
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!'
연결이 실패하면 ping이 0이 아닌 값을 반환하기 때문에 작동합니다. (실제 값은 네트워크 오류에 따라 다릅니다.) '-t'옵션을 사용하여 핑 시간 초과 (초)를 변경할 수도 있습니다. 이것은 콘솔에 텍스트를 출력합니다.
response = os.system("ping -c 1 -w2 " + hostname + " > /dev/null 2>&1")
man ping
하십시오.
hostname
사용자로부터 문자열을 받으면 다음 과 같은 "url"을 제공하여 서버를 쉽게 해킹 할 수 있습니다 'google.com; rm -rf /*'
. subprocess.run(["ping", "-c", "1", hostname]).returncode
대신 사용하십시오 .
이를 수행 할 수있는 pyping 이라는 모듈 이 있습니다. 핍으로 설치 가능
pip install pyping
사용이 매우 간단하지만이 모듈을 사용할 때는 루트에서 원시 패킷을 작성한다는 사실 때문에 루트 액세스가 필요합니다.
import pyping
r = pyping.ping('google.com')
if r.ret_code == 0:
print("Success")
else:
print("Failed with {}".format(r.ret_code))
os.system('ping -c 1 -t 1 hostname')
솔루션을 사용하여 255 초 대신 1 초 안에 실행됩니다 . 또한 pyping
lib는 TCP / IP 소켓 라이브러리를 사용하는 것에 비해 사용이 매우 쉽습니다. pyping
내 생각에, 특히 TCP / IP 소켓 라이브러리 사용에 익숙하지 않은 경우 두 가지를 모두 사용하여 핑 프로그램을 작성했으며 훨씬 빠르고 사용하기 쉽습니다.
pip install ping3
import subprocess
ping_response = subprocess.Popen(["/bin/ping", "-c1", "-w100", "192.168.0.1"], stdout=subprocess.PIPE).stdout.read()
whereis ping
올바른 경로를 얻는 데 사용하십시오 .
ping_response = subprocess.Popen(["ping", hostname, "-n", '1'], stdout=subprocess.PIPE).stdout.read()
python3의 경우 매우 간단하고 편리한 python 모듈 ping3이 있습니다 : ( pip install ping3
, 루트 권한이 필요 합니다 ).
from ping3 import ping, verbose_ping
ping('example.com') # Returns delay in seconds.
>>> 0.215697261510079666
이 모듈을 사용하면 일부 매개 변수를 사용자 정의 할 수도 있습니다.
파이썬 프로그램을 버전 2.7 및 3.x와 Linux, Mac OS 및 Windows 플랫폼에서 보편적으로 사용하고 싶기 때문에 기존 예제를 수정해야했습니다.
# 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"))
False if platform.system().lower()=="windows" else True
당신은 물론 사용할 수도 있습니다 platform.system().lower() != "windows"
.
os.name!="nt"
작동 하지 않습니까? 분명히 모든 ver / 플랫폼 콤보에서 시도하지 않았습니다!
def ping(host): process = subprocess.Popen(["ping", "-n", "1",host], stdout=subprocess.PIPE, stderr=subprocess.PIPE) streamdata = process.communicate()[0] if 'unreachable' in str(streamdata): return 1 return process.returncode
unreachable
파이프에있는 경우 오히려 0을 반환 합니다. 아니요?
둘러 본 후 많은 수의 주소를 모니터링하도록 설계된 자체 핑 모듈을 작성했으며 비동기식이며 많은 시스템 리소스를 사용하지 않습니다. https://github.com/romana/multi-ping/에서 찾을 수 있습니다. Apache 라이센스가 부여되어 있으므로 프로젝트에서 원하는대로 사용할 수 있습니다.
내 자신을 구현하는 주요 이유는 다른 접근 방식의 제한 때문입니다.
#!/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()
파이핑 설치 확인 또는 pip install pyping 설치
#!/usr/bin/python
import pyping
response = pyping.ping('Your IP')
if response.ret_code == 0:
print("reachable")
else:
print("unreachable")
원시 ICMP 패킷을 전송하는 데 필요한 높은 권한으로 인해 프로그래밍 방식의 ICMP 핑이 복잡하고 ping
이진을 호출하기 가 어렵습니다. 서버 모니터링의 경우 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
내부적으로 이것은 단순히 대상 서버에 대한 TCP 연결을 설정하고 즉시 삭제하여 경과 시간을 측정합니다. 이 특정 구현은 닫힌 포트를 처리하지 않지만 자체 서버의 경우 잘 작동한다는 점에서 약간 제한적입니다.
나는 이것을 다음과 같이 해결한다 :
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" 은 핑이 올바른지 확인하는 방법입니다. 살루 도스
이 게시물의 답변에서 아이디어를 사용하지만 새로운 권장 하위 프로세스 모듈과 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)
True if condition else False
조건에 따라 True 또는 False를 반환하는 데 사용할 필요는 없습니다 . 그냥 사용 예 shell_needed = operating_sys == 'Windows'
와return success == 0
이 스크립트는 Windows에서 작동하며 다른 OS에서도 작동합니다. Windows, Debian 및 macosx에서 작동하며 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
비슷한 시나리오와 관련 하여이 질문을 찾았습니다. 나는 ping을 시도했지만 Naveen의 예제는 Python 2.7의 Windows에서 작동하지 않았습니다.
나를 위해 일한 예는 다음과 같습니다.
import pyping
response = pyping.send('Your IP')
if response['ret_code'] == 0:
print("reachable")
else:
print("unreachable")
pyping
표준 모듈이 아닌 것 같습니다. 아마도 당신은 링크를 제공 할 수 있습니까?
멀티 핑 ( pip install multiPing
)을 사용 하여이 간단한 코드를 만들었습니다 (원하는 경우 복사하여 붙여 넣기! ).
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
용법:
#Getting the latency average (in seconds) of host '192.168.0.123' using 10 samples
ping('192.168.0.123',10)
단일 샘플을 원하면 두 번째 매개 변수 "10
"를 무시할 수 있습니다!
그것이 도움이되기를 바랍니다!
내 핑 기능 버전 :
import platform, subprocess
def ping(host_or_ip, packets=1, timeout=1000):
''' Calls system "ping" command, returns True if ping succeeds.
Required parameter: host_or_ip (str, address of host to ping)
Optional parameters: packets (int, number of retries), timeout (int, ms to wait for response)
Does not show any output, either as popup window or in command line.
Python 3.5+, Windows and Linux compatible (Mac not tested, should work)
'''
# The ping command is the same for Windows and Linux, except for the "number of packets" flag.
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
자유롭게 사용하십시오.
충분히 단순 해 보이지만 나에게 적합했습니다. "icmp open socket operation not allowed"가 계속 표시되거나 서버가 오프라인 상태 인 경우 솔루션이 중단됩니다. 그러나 알고 싶은 것은 서버가 활성 상태이고 해당 서버에서 웹 서버를 실행하고 있다면 curl이 작업을 수행한다는 것입니다. ssh와 인증서가 있으면 ssh와 간단한 명령으로 충분합니다. 코드는 다음과 같습니다.
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
비슷한 요구 사항이 있었으므로 아래에 표시된 것처럼 구현했습니다. Windows 64 비트 및 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))
IP에 도달 할 수없는 경우 subprocess.check_output ()은 예외를 발생시킵니다. 출력 라인 'Packets : Sent = 2, Received = 2, Lost = 0 (0 % loss)'에서 정보를 추출하여 추가 검증을 수행 할 수 있습니다.
다음 은 기본 OS에서 제공하는 Python subprocess
모듈 및 ping
CLI 도구를 사용하는 솔루션 입니다. Windows 및 Linux에서 테스트되었습니다. 네트워크 시간 초과 설정을 지원합니다. 루트 권한이 필요하지 않습니다 (적어도 Windows 및 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
이것을 사용하면 파이썬 2.7에서 테스트되었으며 성공하면 핑 시간을 밀리 초 단위로 반환하고 실패하면 False를 반환합니다.
import platform,subproccess,re
def Ping(hostname,timeout):
if platform.system() == "Windows":
command="ping "+hostname+" -n 1 -w "+str(timeout*1000)
else:
command="ping -i "+str(timeout)+" -c 1 " + hostname
proccess = subprocess.Popen(command, stdout=subprocess.PIPE)
matches=re.match('.*time=([0-9]+)ms.*', proccess.stdout.read(),re.DOTALL)
if matches:
return matches.group(1)
else:
return False
많은 답변이 놓친 것 중 하나는 (적어도 Windows에서는) ping
에서는" "대상 호스트에 연결할 수 없음"응답이 수신되면 명령이 0 (성공을 나타냄)을 반환한다는 것입니다.
다음은 b'TTL='
핑이 호스트에 도달했을 때만 존재하기 때문에 응답에 있는지 확인하는 코드입니다 . 참고 :이 코드의 대부분은 다른 답변을 기반으로합니다.
import platform
import subprocess
def ping(ipAddr, timeout=100):
'''
Send a ping packet to the specified host, using the system ping command.
Accepts ipAddr as string for the ping destination.
Accepts timeout in ms for the ping timeout.
Returns True if ping succeeds otherwise Returns False.
Ping succeeds if it returns 0 and the output includes b'TTL='
'''
if platform.system().lower() == 'windows':
numFlag = '-n'
else:
numFlag = '-c'
completedPing = subprocess.run(['ping', numFlag, '1', '-w', str(timeout), ipAddr],
stdout=subprocess.PIPE, # Capture standard out
stderr=subprocess.STDOUT) # Capture standard error
# print(completedPing.stdout)
return (completedPing.returncode == 0) and (b'TTL=' in completedPing.stdout)
print(ping('google.com'))
참고 : 출력을 인쇄하는 대신 출력을 캡처하므로의 출력을 보려면 반환하기 전에 ping
인쇄해야합니다 completedPing.stdout
.
WINDOWS 만 해당-아무도 금방 열릴 수 없음 Win32_PingStatus 간단한 WMI 쿼리를 사용하여 무료로 정말 자세한 정보로 가득 찬 개체를 반환합니다.
import wmi
# new WMI object
c = wmi.WMI()
# here is where the ping actually is triggered
x = c.Win32_PingStatus(Address='google.com')
# how big is this thing? - 1 element
print 'length x: ' ,len(x)
#lets look at the object 'WMI Object:\n'
print x
#print out the whole returned object
# only x[0] element has values in it
print '\nPrint Whole Object - can directly reference the field names:\n'
for i in x:
print i
#just a single field in the object - Method 1
print 'Method 1 ( i is actually x[0] ) :'
for i in x:
print 'Response:\t', i.ResponseTime, 'ms'
print 'TTL:\t', i.TimeToLive
#or better yet directly access the field you want
print '\npinged ', x[0].ProtocolAddress, ' and got reply in ', x[0].ResponseTime, 'ms'
더 빠른 핑 스윕이 필요했고 외부 라이브러리를 사용하고 싶지 않았으므로 내장을 사용하여 동시성을 사용하기로 결정했습니다 asyncio
.
이 코드에는 python 3.7 이상이 필요 하며 Linux 에서만 작성되고 테스트되었습니다 . Windows에서는 작동하지 않지만 Windows에서 작동하도록 쉽게 변경할 수 있습니다.
나는 전문가가 asyncio
아니지만이 위대한 기사 동시성으로 파이썬 프로그램 속도 향상 향상을 사용했으며 이러한 코드 줄을 생각해 냈습니다. 가능한 한 간단하게 만들려고 했으므로 필요에 맞게 코드를 더 추가해야 할 가능성이 큽니다.
true 또는 false를 반환하지 않습니다. Ping 요청에 응답하는 IP를 인쇄하는 것이 더 편리하다고 생각했습니다. 꽤 빠르다고 생각합니다. 핑거의 10 초 안에 255 ips를 .
#!/usr/bin/python3
import asyncio
async def ping(host):
"""
Prints the hosts that respond to ping request
"""
ping_process = await asyncio.create_subprocess_shell("ping -c 1 " + host + " > /dev/null 2>&1")
await ping_process.wait()
if ping_process.returncode == 0:
print(host)
return
async def ping_all():
tasks = []
for i in range(1,255):
ip = "192.168.1.{}".format(i)
task = asyncio.ensure_future(ping(ip))
tasks.append(task)
await asyncio.gather(*tasks, return_exceptions = True)
asyncio.run(ping_all())
샘플 출력 :
192.168.1.1
192.168.1.3
192.168.1.102
192.168.1.106
192.168.1.6
IP는 응답하자마자 인쇄되기 때문에 IP가 순서대로 정렬되지 않으므로 먼저 응답 한 IP가 먼저 인쇄됩니다.
1 #!/usr/bin/python
2
3 import os
4 import sys
5 import time
6
7 os.system("clear")
8 home_network = "172.16.23."
9 mine = []
10
11 for i in range(1, 256):
12 z = home_network + str(i)
13 result = os.system("ping -c 1 "+ str(z))
14 os.system("clear")
15 if result == 0:
16 mine.append(z)
17
18 for j in mine:
19 print "host ", j ," is up"
icmplib를 사용하면 아래의 루트 권한이 필요합니다. HTH