Это простая программа сканирования портов. Здесь все работает хорошо. Не хватает только двух вещей.
Как создавать и сохранять, а также перезаписывать каждый вывод в файл.
Перед сканированием программа должна отправить ping к хосту, чтобы понять, что хост доступен, в противном случае должен выдать ошибку хосту, который недоступен.
#! /usr/bin/python3
import socket
import subprocess
import sys
import argparse
import pyfiglet # Install if you get any error, pip install pyfiglet==0.7.5
from datetime import datetime
def scan_ports(host, startPort='1', endPort='1025'):
# Clear the screen
subprocess.call('cls', shell=True)
ascii_banner = pyfiglet.figlet_format("PORT SCANNER")
print(ascii_banner)
# Ask for input
host = input("Enter a host to scan: ")
startPort = int(input("Enter beginning port number: "))
endPort = int(input("Enter end port number: "))
# Check what time the scan started
t1 = datetime.now()
# Print a banner with information on which host we are about to scan
print("-" * 60)
print("Please wait, scanning ---->", host)
print("Started at ", t1.strftime("%Y-%m-%d %H:%M:%S"))
print("Ports range ", startPort, "to", endPort)
print("-" * 60)
print('\n')
# Take the user input of 'startPort' and 'endPort' numbers and place them in a range
# These are the port numbers to be scanned
try:
hostIP = socket.gethostbyname(host)
for port in range(startPort, endPort):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(0.5)
result = sock.connect_ex((hostIP, port))
# print(result) - Can be used to test reply codes, 0=ok, 61=TCP RST, etc...
if result == 0:
print("Port {}: \t Open".format(port))
elif result == 61:
print("Port {}: \t Rejected by Host".format(port))
else:
print("Port {}: \t Close".format(port))
sock.close()
except KeyboardInterrupt:
print("You pressed Ctrl+C")
sys.exit()
except socket.gaierror:
print('Hostname could not be resolved. Exiting')
sys.exit()
except socket.error:
print('Socket creation failed. Error code: ' +
str(err_msg[0]) + ' Error message: ' + err_msg[1])
sys.exit()
# Check the time once scan is complete, and compare the start - end times.
t2 = datetime.now()
total = t2 - t1
# Print the scan time information
print('\n')
print('-' * 60)
print('Scanning Completed in: ', total)
print("Completed at ", t2.strftime("%Y-%m-%d %H:%M:%S"))
print('Host IP ----> ', hostIP)
print('-' * 60)
if __name__ == "__main__":
# Command line arguments
parser = argparse.ArgumentParser(description='Remote Port Scanner')
parser.add_argument('--host', action="store",
dest="hostIP", default='localhost')
parser.add_argument('--start-port', action="store",
dest="startPort", default=1, type=int)
parser.add_argument('--end-port', action="store",
dest="endPort", default=100, type=int)
# Parse arguments
given_args = parser.parse_args()
hostIP, startPort, endPort = given_args.hostIP, given_args.startPort, given_args.endPort
scan_ports(hostIP, startPort, endPort)