Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Veel1 küsimus Pythoni kohta märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale. Teata moderaatorile
otsing:  
Prozer
HV kasutaja
Prozer

liitunud: 09.10.2008




sõnum 02.01.2018 12:31:07 Veel1 küsimus Pythoni kohta vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
Renka
HV Guru
Renka

liitunud: 01.04.2002



Autoriseeritud ID-kaardiga

sõnum 02.01.2018 17:27:50 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
guest1902
Kreisi kasutaja
guest1902

liitunud: 05.11.2005




sõnum 02.01.2018 17:58:27 vasta tsitaadiga

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:
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import multiprocessing
  5. import subprocess
  6. import logging
  7. import queue
  8. import time
  9. import sys
  10. import os
  11.  
  12. PING_COUNT    = '-n' if os.name == 'nt' else '-c'
  13. SUBNET_PREFIX = '192.168.1.'
  14.  
  15. active = queue.Queue()
  16.  
  17. logging.basicConfig(
  18.   stream = sys.stdout,
  19.   level  = logging.INFO, # change to logging.DEBUG when debugging
  20.   format = '%(asctime)s - %(levelname)s: %(message)s',
  21. )
  22.  
  23. def worker(last_octet):
  24.   ip_addr = '{}{}'.format(SUBNET_PREFIX, last_octet)
  25.  
  26.   exit_code = subprocess.Popen(
  27.     "ping {ping_count} 1 -w 1 {ip_addr}".format(
  28.       ping_count = PING_COUNT,
  29.       ip_addr    = ip_addr,
  30.     ).split(),
  31.     stdout = subprocess.DEVNULL,
  32.     stderr = subprocess.DEVNULL,
  33.     shell  = False,
  34.   ).wait()
  35.   logging.debug("Pinged {}, got {}".format(ip_addr, exit_code))
  36.  
  37.   return (exit_code, ip_addr)
  38.  
  39. def log_result(result):
  40.   exit_code, ip_addr = result
  41.  
  42.   if exit_code == 0:
  43.     active.put(ip_addr)
  44.  
  45. if __name__ == '__main__':
  46.  
  47.   print("Starting to scan local network ...")
  48.   start_time = time.time()
  49.  
  50.   last_octet_range = range(1, 255)
  51.   nof_threads      = len(last_octet_range)
  52.   pool             = multiprocessing.Pool(nof_threads)
  53.   for last_octet in last_octet_range:
  54.       pool.apply_async(worker, args = (last_octet, ), callback = log_result)
  55.   pool.close()
  56.   pool.join()
  57.  
  58.   time_elapsed = time.time() - start_time
  59.   print("Scanning completed in {:.3f} seconds".format(time_elapsed))
  60.  
  61.   print("List of active IP addresses:")
  62.   for active_ip_addr in active.queue:
  63.     print("  {ip_addr}".format(ip_addr = active_ip_addr))
Muidu, kui pole plaanis Pythonit õppida, siis parem proovi nmapi; näiteks
nmap -sn 192.168.1.*
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
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Veel1 küsimus Pythoni kohta
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
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.