2015-01-11 3 views
2

Я хочу свистеть диапазон IP-адресов в Python и печати либо: «IP-достижим с X% потери процентов пакета» или «IP-не достижимы с X% потерь пакетов»Python: Как выполнить ping диапазон IP-адресов?

Диапазон, который я хочу попробовать, это 192.168.0.X, где X - диапазон 0-255

Вот мой код;

import shlex 
import subprocess 
import os 

for x in range(0, 256): 
    cmd=shlex.split("ping -cl 192.168.0." + str(x)) 
    try: 
     output = subprocess.check_output(cmd) 
    except subprocess.CalledProcessError,e: 
     #Will print the command failed with its exit status 
     print "The IP {0} isn't reachable".format(cmd[-1]) 
    else: 
     print "The IP {0} is reachable".format(cmd[-1]) 

Что не так с моим кодом? также я заметил, что когда я пытаюсь выполнить команду «ping -cl 192.168.0.2», она говорит, что -cl - это только команда администратора. Я администратор на своем компьютере, и я запускал cmd как admin, так что не так?

Я использую Windows, 8.1 Python v2.7.9

+0

какая у вас операционная система? Если вы только в группе под названием «admin», этого недостаточно. вы должны быть 'root', чтобы контролировать скорость отправки пакетов ping, потому что ping может быть неправильно использован для наводнения других хостов. – stefreak

+0

my os is Windows 8.1 –

ответ

1

Если вы используете Linux, и вы просто хотите, чтобы увидеть потерю пакетов:

import shlex 
from subprocess import PIPE, Popen 


cmd1 = shlex.split("grep -oP '\d+(?=% packet loss)'") 
for x in range(1, 256): 
    cmd = "ping -c 4 192.168.43.{}".format(x).split() 
    p1 = Popen(cmd, stdout=PIPE, stderr=PIPE) 
    p2 = Popen(cmd1, stdin=p1.stdout, stdout=PIPE) 
    p1.stdout.close() 
    output = p2.communicate()[0].rstrip() 
    if output == "100": 
     print("{}% percent packet loss from unreachable ip {}".format(output, cmd[-1])) 
    else: 
     print("{}% percent packet loss from reachable ip {}".format(output, cmd[-1])) 

Отказ от ответственности Я не использую окна так, я открыт для коррекции, но это может работать:

for x in range(1, 256): 
    cmd = "ping -c 1 192.168.43.{}".format(x).split() 
    p1 = Popen(cmd, stdout=PIPE, stderr=PIPE) 
    lines = p1.communicate()[0].splitlines() 
    output = (lines[-2]).rsplit(None,5) 
    output = output[-5].rstrip() 
    if output == "100%": 
     print("{} percent packet loss from unreachable ip {}".format(output, cmd[-1])) 
    else: 
     print("{} percent packet loss from reachable ip {}".format(output, cmd[-1])) 
+0

Спасибо за ваш ответ! Определенно полезно, но я на windows 8.1 –

+0

не беспокоится, если вы делаете много связанных с сетью кодирования, python-nmap будет хорошим способом. Я не использую окна, но вы можете просто использовать первую команду и p1 и получить из нее вывод связи, вы можете легко разделить выведенную строку, чтобы получить нужные вам данные. –

+0

@NathanielSharp. Я добавил альтернативный метод без Grep. Пойдем и посмотрим, как это работает, вам придется изменить команду раскалывания и пинга в соответствии с выводами окон –

0

Если вы установили модуль scapy вы должны попробовать использовать:

clients = arping("192.168.1.*") 
print clients 

Быстро и также распечатает адрес mac, связанный с ip, поэтому он очень полезен.

Смежные вопросы