{"id":1160,"date":"2020-03-26T11:02:39","date_gmt":"2020-03-26T11:02:39","guid":{"rendered":"https:\/\/www.budus.it\/Blog\/?p=1160"},"modified":"2022-06-07T16:42:36","modified_gmt":"2022-06-07T16:42:36","slug":"python-network-scanner","status":"publish","type":"post","link":"https:\/\/www.budus.it\/Blog\/python-network-scanner\/","title":{"rendered":"Python: Network Scanner"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Premessa: si tratta di un esercizio per imparare il linguaggio e consente solo di fare il ping verso un range di indirizzi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quindi: nulla di sofisticato, volevo solo crearmi qualcosa per verificare quali IP fossero raggiungibili nella LAN e &#8211; senza usare tools gi\u00e0 esistenti e fatti sicuramente meglio &#8211; ho semplicemente voluto farmi <em>qualcosa in casa<\/em>, tutto qua.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">Di seguito propongo subito il codice che \u00e8 possibile copiare ed incollare dentro un file che potrebbe chiamarsi &#8220;net_scan.py&#8221;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env python3\n# -*- coding: utf-8 -*-\n\n# By UDA'Software 2020 - budus@hotmail.it\n# Versione 2020-03-26 (nome in codice: Quarantena)\n\n################################################################################\n#_______________________________________________________________________________\nimport sys         # Per gestire i parametri a linea di comando\nimport re          # Per gestire le espressioni regolari\n\nimport platform    # For getting the operating system name\nimport subprocess  # For executing a shell command\n\n################################################################################\n#_______________________________________________________________________________\ndef find_pattern(pipe_output, pattern):\n    lines = str(pipe_output).split()\n    for line in lines:\n        match = re.match(pattern, str(line))\n        if match:\n            return True\n    \n    return False\n\n################################################################################\n#_______________________________________________________________________________\ndef ping(host):\n    if platform.system().lower() == 'windows':\n        ping_response = subprocess.Popen(&#91;\"ping\", \"-n\", \"1\", \"-w\", \"100\", host], stdout=subprocess.PIPE).stdout.read()\n        return find_pattern(ping_response, r'^byte=&#91;0-9]{1,}$')\n    \n    ping_response = subprocess.Popen(&#91;\"ping\", \"-c\", \"1\", \"-W\", \"100\", host], stdout=subprocess.PIPE).stdout.read()\n    return find_pattern(ping_response, r'^time=&#91;0-9\\.]{1,}$')\n\n################################################################################\n#_______________________________________________________________________________\ndef print_help():\n    print(\"&#91;E] Non hai specificato i parametri correttamente, usa:\")\n    print(\"    {} &lt;ip_mask> &#91;ip_start] &#91;ip_end]\".format(sys.argv&#91;0]))\n    print(\"    esempio:\")\n    print(\"    {} 192.168.0 1 254\".format(sys.argv&#91;0]))\n\n################################################################################\n#_______________________________________________________________________________\n# MAIN\n################################################################################\nif len(sys.argv) &lt; 2:\n    print_help()\n\n    exit (1)\nelse:\n    ip_net_mask = str(sys.argv&#91;1])\n    match = re.match(r'^(&#91;0-9]{1,3}\\.){2}&#91;0-9]{1,3}$', ip_net_mask)\n    if not match:\n        print(\"&#91;E] Il parametro maschera non corrisponde. (ex: 192.168.0)\")\n        exit(1)\n\n    try:\n        if len(sys.argv) >= 3:\n            ip_start = int(sys.argv&#91;2])\n        else:\n            ip_start = 1\n\n        if len(sys.argv) >= 4:\n            ip_end = int(sys.argv&#91;3])\n        else:\n            ip_end = 254\n\n        if ip_start &lt; 1:\n            ip_start = 1\n            print(\"&#91;A] ip_start non pu\u00f2 essere inferiore a 1.\")\n\n        if ip_end > 254:\n            ip_end = 254\n            print(\"&#91;A] ip_end non pu\u00f2 essere superiore a 254.\")\n\n    except:\n        print_help()\n\nassigned_ip_list = &#91;]\nfor ip in range(ip_start, ip_end):\n    scan_ip = ip_net_mask + \".\" + str(ip)\n    result = ping(scan_ip)\n    print(f\"Scanning dell'IP: {scan_ip}: {result}\")\n    if result == True:\n        assigned_ip_list.append(scan_ip)\n        ui = input(\"&#91;I] IP {} assegnato; premi INVIO per continuare o  x  per uscire: \".format(scan_ip))\n        if ui in &#91;\"x\", \"X\"]:\n            exit(0)\n    \nn = 1\nprint(\"&#91;I] Elenco degli IP assegnati:\")\nfor ip in assigned_ip_list:\n    print(\" - %3d: %s\" %(n, ip))\n    n += 1\n\n################################################################################\n#_______________________________________________________________________________\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La sintassi del programma \u00e8 la seguente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    net_scan.py &lt;ip_mask&gt; &#91;ip_start] &#91;ip_end]\n    esempio:\n    net_scan.py 192.168.0 1 254<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dove &#8220;&lt;ip_mask&gt;&#8221; \u00e8 la base degli indirizzi IP di qui si vuole fare lo scan; ad esempio, su Windows, possiamo aprire il prompt del DOS con <strong>Win+r<\/strong> ed ottenere l&#8217;indirizzo IP della macchina con <strong><em>ipconfig<\/em><\/strong> :<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"979\" height=\"512\" src=\"https:\/\/www.budus.it\/Blog\/wp-content\/uploads\/2020\/03\/immagine-2.png\" alt=\"\" class=\"wp-image-1163\" srcset=\"https:\/\/www.budus.it\/Blog\/wp-content\/uploads\/2020\/03\/immagine-2.png 979w, https:\/\/www.budus.it\/Blog\/wp-content\/uploads\/2020\/03\/immagine-2-300x157.png 300w, https:\/\/www.budus.it\/Blog\/wp-content\/uploads\/2020\/03\/immagine-2-768x402.png 768w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption>Esempio di risultato fornito da ipconfig; l&#8217;indirizzo IP sulla scheda ethernet 4 \u00e8 &#8220;192.168.42.38&#8221;<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dato l&#8217;ip della macchina la maschera di cui sopra \u00e8 rappresentata dalla prima tripletta di numeri &#8211; separati dal punto &#8211; che \u00e8: 192.168.42<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Volendo fare lo scan di tutta la LAN che utilizza un indirizzo compreso tra &#8220;192.168.42.1&#8221; e &#8220;192.168.42.254&#8221; possiamo usare:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>net_scan.py 192.168.42<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Se, invece, vogliamo solo fare lo scano di una <em>porzione della rete<\/em>, possiamo anche specificare la partenza ed eventualmente anche la fine, ad esempio:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>net_scan.py 192.168.42 38 39<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esegue lo scan di un solo indirizzo: 192.168.42.38<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In tutti i casi, alla fine, viene visualizzato un rapporto di tutti gli indirizzi IP eventualmente trovati raggiungibili.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">N.B.: <strong>Lo script \u00e8 stato realizzato per e con Python 3.8<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Premessa: si tratta di un esercizio per imparare il linguaggio e consente solo di fare il ping verso un range di indirizzi. Quindi: nulla di sofisticato, volevo solo crearmi qualcosa per verificare quali IP fossero raggiungibili nella LAN e &#8211; senza usare tools gi\u00e0 esistenti e fatti sicuramente meglio &#8211; ho semplicemente voluto farmi qualcosa &hellip; <a href=\"https:\/\/www.budus.it\/Blog\/python-network-scanner\/\" class=\"more-link\">Leggi tutto<span class=\"screen-reader-text\"> &#8220;Python: Network Scanner&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[57],"tags":[265,261],"class_list":["post-1160","post","type-post","status-publish","format-standard","hentry","category-development","tag-networking","tag-python"],"_links":{"self":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts\/1160","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/comments?post=1160"}],"version-history":[{"count":9,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts\/1160\/revisions"}],"predecessor-version":[{"id":1326,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts\/1160\/revisions\/1326"}],"wp:attachment":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/media?parent=1160"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/categories?post=1160"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/tags?post=1160"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}