import sys
from scapy.all import sr1, ICMP, IP
from netaddr import IPNetwork
def ping_sweep(network, netmask):
live_hosts = []
total_hosts = 0
scanned_hosts = 0
ip_network = IPNetwork(network + '/' + netmask)
for host in ip_network.iter_hosts():
total_hosts += 1
for host in ip_network.iter_hosts():
scanned_hosts += 1
print(f"Scanning: {scanned_hosts}/{total_hosts}", end = "\r")
try:
response = sr1(IP(dst=str(host))/ICMP(), timeout=1, verbose=0)
if response is not None:
live_hosts.append(str(host))
print(f"Host {host} is online.")
except OSError as e:
print(f"An error occurred while scanning {host}: {e}", end = "\r")
return live_hosts
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage: python ping_sweep.py <network> <netmask>")
sys.exit(1)
network = sys.argv[1]
netmask = sys.argv[2]
live_hosts = ping_sweep(network, netmask)
print("\nCompleted")
print(f"Live hosts: {live_hosts}")
效果:
补充:
如果您有一个C类网络(例如 192.168.1.0
),并且您想要扫描整个网络,您可以使用默认的C类子网掩码 /24
。这意味着您的网络范围是 192.168.1.0/24
,包含 192.168.1.0
到 192.168.1.255
的所有IP地址。