Форум сайта python.su
Вот решил написать простой сканер портов. Просто ради интереса (в плане безопасности). Но возникли проблемы.
Вот сам код:
# -*- coding: cp1251 -*-
import socket
HOST = “www.anyhost.com.ua” # удаленный компьютер
# создаем список портов
ports = [21, 22, 23, 25, 38, 43, 80, 109, 110, 115, 118, 119, 143,
194, 220, 443, 540, 585, 591, 1112, 1433, 1443, 3128, 3197,
3306, 4000, 4333, 5100, 5432, 6669, 8000, 8080, 9014, 9200]
for i in ports:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.connect((HOST, i)) # соединяемся к порту, i - port
except:
continue # если порт закрыт, то переходим к следующему
result = sock.recv(1024) # очередная порция байтов
print “Получено:”, i, “порт: ”, result
sock.close()
Сначало все идет по плану. То есть, соединяемся с определенным портом, если нет коннекта, то переходим на следующий порт. Вот в этом вся проблема, когда цикл доходит то того порта, который закрыт - сканер, просто молчит, ничего не выводит о полученой информации о порте.
Пишет вроде вот этого:
Получено: 21 порт 220 web.anyhost.com.ua FTP server (Version 6.00LS) ready.
Получено: 22 порт SSH-2.0-OpenSSH_3.8.1p1 FreeBSD-20040419
Получено: 25 порт 220 mail.anyhost.com.ua ESMTP Postfix
| #вот тут молчит...
Офлайн
попробуй задать sock.settimeout(TIMEOUT)
Офлайн
Все нормально. Установил settimeout(1). Только вот, когда доходит до 80 порта, пишет:
Traceback (most recent call last):
File "E:\PHP_MySQL_Apache\Python25\Projects\Scaner.py", line 31, in <module>
result = sock.recv(1024)
timeout: timed out
Офлайн
ну да. для HTTP нужно протокол соблюдать =)
но то что порт открыт - ты уже знаешь.
а чтоб не вылетал с ошибкой - можно тоже обернуть:
try:
result = sock.recv(1024) # очередная порция байтов
except Exception, er:
print er
Офлайн
В документации по питону несколько иначе обрабатывают эксепшины (т.е. не все):
try:
buf = sock.recv(MSG_HEADER_SIZE-received)
except socket.error, msg:
if self.__verbose: print msg
else:
Смысл и результат будет тот-же, но мне так красивее, ИМХО
Да, и можно вместо settimeout(1) использовать значение поменьше, т.к. эта величина там в секундах, чтоб долго не ждать в некоторых случаях
Отредактировано (Сен. 11, 2007 10:11:22)
Офлайн
доброй ночи,подскажите в чем может быть проблема
пишет
SyntaxError: invalid syntax(line 57, offset 22): ‘except socket.error, e:’
пишу на python3.1
try:
self.connect((s, p))
except socket.error, e:
reason = utils.socket_error(e)
Отредактировано (Март 31, 2010 02:07:11)
Офлайн
senklerЕсли уж взяли третий питон, так пишите на третем питоне:
пишу на python3.1
try:
self.connect((s, p))
except socket.error as e:
reason = utils.socket_error(e)
Офлайн
PooHСпасибо.
Если уж взяли третий питон, так пишите на третем питоне:
Офлайн