[Python] scannerino th tcp per divertirmi

Dario Bertini berdario a gmail.com
Sab 13 Set 2014 23:52:43 CEST


Un po' di commenti sparsi:

- evita "import *", sopratutto se poi fai riferimento comunque al
modulo threading
- è inutile sottoclassare Thread, usa piuttosto il suo costruttore e
il parametro "target"
- se proprio vuoi che scanports sia una classe, ,è convenzione che le
classi siano in CamelCase
- scanports è un nome fuorviante: non lavora su diverse porte al
plurale, ma solo su una
- non c'è bisogno del parametro ports
- non c'è neanche bisogno del parametro servs: puoi passare il nome
del servizio già a scanport
- per farlo, evita .index(), che è brutto ed error prone, zip() è tuo amico
- definisci le tue strutture dati in un posto diverso da dove c'è la
business logic
- usa un dizionario "porta" -> 'nome servizio comunemente li esposto"
e un dizionario "modalità di scansione"-> "lista/set di porte" (così
probabilmente non andresti più ad usare zip(), ma avrai altre
opportunità per farlo)
- non mischiare la business logic con la presentazione (per quanto
possibile, in uno scriptino piccolo come questo immagino magari puoi
rilassare le best practices)
- non assumere che gli utenti abbiano il tuo stesso setup e non
aspettarti che spendano troppo a tempo a configurare il tuo programma,
dei default sani di mente sono importanti
- in merito a quanto sopra: piuttosto che dire di modificare il codice
in base al numero di thread, usa os.cpu_count() (o
multiprocessing.cpu_count() se sei su un vecchio python)
- ancora: usa shutil.get_terminal_size().columns invece di tirare ad
indovinare il numero di colonne
- fattorizza, fattorizza, fattorizza
- un esempio sono tutte le ripetizioni di write();flush()... quella
sarebbe una delle prime cose da mettere in una funzione
- se non esistesse già una funzione che fa quello che cerchi:
print(foo, end='', flush=True)
- evita di riempire di spazi una linea, se andrai comunque a
sovrascriverla, usa ljust:  print(('\rfoobar').ljust(columns), end='',
flush=True)
- questo è un obbrobrio:
str(abcd[0])+'.'+str(abcd[1])+'.'+str(abcd[2])+'.'+str(abcd[3])
- abcd è un pessimo nome di variabile
- alternative migliori: ".".join(map(str, ip)) o "%s.%s.%s.%s" %
tuple(ip) o "{}.{}.{}.{}".format(*ip)
- ovviamente, anche in questo caso non serve, visto che Python ci
fornisce qualcosa nella stdlib:
https://docs.python.org/3/library/ipaddress.html
- invece di fare magheggi con le 4 parti dell'indirizzo, potresti
tranquillamente incrementare l'indirizzo: ip =
ip_address('127.0.0.1'); ip += 1
- effettivamente, non capisco perchè richiedi un indirizzo, se questo
non viene usato per considerare la rete sulla quale si sta lavorando
(e la sua dimensione), meglio `for ip in
ip_network('0.0.0.0/0').hosts()`
- `raise KeyboardInterrupt` è un abuso delle eccezioni usato così,
imho... un `break` dovrebbe bastarti in questo caso
- except: pass è un NONONONO
- non capisco esattamente il significato di gotit (usi delle stringhe
invece di un booleano e mi sembra che ci sia un errore logico che
possa causare uno skip degli indirizzi ip), ma stai usando una
variabile globale per quello che sembra un lavoro di sincronizzazione.
Guardati lock, semafori e quant'altro
- installa ed usa flake8


Capisco che non tutti siano di madrelingua italiana, ma certe
discussioni qui a volte sono un po' disorientanti

2014-09-13 11:56 GMT+02:00 Remo The Last <py.remothelast at yahoo.it>:
> ecco uno scannerino a comando linea, full connect, altamente funzionante.

"a linea di comando"
full connect vuol dire tutto e niente, "altamente funzionante" sembra
un po' una presa in giro: a casa mia le cose funzionano, o NON
funzionano. Casomai è pieno di feature, performante, efficiente,
user-friendly, etc.


2014-09-13 21:42 GMT+02:00 Remo The Last <py.remothelast at yahoo.it>:
> E' uno scanner che non deve esser sicuro. Deve fare il suo dovere di
> scanner.

Nessuno ha detto niente sulla sicurezza di questo script


Maggiori informazioni sulla lista Python