如何在Python中轻松获取本地网络中的IP地址或主机名列表?
最好是多平台,但它需要首先在Mac OS X上运行,然后其他人跟进。
修改:在本地,我指的是本地网络中的所有有效地址,例如192.168.xxx.xxx
。
因此,如果我的计算机的IP地址(在本地网络内)是192.168.1.1
,并且我有其他三台连接的计算机,我希望它返回IP地址192.168.1.2
,{{ 1}},192.168.1.3
,可能还有他们的主机名。
答案 0 :(得分:20)
更新:该脚本现在位于github。
我写了一个small python script,它利用了scapy的arping()
。
答案 1 :(得分:18)
如果“本地”是指同一网段,则必须执行以下步骤:
或者你可以让Python在外部执行nmap并将结果传回你的程序。
答案 2 :(得分:9)
如果您知道可以使用的计算机名称:
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地址,如另一个答案中所述。
答案 3 :(得分:3)
尝试:
import socket
print ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])
答案 4 :(得分:3)
我从其他一些线程中收集了以下功能,它在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)
答案 5 :(得分:0)
this question中的一个答案可能会对您有所帮助。似乎有一个平台不可知版本的python,但我还没有尝试过。
答案 6 :(得分:0)
这是一个小工具 scanip ,它可以帮助您获取网络中的所有IP地址及其相应的mac地址(适用于Linux)。 这是用python编写的 scanip (Ip和Mac扫描程序)的链接。 https://pypi.python.org/pypi/scanip/1.0
你也可以在linux上使用 pip install scanip 下载它并使用它,在python中创建一个测试文件并像这样使用它 -
import scanip.scanip
scanip.scanip.start_scan()
并运行此程序。局域网中的所有IP及其对应的mac地址都将显示在终端中。
答案 7 :(得分:0)
我找到了这个network scanner in python article并写下了这段简短的代码。它满足您的要求!但是,您确实需要知道设备的可访问端口。端口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]
import socket
def connect(hostname, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.setdefaulttimeout(1)
result = sock.connect_ex((hostname, port))
sock.close()
return result == 0
for i in range(0,255):
res = connect("192.168.1."+str(i), 22)
if res:
print("Device found at: ", "192.168.1."+str(i) + ":"+str(22))
答案 8 :(得分:0)
我已经完成以下代码来获取MAC已知设备的IP。可以对其进行相应的修改,以通过一些字符串操作获得所有IP。希望对您有帮助。
git checkout develop
git merge proj1/develop
git merge proj2/develop
<make more changes and resolve conflicts>
git commit -a
git push proj2 develop
答案 9 :(得分:0)
对于OSX(和Linux),一个简单的解决方案是使用os.popen或os.system并运行arp -a
命令。
例如:
devices = []
for device in os.popen('arp -a'): devices.append(device)
这将为您提供本地网络上设备的列表。