Tell us what’s happening:
The port-scanner program I wrote passes all but the last two tests, where it has to scan the hostname ‘scanme.nmap.org’ and it returns six more ports than the test (and the port 22 is missing).
Traceback (most recent call last):
File "/home/runner/boilerplate-port-scanner/test_module.py", line 40, in test_port_scanner_verbose_hostname_multiple_ports
self.assertEqual(actual, expected, "Expected 'Open ports for scanme.nmap.org (45.33.32.156)\nPORT SERVICE\n22 ssh\n80 http'")
AssertionError: 'Open[57 chars]CE\n20 ftp\n21 ftp\n25 smtp\[70 chars]http' != 'Open[57 chars]CE\n22 ssh\n80 http'
Open ports for scanme.nmap.org (45.33.32.156)
PORT SERVICE
+ 22 ssh
- 20 ftp
- 21 ftp
- 25 smtp
- 43 whois
- 53 dns
- 67 dhcp
- 68 dhcp
80 http : Expected 'Open ports for scanme.nmap.org (45.33.32.156)
PORT SERVICE
22 ssh
80 http'
I cannot understand what is wrong with my code.
Your code so far
import socket
from common_ports import ports_and_services as pas
import re
def get_open_ports(target, port_range, verbose = False):
port_range[1] += 1
try:
ip = socket.gethostbyname(target)
except:
if re.search('[a-zA-Z]', target):
return "Error: Invalid hostname"
else:
return "Error: Invalid IP address"
url = socket.getfqdn(ip)
s = socket.socket()
s.settimeout(1)
portS = 'Open ports for ' + url
if url != ip:
portS += ' (' + ip + ')'
portS += '\nPORT SERVICE'
open_ports = []
for port in range(*port_range):
if s.connect_ex((ip, port)):
service = pas.get(port, None)
if service is not None:
portS += '\n' + str(port).ljust(4) + ' ' + service
open_ports.append(port)
if verbose is True:
return portS
return open_ports
Your browser information:
User Agent is: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36
Challenge: Port Scanner
Link to the challenge: