したがって、私はbashスクリプトの場合と同様に、pythonを使用して同様の結果を得ようとしています。
Bashスクリプトのコード:
#!/bin/bash
for ip in $(seq 1 254); do
ping -c 1 10.10.10.$ip | grep "bytes from" | cut -d " " -f 4 | cut -d ":" -f 1 &
done
私がやりたいことは、同じような速度で同じ結果を得ることです。 pythonスクリプトのすべてのバージョンで発生した問題は、バッチスクリプトにかかる数秒と比較して、完了するまでに非常に長い時間がかかることです。
バッチファイルは/ 24ネットワークをスイープするのに約2秒かかりますが、pythonスクリプトで取得できる最高の時間は約5〜8分です。
pythonスクリプトの最新バージョン:
import subprocess
cmdping = "ping -c1 10.10.10."
for x in range (2,255):
p = subprocess.Popen(cmdping+str(x), Shell=True, stderr=subprocess.PIPE)
while True:
out = p.stderr.read(1)
if out == '' and p.poll() != None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()
私はpythonでいくつかの異なる方法を試しましたが、bashスクリプトの速度に近い場所には到達できません。
助言がありますか?
#!/usr/bin/python2
import multiprocessing
import subprocess
import os
def pinger( job_q, results_q ):
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
if __name__ == '__main__':
pool_size = 255
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()
for i in range(1,255):
jobs.put('192.168.1.{0}'.format(i))
for p in pool:
jobs.put(None)
for p in pool:
p.join()
while not results.empty():
ip = results.get()
print(ip)