Выполняется только последний элемент цикла For
Имею код содержания ниже. Его цель - доставать поочередно хосты из одного файла (data.txt), сканить порты и помещать в другой файл (results.txt). Представлял себе его работу примерно следующим образом: он открывает оба файла, через цикл for достает первую строку - первый хост, после чего опять же через цикл for прогоняет его по всем имеющимся портам. В случае успешного коннекта - делает запись в файле, и как только у одного хоста все порты перебраны, переходит к следующему.
На практике он пролетает все хосты в файле, кроме последнего. При этом принт, который идет для каждого хоста и выводит Scanning {host} срабатывает для всех хостов, то есть он их все ж таки перебирает. Однако во вложенный for заходит лишь для последнего элемента.
Объясните, пожалуйста, в чем проблема? Можно и альтернативные варианты решения, но для меня главное понять - почему оно не работает именно в этом варианте?
import socket
ports = [20, 21, 22, 23, 25, 42, 43, 53, 67, 69, 80, 110, 115, 123, 137, 138, 139,
143, 161, 179, 443, 445, 514, 515, 993, 995, 1080, 1194, 1433, 1702, 1723,
3128, 3268, 3306, 3389, 5432, 5060, 5900, 5938, 8080, 10000, 20000]
print("Wait till scanning ports!")
fdata = open('data.txt', "r")
fres = open('results.txt', "a")
for host in fdata:
print(f"Scanning {host}")
for port in ports:
sckt = socket.socket()
sckt.settimeout(1)
try:
sckt.connect((host, port))
except socket.error:
pass
else:
fres.write(f"At {host} : port {port} is active! \n")
sckt.close()
print("Scan is complete!")
Ответы (1 шт):
Очевидно, что все строки в файле с хостами, кроме последней, заканчиваются переводом строки и вы пытаетесь открыть хосты вида '127.0.0.1\n', что приводит к ошибкам. Удалите перевод строки, например, так sckt.connect((host.rstrip(), port)) или иным подходящим вам образом. А так код нормально работает.