praegune kellaaeg 19.04.2024 07:08:34
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
sõnum |
|
Prozer
HV kasutaja
liitunud: 09.10.2008
|
02.01.2018 12:31:07
Veel1 küsimus Pythoni kohta |
|
|
Leidis netiavarustest hea programmi, millega broacdastida võrgus toimivaid IP-sid. Paraku ei suuda välja mõelda, kuidas teha IP-d muutujaks a la kasutaja saaks ise sisestada aadressid, mida "kammitakse". Nt allolev skript kammib läbi ainult selle segmendi, mis lähteandmetesse sisse kirjutatud (192.168.0.xxx). Proovisin alustuseks teha nii 192, 168 ja ka 0 muutujateks, peale mida mingi tegevus justkui programmis toimuks, aga resultaadina esitatakse ainult kulunud aeg.
Ehk - kas kellelgi on aimu, kuidas allolevas programmireas määrata muutujaid? ip="192.168.0.{0}".format(n)
Proovisin teha trikki kus arv1=192, arv2=168, arv3= 0 ja koodiks kirjutasin ip="arv1.arv2.arv3.{0}".format(n) , aga reaalselt asi ei tööta.
Algprogramm selline:
import subprocess,os,threading,time
from queue import Queue
lock=threading.Lock()
_start=time.time()
n=int(10)
def check(n):
with open(os.devnull, "wb") as limbo:
ip="192.168.0.{0}".format(n)
result=subprocess.Popen(["ping", "-n", "1", "-w", "300", ip],stdout=limbo, stderr=limbo).wait()
with lock:
if not result:
print (ip, "active")
else:
pass
def threader():
while True:
worker=q.get()
check(worker)
q.task_done()
q=Queue()
for x in range(255):
t=threading.Thread(target=threader)
t.daemon=True
t.start()
for worker in range(1,255):
q.put(worker)
q.join()
print("Process completed in: ",time.time()-_start)
_________________ Sidevõrkude ja tehnilise infra arendus. |
|
Kommentaarid: 68 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
67 |
|
tagasi üles |
|
|
Renka
HV Guru
liitunud: 01.04.2002
|
02.01.2018 17:27:50
|
|
|
Prozer, alusta ehk sellest, et tee kood teistele ka kergelt loetavaks? On vastavad [syntax] tagid foorumis olemas.
_________________ There is no place like 127.0.0.1 |
|
Kommentaarid: 71 loe/lisa |
Kasutajad arvavad: |
|
:: |
2 :: |
1 :: |
61 |
|
tagasi üles |
|
|
guest1902
Kreisi kasutaja
liitunud: 05.11.2005
|
02.01.2018 17:58:27
|
|
|
Selle postituse paar häda:- kood pole syntax tag'ide vahel: kui keegi tahab su koodi testida, siis ju vaja käsitsi Pythoni koodi tabida;
- pole ühtegi sõna mainitud platvormi kohta: käsurea (ja isegi Pythoni) kasutamises on märgatavaid erinevusi;
- mis Pythoni versiooni kasutad? eeldan, et Python3, kuna queue moodul puudub Python2-s;
- mida tähendab ,,asi reaalselt ei tööta''? mis errori said?
Ja koodist:- n=int(10) -> pingid ühte aadressit (192.168.1.10) 254 korda?
- pole vaja eraldi os.devnull avada, subprocess.DEVNULL on selleks (vähemalt Python3-s; Python2 on nkn varsti depracted niiet võiks juba eos sellest lahti öelda);
- -w 300 option ping commandile on overkill: see kulutab ühe hosti mittetuvastamise peale ~3 sekundit;
- threading moodul imeb GIL tõttu; kui just threadimist ei taha õppida, siis on mõttekam kasutada multiprocessing moodulit, mis koostab su eest vajaliku suurusega thread pooli, mis taustal lükkab iga workeri eraldi alamprotsessi; hetkel võtab skännimine 254 * 3 = ~750 sekundit aega;
- ping commandis on -n option numbrilise argumendiga, mis reguleerib ICMP pakkide (ehk pingide) arvu -- aga see option on ainult Windowsis; Linuxis on -n teise tähendusega ja ei võta üldse argumente; Linuxis tuleks kasutada -c optionit.
See format teema tegelikult töötab. Kui ei usu, kirjuta terminali
python -c "print('192.168.0.{0}'.format(10))" |
Kui ülaltoodud probleemid välja arvata, siis kood üldiselt ka töötab, niiet ma ei oskagi öelda, milles probleem peaks olema...
Kuna ma ise ei viitsinud threading probleemidesse süveneda (su programm võtab pool elu LANi skännimiseks), kirjutasin selle programmikese ümber (kood all). Peaks töötama Windowsis ja Linuxis Python3-ga. Testisin Linuxis 3.6.4-ga.
python:
|
#!/usr/bin/env python # -*- coding: utf-8 -*- import multiprocessing import subprocess import logging import queue import time import sys import os PING_COUNT = '-n' if os.name == 'nt' else '-c' SUBNET_PREFIX = '192.168.1.' active = queue.Queue() logging.basicConfig( stream = sys.stdout, level = logging.INFO, # change to logging.DEBUG when debugging format = '%(asctime)s - %(levelname)s: %(message)s', ) def worker(last_octet): ip_addr = '{}{}'.format(SUBNET_PREFIX, last_octet) exit_code = subprocess.Popen( "ping {ping_count} 1 -w 1 {ip_addr}".format( ping_count = PING_COUNT, ip_addr = ip_addr, ).split(), stdout = subprocess.DEVNULL, stderr = subprocess.DEVNULL, shell = False, ).wait() logging.debug("Pinged {}, got {}".format(ip_addr, exit_code)) return (exit_code, ip_addr) def log_result(result): exit_code, ip_addr = result if exit_code == 0: active.put(ip_addr) if __name__ == '__main__': print("Starting to scan local network ...") start_time = time.time() last_octet_range = range(1, 255) nof_threads = len(last_octet_range) pool = multiprocessing.Pool(nof_threads) for last_octet in last_octet_range: pool.apply_async(worker, args = (last_octet, ), callback = log_result) pool.close() pool.join() time_elapsed = time.time() - start_time print("Scanning completed in {:.3f} seconds".format(time_elapsed)) print("List of active IP addresses:") for active_ip_addr in active.queue: print(" {ip_addr}".format(ip_addr = active_ip_addr))
|
Muidu, kui pole plaanis Pythonit õppida, siis parem proovi nmapi; näiteks
skännib kohalikku võrku samamoodi pingides. Kui vaja kuhugi IP addressid dumpida, saad Linuxis teha nt nii:
nmap -sP 192.168.1.* | grep "report" | awk '{print $NF}' | tr -d '()' |
Muidugi telode vastu (või üldse ükskõik millise aku peal töötava seadme vastu) kumbki lahendus alati ei tööta, kuna wifi moodul lülitatakse perioodiliselt välja, kui seade pole aktiivselt kasutuses. Ei mäleta kohe, kas ELi direktiivi tõttu või ongi selline wifi standard.
_________________ assumption is the mother of all fuck ups
,,think before you print and save a ROOT::TTree'' |
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
|
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|