gpt4 book ai didi

Python ping本地IP

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:47 24 4
gpt4 key购买 nike

所以昨天我在练习过去几天学到的东西,并决定创建一个脚本来扫描本地网络中的所有 IP 并检查哪些正在使用。

我使用子进程使用具有给定超时的“ping”命令,以及其他一些库,例如 docopt、线程和时间,用于处理命令行参数、线程、等待代码等常见任务...

这是脚本:

""" ipcheck.py - Getting available IPs in a network.


Usage:
ipcheck.py -h | --help
ipcheck.py PREFIX
ipcheck.py [(-n <pack_num> PREFIX) | (-t <timeout> PREFIX)]

Options:
-h --help Show the program's usage.
-n --packnum Number of packets to be sent.
-t --timeout Timeout in miliseconds for the request.
"""

import sys, os, time, threading
from threading import Thread
from threading import Event
import subprocess
import docopt


ips = [] # Global ping variable


def ping(ip, e, n=1, time_out=1000):

global ips

# FIX SO PLATFORM INDEPENDENT
# Use subprocess to ping an IP
try:
dump_file = open('dump.txt', 'w')
subprocess.check_call("ping -q -w%d -c%s %s" % (int(time_out), int(n), ip),
shell=True, stdout=dump_file, stderr=dump_file)
except subprocess.CalledProcessError as err:
# Ip did not receive packets
print("The IP [%s] is NOT AVAILABLE" % ip)
return
else:
# Ip received packets, so available
print("The IP [%s] is AVAILABLE" % ip)
#ips.append(ip)
finally:
# File has to be closed anyway
dump_file.close()

# Also set the event as ping finishes
e.set()
ips.append(1)


def usage():
print("Helped init")

def main(e):

# variables needed
timeout = 1000
N_THREADS = 10


# Get arguments for parsing
arguments = docopt.docopt(__doc__)

# Parse the arguments
if arguments['--help'] or len(sys.argv[1:]) < 1:
usage()
sys.exit(0)
elif arguments['--packnum']:
n_packets = arguments['--packnum']
elif arguments['--timeout']:
timeout = arguments['--timeout']
prefix = arguments['PREFIX']


# Just an inner function to reuse in the main
# loop.
def create_thread(threads, ip, e):

# Just code to crete a ping thread
threads.append(Thread(target=ping, args=(ip, e)))
threads[-1].setDaemon(True)
threads[-1].start()
return


# Do the threading stuff
threads = []

# Loop to check all the IP's
for i in range(1, 256):
if len(threads) < N_THREADS:

# Creating and starting thread
create_thread(threads, prefix+str(i), e)

else:
# Wait until a thread finishes
e.wait()

# Get rid of finished threads
to_del = []
for th in threads:
if not th.is_alive(): to_del.append(th)
for th in to_del: threads.remove(th)

# Cheeky clear init + create thread
create_thread(threads, prefix+str(i), e)
e.clear()

time.sleep(2*timeout/1000) # Last chance to wait for unfinished pings
print("Program ended. Number of threads active: %d." % threading.active_count())

if __name__ == "__main__":
ev = Event()
main(ev)

我遇到的问题是,虽然我为 ping 命令设置了超时(以毫秒为单位),但某些线程由于某种原因没有完成。我通过使所有线程成为守护进程并在程序完成后等待两次超时(main 中的最后几行)暂时修复了此问题,但这并没有按预期工作,一些线程在 sleep 后仍未完成。

这与命令 ping 本身有关还是我的设计存在问题?

和平!

最佳答案

Python 3.3 为 subprocess.check_call() 实现了一个 timeout= 关键字参数:

https://docs.python.org/3.3/library/subprocess.html#subprocess.check_call

否则我会使用另一个线程来确保生成的命令在超时期限后被终止 - 即看到这个 SO 答案:

https://stackoverflow.com/a/6001858/866915

关于Python ping本地IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38773953/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com