使用Python执行ping命令


一、单ping

import subprocess  # 导入subprocess模块,用于执行系统命令
import time  # 导入time模块,用于控制程序运行时间
import threading  # 导入threading模块,用于创建线程

def ping(host, count=4):  # 定义ping函数,接收两个参数:host和count,默认count为4
    cmd = f"ping {host} -n {count}"  # 拼接ping命令字符串
    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)  # 执行ping命令,并获取输出结果
    return process  # 返回执行结果

def main():  # 定义主函数
    host = "114.114.114.114"  # 设置要ping的主机地址
    count = 1000  # 设置ping的次数
    process = ping(host, count)  # 调用ping函数,执行ping操作

    def stop_process():  # 定义停止进程的函数
        time.sleep(5)  # 等待5秒
        process.terminate()  # 终止进程

    thread = threading.Thread(target=stop_process)  # 创建线程,指定目标函数为stop_process
    thread.start()  # 启动线程

    stdout, stderr = process.communicate()  # 获取进程的输出结果
    print(stdout.decode('gbk'))  # 打印输出结果

if __name__ == "__main__":  # 如果当前脚本是主程序
    main()  # 调用主函数

二、多ping

import subprocess  # 导入subprocess模块,用于执行系统命令
import threading   # 导入threading模块,用于创建和管理线程

def ping_ip(ip):
    """
    定义一个函数ping_ip,接收一个IP地址作为参数,使用ping命令检查该IP是否可达。
    如果ping成功,打印"{ip}通";如果失败,打印"{ip}不通"。
    """
    try:
        response = subprocess.check_output(['ping', '-c', '4', ip])  # 尝试执行ping命令,发送4个数据包
        print(f"{ip}通")  # 如果ping成功,打印IP地址和"通"
    except subprocess.CalledProcessError:
        print(f"{ip} 不通")  # 如果ping失败,捕获异常并打印IP地址和"不通"

ips = ['61.54.228.146','61.54.288.147','61.54.228.148','61.54.228.149','61.54.228.150','61.54.228.154','61.54.228.155','61.54.228.156','61.54.228.157','61.54.228.158',]

threads = []  # 创建一个空列表,用于存储线程对象
for ip in ips:
    t = threading.Thread(target=ping_ip, args=(ip,))  # 为每个IP地址创建一个线程,目标函数为ping_ip
    threads.append(t)  # 将线程对象添加到列表中
    t.start()  # 启动线程

for t in threads:
    t.join()  # 等待所有线程完成

### 实现 Python 中的 Ping 功能 为了在 Python 中实现基本的 `ping` 功能,可以利用内置库如 `subprocess` 或者第三方库如 `scapy`. 使用这些工具能够发送 ICMP 请求并接收响应。 #### 方法一:使用 subprocess 库调用系统命令 通过 `subprocess.run()` 函数执行系统的 ping 命令来获取目标主机的状态: ```python import subprocess def ping(host): result = subprocess.run(['ping', '-c', '4', host], capture_output=True, text=True) if result.returncode == 0: print(f"Ping successful to {host}") print(result.stdout) else: print(f"Failed to ping {host}") print(result.stderr) # 调用函数测试网络连接情况 ping('google.com') ``` 这种方法简单易行,适用于大多数场景下的快速检测[^1]. #### 方法二:基于 Scapy 的自定义 ICMP Echo Request 发送器 如果希望更深入控制请求细节,则可考虑安装 scapy 并编写如下代码片段: 首先需确保已安装Scapy模块 (`pip install scapy`) ,之后按照下面的方式构建ICMP包并向指定地址发起探测: ```python from scapy.all import * conf.verb = 0 # 关闭冗余输出信息 def custom_ping(target_ip): packet = IP(dst=target_ip)/ICMP() reply = sr1(packet, timeout=2) # 设置超时时间为两秒 if reply is None: print("No response from", target_ip) elif reply.getlayer(ICMP).type == 0: # 类型为0表示回显应答报文 print(target_ip, "is alive!") custom_ping('8.8.8.8') # 测试公共DNS服务器可达性 ``` 此方法提供了更大的灵活性,允许开发者调整更多参数以适应特定需求.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十一的学习笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值