Jos*_*unt 37 python networking
如何在Python中轻松获取本地网络中的IP地址或主机名列表?
如果它是多平台的,那将是最好的,但它需要首先在Mac OS X上运行,然后其他人遵循.
编辑:本地我指的是本地网络中的所有活动地址,例如192.168.xxx.xxx.
所以,如果我的电脑的IP地址(本地网络内)是192.168.1.1的,我有另外三个连接的计算机,我希望它返回的IP地址192.168.1.2,192.168.1.3,192.168.1.4,可能它们的主机名.
Ste*_*yer 19
如果"本地"表示同一网段,则必须执行以下步骤:
或者你可以让Python在外部执行nmap并将结果传回你的程序.
Map*_*pad 10
如果您知道可以使用的计算机名称:
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
Run Code Online (Sandbox Code Playgroud)
否则,您将必须扫描与本地计算机(IP1)相同掩码的所有IP地址,如另一个答案中所述.
我已经从其他一些线程中收集了以下功能,并且在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)
Run Code Online (Sandbox Code Playgroud)
小智 5
我在 python 文章中找到了这个网络扫描仪并编写了这段简短的代码。它做你想做的事!但是,您确实需要知道您的设备的可访问端口。端口 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]
Run Code Online (Sandbox Code Playgroud)
linux: [20, 21, 22, 23, 25, 80, 111, 443, 445, 631, 993, 995]
windows: [135, 137, 138, 139, 445]
mac: [22, 445, 548, 631]
Run Code Online (Sandbox Code Playgroud)
TheLizzard编辑:
使用上面的代码并添加线程:
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))
Run Code Online (Sandbox Code Playgroud)
对于 OSX(和 Linux),一个简单的解决方案是使用 os.popen 或 os.system 并运行arp -a命令。
例如:
devices = []
for device in os.popen('arp -a'): devices.append(device)
Run Code Online (Sandbox Code Playgroud)
这将为您提供本地网络上的设备列表。