关闭

【Python】局域网ping扫描在线主机

标签: pythonping-扫描
2178人阅读 评论(0) 收藏 举报
分类:

首先参考了这个实现
它是开多线程来调用cmd ping
LZ选择用subprocess.Popen,让子进程通过管道将输入缓存到系统buffer中。Popen会返回一个对象,可以通过它与子进程交互,获取其状态等。轮询Popen对象判断ping是否结束,进而检查echo信息判断,得到在线主机列表。。
速度比多线程快很多,扫描1-255只需要不到10s

#-*- coding: utf-8 -*- 
import platform 
import sys 
import os 
import time 
import thread
from subprocess import Popen, PIPE

# 传入ip地址,调用 cmd ping, 返回 Popen 对象
# 指定ping的stdout通过管道写入设定的buffer中
def invoke_ping(addr):
    # windows 的参数和linux下不同
    cmd = ['ping', '-n', '1', addr]
    ret = 0
    try:
        ret = Popen(cmd, bufsize=1024, stdout=PIPE)
    except ValueError:
        print 'error occur in invoke_ping: ' + addr
    return ret

# 简单地通过 ping 回显信息检查是否在线
def check_online(popen_obj):
    echo = popen_obj.communicate()[0].split('\n')
    if len(echo) >= 3:
        print echo[2]
        ttl_pos = echo[2].find('TTL')
        if ttl_pos != -1:
            ms_pos = echo[2].find('ms')
            i = ms_pos - 1
            while i > 0 and echo[2][i:i+1].isdigit() == True:
                i -= 1
            ti = int(echo[2][i+1:ms_pos])
            ttl = int(echo[2][ttl_pos + 4:])

            return (ti, ttl)
    return tuple()

def ping_scan(dst):
    oks = []
    scq = {}
    net_addr = dst.split('.')
    for i in range(0, 256):
        net_addr[3] = str(i)
        tmp = invoke_ping( '.'.join(net_addr) )
        if type(tmp) != int:
            scq[i] = tmp

    while len(scq) != 0:
        to_be_removed = []
        for k, v in scq.items():
            if v.poll() != None:
                ret = check_online(v)
                if len(ret) > 0:
                    net_addr[3] = str(k)
                    oks.append( ( k, ret) )
                to_be_removed.append( k )
        for i in to_be_removed:
            scq.pop(i)
    return oks

if __name__ == '__main__':
    start_time = time.clock()
    dst_net = '172.30.58.229'
    online_list = ping_scan(dst_net)
    online_list.sort()
    prefix = '.'.join( dst_net.split('.')[0:3] )
    for i in online_list:
        fmt = '%s time=%dms ttl=%d'
        print fmt % ( prefix+'.'+str(i[0]), i[1][0], i[1][1] )
    print '%d hosts in total' % len(online_list)
    print 'process time: %lfs' % (time.clock() - start_time)
0
0
查看评论

Python实现ping指定IP

贴代码: import osimport sysiplist = list()ip = '192.168.1.11'# ip = '172.24.186.191'ip = 'www.baidu.com'backinfo =  os.sys...
  • Silencegll
  • Silencegll
  • 2016-05-10 17:13
  • 2742

[python]测试局域网中电脑是否连通

生命苦短,我用python 参考http://www.jb51.net/article/926.htm 与 python2.7.3在线文档 ''' Created on 2012-9-9 @author: jincheng ''' from...
  • seraph021724
  • seraph021724
  • 2012-12-17 10:17
  • 1430

python脚本测试局域网中的电脑是否连通

python脚本测试局域网中的电脑是否连通
  • u013252072
  • u013252072
  • 2016-05-11 10:34
  • 668

【搬家】【Python】Python 实现自动 Ping 目标地址

本文最早于 2013年8月29日于本人个人博客(http://mooowooo.tk)发表,现博客搬家至此,转载请注明出处。
  • tiwoo
  • tiwoo
  • 2014-06-18 15:45
  • 768

python---最简单的ping网站测试

python—最简单的ping网站测试,后续写局域网扫描软件python源码---linux系统ping网站域名:root@kali:~/python# cat osping.py #!/usr/bin/python # --*-- coding:utf-8 --*--import oslist ...
  • xwbk12
  • xwbk12
  • 2017-12-07 16:46
  • 326

局域网ping检查【python】

import os import subprocess   iplist=[] def pingCheck(ip): p = subprocess.Popen("ping -n 1 %s"%ip,\ stdin = subprocess.PIPE,\ std...
  • buzaiQQ
  • buzaiQQ
  • 2017-02-18 12:37
  • 190

Python ping网段源码

  • 2015-04-02 17:41
  • 586B
  • 下载

Python中获取本机内网IP(Linux)

def get_local_ip(ifname = 'eth0'):       import socket, fcntl, struct   ...
  • longzhiwen888
  • longzhiwen888
  • 2015-06-19 16:17
  • 971

python获取局域网内计算机IP地址

参考文章链接 # -*- coding: cp936 -*- import urllib2,re,time      while True:             #获取ip地址并发送   ...
  • vvaa00
  • vvaa00
  • 2013-12-04 16:27
  • 1917

python获取PING结果

项目需要,写下这段脚本       通过subprocess.Popen调用系统的ping.exe,获得ping结果文本,再通过正则表达式从结果文本中提取需要的参数。需要考虑中文和英文两种返回结果。     &...
  • u014370228
  • u014370228
  • 2015-03-19 09:01
  • 4125
    个人资料
    • 访问:143431次
    • 积分:4186
    • 等级:
    • 排名:第8697名
    • 原创:278篇
    • 转载:0篇
    • 译文:1篇
    • 评论:12条
    最新评论