编写一个脚本test_ip.py
实现指定参数的远程主机网络探测
python test_ip.py 192.168.0.10 192.168.0.100
针对192.168.0.10~192.168.0.100范围内所有主机进行网络探测
代码实现
import sys # 导入 sys 模块,用于访问与 Python 解释器相关的变量和函数。
import subprocess #导入 subprocess 模块,用于创建新的进程、连接其输入/输出/错误管道,并获取返回码。
def ping(host): #定义一个名为 ping 的函数,接受一个参数 host(表示要探测的主机 IP 地址)。
try: #开始一个异常处理块。
output = subprocess.run(['ping', '-c', '1', host], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
#执行 ping 命令,发送一个 ICMP Echo Request 数据包到指定的主机。
# stdout=subprocess.PIPE 和 stderr=subprocess.PIPE
#将标准输出和标准错误重定向到管道,以便稍后读取。
if output.returncode == 0:
#检查 ping 命令的返回码。如果返回码为 0,表示 ping 成功,主机可达。
return True
except Exception as e:
#捕获所有异常
print(f"Error pinging {host}: {e}")
#打印错误信息,包括哪个主机出错以及具体的错误信息。
return False
def generate_ip_range(start_ip, end_ip):
start = list(map(int, start_ip.split('.')))
#将起始 IP 地址按点分割成四个部分,并将每个部分转换为整数,存储在列表 start 中。
end = list(map(int, end_ip.split('.')))
#将结束 IP 地址按点分割成四个部分,并将每个部分转换为整数,存储在列表 end 中。
temp = start
#初始化临时变量 temp,将其设置为起始 IP 地址的整数列表。
ip_range = []
#初始化空列表 ip_range,用于存储生成的 IP 地址。
while temp <= end:
ip_range.append(".".join(map(str, temp)))
#将当前 temp 列表中的整数转换为字符串,并用点连接成一个 IP 地址字符串,添加到 ip_range 列表中。
temp[3] += 1
for i in (3, 2, 1):
if temp[i] == 256:
temp[i] = 0
temp[i - 1] += 1
return ip_range
def main():
start_ip = input("输入起始IP地址: ")
#提示用户输入起始 IP 地址,并将其存储在变量 start_ip 中。
end_ip = input("输入结束IP地址: ")
#提示用户输入结束 IP 地址,并将其存储在变量 end_ip 中。
ip_range = generate_ip_range(start_ip, end_ip)
#调用 generate_ip_range 函数生成指定范围内的 IP 地址列表,并将其存储在变量 ip_range 中。
for ip in ip_range:
#遍历生成的 IP 地址列表。
is_reachable = ping(ip)
status = "Reachable" if is_reachable else "Unreachable"
print(f"{ip}: {status}")
if __name__ == "__main__":
#保只有在直接运行脚本时才执行 main() 函数。如果脚本被作为模块导入,则不会执行 main()。
main()