#python-3.x #port-scanning
#python-3.x #сканирование портов
Вопрос:
Привет всем, я пытался создать сканер портов с помощью python3. Я попробовал один ранее, и он работал, но он не принимал аргументы напрямую, скорее мне пришлось запустить программу, а затем предоставить ей все детали. Поэтому я решил придумать сканер портов, который мог бы принимать аргументы. Это был мой код:
#!/usr/bin/env python3
import argparse
import os
import subprocess
import socket
#parsing arguments
parser=argparse.ArgumentParser()
#taking arguments
parser.add_argument("ip_addr", help="IPv4 address of the target")
parser.add_argument("-v", "--verbose", help="give output in verbosity (show even the closed ports)", action="store_true")
args=parser.parse_args()
print(args.ip_addr)
def __port__(port):
try:
s=socket.socket()
s.settimeout(0.5)
s.connect((args.ip_addr,port))
print(args.ip_addr)
return True
except:
return False
finally:
s.close()
if args.verbose:
for x in range (0,1025):
if __port__:
print("[ ] {}:{} is open".format(args.ip_addr,x))
else:
print("[ ] {}:{} is closed".format(args.ip_addr,x))
else:
for x in range (0,1025):
if __port__:
print("[ ] {}:{} is open".format(args.ip_addr,x))
Проблема в том, что каждый раз, когда я запускаю этот скрипт на любом IP-адресе, я открываю все порты.
Это результат моего скрипта:
192.168.1.1
[ ] 192.168.1.1:1 is open
[ ] 192.168.1.1:2 is open
[ ] 192.168.1.1:3 is open
[ ] 192.168.1.1:4 is open
[ ] 192.168.1.1:5 is open
[ ] 192.168.1.1:6 is open
[ ] 192.168.1.1:7 is open
[ ] 192.168.1.1:8 is open
[ ] 192.168.1.1:9 is open
[ ] 192.168.1.1:10 is open
[ ] 192.168.1.1:11 is open
[ ] 192.168.1.1:12 is open
[ ] 192.168.1.1:13 is open
[ ] 192.168.1.1:14 is open
[ ] 192.168.1.1:15 is open
[ ] 192.168.1.1:16 is open
[ ] 192.168.1.1:17 is open
[ ] 192.168.1.1:18 is open
[ ] 192.168.1.1:19 is open
[ ] 192.168.1.1:20 is open
[ ] 192.168.1.1:21 is open
[ ] 192.168.1.1:22 is open
[ ] 192.168.1.1:23 is open
[ ] 192.168.1.1:24 is open
[ ] 192.168.1.1:25 is open
[ ] 192.168.1.1:26 is open
[ ] 192.168.1.1:27 is open
[ ] 192.168.1.1:28 is open
[ ] 192.168.1.1:29 is open
...
...
...
[ ] 192.168.1.1:1002 is open
[ ] 192.168.1.1:1003 is open
[ ] 192.168.1.1:1004 is open
[ ] 192.168.1.1:1005 is open
[ ] 192.168.1.1:1006 is open
[ ] 192.168.1.1:1007 is open
[ ] 192.168.1.1:1008 is open
[ ] 192.168.1.1:1009 is open
[ ] 192.168.1.1:1010 is open
[ ] 192.168.1.1:1011 is open
[ ] 192.168.1.1:1012 is open
[ ] 192.168.1.1:1013 is open
[ ] 192.168.1.1:1014 is open
[ ] 192.168.1.1:1015 is open
[ ] 192.168.1.1:1016 is open
[ ] 192.168.1.1:1017 is open
[ ] 192.168.1.1:1018 is open
[ ] 192.168.1.1:1019 is open
[ ] 192.168.1.1:1020 is open
[ ] 192.168.1.1:1021 is open
[ ] 192.168.1.1:1022 is open
[ ] 192.168.1.1:1023 is open
[ ] 192.168.1.1:1024 is open
мой результат nmap показывает, что открыт только порт 80. Это мой вывод nmap:
Starting Nmap 7.91 ( https://nmap.org ) at 2020-10-18 11:54 IST
Nmap scan report for 192.168.1.1
Host is up (0.022s latency).
Not shown: 999 closed ports
PORT STATE SERVICE
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 0.45 seconds
Комментарии:
1.
if __port__:
для меня это не похоже на вызов функции. У него даже нет обязательного аргумента.
Ответ №1:
Вам нужно указать значение порта для __port__
вызова вашей функции (в противном if __port__
случае всегда true, потому __port__
что это имя функции) :
if args.verbose:
for x in range (0,1025):
if __port__(x):
print("[ ] {}:{} is open".format(args.ip_addr,x))
else:
print("[ ] {}:{} is closed".format(args.ip_addr,x))
else:
for x in range (0,1025):
if __port__(x):
print("[ ] {}:{} is open".format(args.ip_addr,x))
Комментарии:
1. Для незначительных изменений в исходном коде всегда лучше публиковать только измененные строки, чем копировать-вставлять полный код только для одного небольшого изменения и заставлять читателей играть в «найди различия»
2. Так-то лучше 🙂 Я бы лично просто поставил
if __port(x)__:
, поскольку это единственное и главное изменение, но это уже более читабельно3. спасибо, что нашли ошибку, я просто пропустил ее, не знаю, как!!