python--局域网IP+用户名

开始程序是单线程的,跑255个主机,我晕,好像要10~20分钟吧,真坑爹~~

后来改为了多线程的了,几秒钟就可以出结果哦~~  
程序主要有三个功能:
1.扫描局域网中的所有主机,需要指定起始IP;
2.得到知道主机名的IP地址;
3.得到指定IP地址的主机名。
代码如下:
#! /usr/bin/python
# coding=gbk
'''
中文编码
功能:局域网内的IP和主机名。
多线程编程。实践表明,多线程比单线程要快好多好多~~
'''

import sys, os, socket, string
import threading

list_of_name=[]
list_of_ip=[]   #存放结果
thread_pool=[]

def showInfo():
    print """
     命令格式:LAN_ip_hostname -all startip
              LAN_ip_hostname -ip ipaddr
              LAN_ip_hostname -hostname hostname
     说明:-all 扫描局域网中所有IP对应的hostname,需要起始IP,如192.168.0.1
          -ip 获取指定IP的hostname
          -hostname 根据主机名,得到其IP地址
           """

def lanAll(startip):
    index=string.rfind(startip,'.')    #找最右边的.的索引
    ipfirstpart=startip[0:index+1]
    intstart=string.atoi(startip[index+1 :]) #点分十进制的最后的串转为int型

    f=range(intstart,255)

    global g_mutex      #互斥量。不能定义称全局变量,否则,目标函数不认同
    g_mutex=threading.Lock()    #初始化互斥量
    
    for iplastpart in f:
        targetip=ipfirstpart + str(iplastpart)
        #创建线程对象,存为th。线程要执行的函数由target指定,args指定参数,可以是元组~。线程号从1开始
        th=threading.Thread(target=lanIp2Name,args=(iplastpart - intstart +1 ,targetip))
        thread_pool.append(th)
        th.start()
        
    #阻塞主线程。collect all threads
    pos=intstart
    for pos in f:
        threading.Thread.join(thread_pool[pos-intstart])

    #输出结果
    hosts=range(0,len(list_of_name))
    for host in hosts:
        print list_of_ip[host],'  ====>   ',list_of_name[host]
    print 'Find ',len(list_of_name),' Hosts.Done!'
        
def lanIp2Name(t_id,ip):
    try:
        (name,aliaslist,addresslist)=socket.gethostbyaddr(ip)
    except:
        return

    global g_mutex        #再次声明
    g_mutex.acquire() 
    ######################受互斥量保护区代码##################################
    list_of_name.append(name)
    list_of_ip.append(ip)
    ########################################################################
    g_mutex.release()

def lanIpToName(ip):
    try:
        (name,aliaslist,addresslist)=socket.gethostbyaddr(ip)
    except:
        return
    print name,"    ====>   ",addresslist   

    
def lanName2Ip(name):
    targetip=socket.gethostbyname(name)
    print name,"    ====>   ",targetip
     
'''
一个.py文件,如果是自身在运行,那么他的__name__值就是"__main__";
如果它是被别的程序导入的(作为一个模块),则__name__就不是__main__
'''
if '__main__' == __name__:          
    '''
    sys.argv[]是用来获取命令行参数的,sys.argv[0]表示代码本身文件路径
    array.count(x)  返回出现的x的次数
    '''
    if len(sys.argv)< 3 :
         print "参数错误"
         showInfo()
         exit(1)
     
    cmds = ['-all', '-ip','-hostname']
     
    cmd = sys.argv[1]
    target=sys.argv[2]
         
    if 0 == cmds.count(cmd):  
        print cmd
        print "参数错误啊"
        showInfo()
        exit(1)
    else:
        print 'Start working,Please waiting...'
        if cmd == '-all':
            lanAll(target)
                            
        elif cmd == '-ip':
            lanIpToName(target)

        elif cmd=='-hostname':
            lanName2Ip(target)   
                  
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值