V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
uti6770werty
V2EX  ›  Python

只是测试 IP 地址存活状态,是否有好轮子?(os.system 使用系统的 ping 不算)

  •  
  •   uti6770werty · 2021-05-22 01:04:36 +08:00 · 2589 次点击
    这是一个创建于 1285 天前的主题,其中的信息可能已经有所发展或是发生改变。

    搜索引擎介绍的博客,多数是 os.system 使用系统 ping 来判断去解决的,不是很合意,
    再往一层,技巧就一下子深入到 sock 接口上生成 icmp 包去 sned 和 recive 并且设计到异步处理(全环节手工),有违使用 python 的初衷(其实不好抄代码到现在的代码里,要改很多逻辑),粗略看了一下 python 生态,似乎没有在 OSI 二层,三层或者四层专门去折腾 ARP,ICMP,IGMP,TTL 这些事情的库?

    8 条回复    2021-05-27 17:28:07 +08:00
    liprais
        1
    liprais  
       2021-05-22 01:43:54 +08:00 via iPhone
    随便一搜就有 ping3,要啥自行车
    phithon
        2
    phithon  
       2021-05-22 01:53:10 +08:00
    billlee
        3
    billlee  
       2021-05-22 03:00:47 +08:00   ❤️ 1
    RAW socket 需要 root 权限,/bin/ping 是个 suid 程序。
    iBugOne
        4
    iBugOne  
       2021-05-22 10:42:55 +08:00   ❤️ 2
    @billlee 曾经的 ping 确实是 suid 程序,现在 caps 流行起来后为了安全性取消了 suid,变成自带 cap_net_raw+ep 了
    yanqiyu
        5
    yanqiyu  
       2021-05-23 00:56:16 +08:00
    看了下我电脑里面的 ping,既没有 setuid 也没有 cap,strace 了一下是 SOCK_DGRAM 连接的,看了下文档这样子就不需要额外的特权了,并且校验和之类的工作会由内核代劳

    对应 python socket 大概是
    socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_ICMP)

    就能开这样一个 socket,之后看文档构造包头就能原生 python ping 了(我赌五毛有现成的轮子)

    refs: https://lkml.org/lkml/2010/12/21/195
    uti6770werty
        6
    uti6770werty  
    OP
       2021-05-24 23:21:14 +08:00
    @liprais 使用了 2,3 天,ping3 表现相当不靠谱(也有可能是我 PC 的问题,但不会是网络的问题)
    while True:
    time.sleep(1)
    respon = ping3.ping('192.168.33.13',unit='ms',size=128) # 局域网内
    print(respon)

    respon 可以是这样:
    14.000177383422852
    13.000011444091797
    13.000011444091797
    16.000032424926758
    0.0
    0.0
    0.0
    0.0
    0.0
    15.599727630615234
    0.0
    12.000083923339844
    11.00015640258789
    14.000177383422852
    12.000083923339844

    我在另外一个 cmd 窗口,ping -t,延时和连续,稳定如老狗。。。
    没啥更好便捷的,真准备上自行车了。。。。
    nyakoy
        7
    nyakoy  
       2021-05-26 17:59:23 +08:00
    我最近也有这种需求,如果楼主找到好的轮子,记得踢我一下
    l4ever
        8
    l4ever  
       2021-05-27 17:28:07 +08:00
    我也有类似的需求, 自己写的用起来很爽.
    我是用 socket 连 tcp 端口(和题主不一样, 我有维护目标 IP 和端口), 记录开始和结束时间, 从而得到延时.
    多线程, 这样测试 20 次, 耗时不到 1 秒.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3170 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 13:14 · PVG 21:14 · LAX 05:14 · JFK 08:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.