Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中本地网络的IP地址/主机名列表_Python_Networking - Fatal编程技术网

Python中本地网络的IP地址/主机名列表

Python中本地网络的IP地址/主机名列表,python,networking,Python,Networking,在Python中,如何从本地网络轻松获取IP地址或主机名列表 如果它是多平台的,那将是最好的,但它需要先在MacOSX上工作,然后其他人也跟着工作 编辑:本地我指的是本地网络中所有活动的地址,例如192.168.xxx.xxx 因此,如果我的计算机(在本地网络中)的IP地址是192.168.1.1,并且我还有其他三台连接的计算机,我希望它返回IP地址192.168.1.2,192.168.1.3,192.168.1.4,可能还有它们的主机名。中的一个答案可能对您有所帮助。python似乎有一个与

在Python中,如何从本地网络轻松获取IP地址或主机名列表

如果它是多平台的,那将是最好的,但它需要先在MacOSX上工作,然后其他人也跟着工作

编辑:本地我指的是本地网络中所有活动的地址,例如
192.168.xxx.xxx

因此,如果我的计算机(在本地网络中)的IP地址是
192.168.1.1
,并且我还有其他三台连接的计算机,我希望它返回IP地址
192.168.1.2
192.168.1.3
192.168.1.4
,可能还有它们的主机名。

中的一个答案可能对您有所帮助。python似乎有一个与平台无关的版本,但我还没有尝试过。

如果您所说的“本地”是指在同一网段上,那么您必须执行以下步骤:

  • 确定您自己的IP地址
  • 确定您自己的网络掩码
  • 确定网络范围
  • 扫描所有地址(除了最低地址,即网络地址和最高地址,即广播地址)
  • 使用DNS的反向查找来确定响应扫描的IP地址的主机名

  • 或者,您可以让Python在外部执行nmap,并将结果通过管道传回您的程序。

    如果您知道可以使用的计算机名称:

    import socket
    IP1 = socket.gethostbyname(socket.gethostname()) # local IP adress of your computer
    IP2 = socket.gethostbyname('name_of_your_computer') # IP adress of remote computer
    

    否则,您必须扫描与本地计算机(IP1)相同掩码的所有IP地址,如另一个答案所述。

    更新:脚本现在位于

    我写了一个,它利用了的
    arping()

    import socket
    
    print ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])
    

    这里有一个小工具scanip,它将帮助您获取网络中的所有ip地址及其相应的mac地址(在Linux上工作)


    我从其他一些线程收集了以下功能,它在Ubuntu中适用

    import os
    import socket    
    import multiprocessing
    import subprocess
    import os
    
    
    def pinger(job_q, results_q):
        """
        Do Ping
        :param job_q:
        :param results_q:
        :return:
        """
        DEVNULL = open(os.devnull, 'w')
        while True:
    
            ip = job_q.get()
    
            if ip is None:
                break
    
            try:
                subprocess.check_call(['ping', '-c1', ip],
                                      stdout=DEVNULL)
                results_q.put(ip)
            except:
                pass
    
    
    def get_my_ip():
        """
        Find my IP address
        :return:
        """
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(("8.8.8.8", 80))
        ip = s.getsockname()[0]
        s.close()
        return ip
    
    
    def map_network(pool_size=255):
        """
        Maps the network
        :param pool_size: amount of parallel ping processes
        :return: list of valid ip addresses
        """
    
        ip_list = list()
    
        # get my IP and compose a base like 192.168.1.xxx
        ip_parts = get_my_ip().split('.')
        base_ip = ip_parts[0] + '.' + ip_parts[1] + '.' + ip_parts[2] + '.'
    
        # prepare the jobs queue
        jobs = multiprocessing.Queue()
        results = multiprocessing.Queue()
    
        pool = [multiprocessing.Process(target=pinger, args=(jobs, results)) for i in range(pool_size)]
    
        for p in pool:
            p.start()
    
        # cue hte ping processes
        for i in range(1, 255):
            jobs.put(base_ip + '{0}'.format(i))
    
        for p in pool:
            jobs.put(None)
    
        for p in pool:
            p.join()
    
        # collect he results
        while not results.empty():
            ip = results.get()
            ip_list.append(ip)
    
        return ip_list
    
    
    if __name__ == '__main__':
    
        print('Mapping...')
        lst = map_network()
        print(lst)
    
    我找到了这个并写了这个简短的代码。它做你想做的!但是,您确实需要知道设备的可访问端口。端口22是ssh标准,我正在使用它。我想你可以在所有端口上循环。一些默认设置是:

    linux: [20, 21, 22, 23, 25, 80, 111, 443, 445, 631, 993, 995]
    windows: [135, 137, 138, 139, 445]
    mac: [22, 445, 548, 631]
    
    导入套接字
    def connect(主机名、端口):
    sock=socket.socket(socket.AF\u INET,socket.sock\u流)
    socket.setdefaulttimeout(1)
    结果=sock.connect_ex((主机名、端口))
    sock.close()
    返回结果==0
    对于范围(0255)内的i:
    res=connect(“192.168.1.+str(i),22)
    如果有的话:
    打印(“设备位于:”,“192.168.1.”+str(i)+“:”+str(22))
    
    我已经完成了以下代码以获取MAC已知设备的IP。可以对其进行相应修改,以通过一些字符串操作获得所有IP。希望这对你有帮助

    #running windows cmd line  statement and put output into a string
    cmd_out = os.popen("arp -a").read()
    line_arr = cmd_out.split('\n')
    line_count = len(line_arr)
    
    
    #search in all lines for ip
    for i in range(0, line_count):
        y = line_arr[i]
        z = y.find(mac_address)
    
        #if mac address is found then get the ip using regex matching
        if z > 0:
            ip_out= re.search('[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+', y, re.M | re.I)
    
    对于OSX(和Linux),一个简单的解决方案是使用os.popen或os.system并运行
    arp-a
    命令

    例如:

    devices = []
    for device in os.popen('arp -a'): devices.append(device)
    

    这将为您提供本地网络上的设备列表。

    不,我不想要我的ip地址,我想要所有其他人。Steve Moyer所说的,但代码:)如何获取我的计算机套接字的名称。gethostname()在
    pinger()中返回计算机的名称。
    显示
    DEVNULL=open(os.DEVNULL,'w')
    的行是什么?您不应该在函数末尾关闭
    os.devnull
    以防止内存泄漏吗?devnull是一个控制台,用于重定向stdout并打印到它,就像它是一个文件映射一样。。。[]这是我得到的输出。我只有一个盒子。有什么原因吗?你在linux上吗?上次我检查时,它在windowsarp-a上没有按预期工作要识别注释的额外空间可以解释一下socket.gethostbyname(socket.gethostname())
    索引1处的数组吗?我不明白为什么它是空的。超慢,我认为这不是一个可行的解决方案