сканер портов в python

#python #sockets #irc

#python #сокеты #irc

Вопрос:

   if data.find('!scan') != -1:
     nick = data.split('!')[ 0 ].replace(':','')
     targetip = gethostbyname(arg)
     sck.send('PRIVMSG '   chan   " :" ' scanning host'   targetip   'rn')
     for i in range(20, 1025):
         s = socket(AF_INET, SOCK_STREAM)
         result = s.connect_ex((targetip, i))
         if (result == 0) :
              s.send('PRIVMSG '   chan   " :" 'port %d: OPEN' % (i,)   'rn')
         s.close()
  

Я пытаюсь закодировать небольшой сканер портов для моего IRC-бота, и я продолжаю получать эту ошибку..

 NameError: name 'gethostbyname' is not defined
  

Комментарии:

1. Я думаю, вы импортируете модуль сокета как import socket , а затем пытаетесь использовать функции без socket префикса. Используйте socket.gethostbyname , socket.socket socket.AF_INET или импортируйте как from socket import * (я предпочитаю первый подход). Он жалуется на gethostbyname потому что это происходит раньше, чем socket(AF_INET... .

2. @khachik У меня есть sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM) и когда я пытаюсь импортировать as from socket import * , я получаю эту ошибку AttributeError: type object '_socketobject' has no attribute 'gethostbyname'

Ответ №1:

 >>> import socket
>>> socket.gethostbyname('localhost')
'127.0.0.1'
  

Как уже упоминалось, убедитесь, что вы импортировали модуль сокета, и в зависимости от того, как вы это сделали, вы можете вызвать gethostbyname() .

Комментарии:

1. с socket.gethostbyname() я получаю эту ошибку TypeError: gethostbyname() argument 1 must be string, not list

2. Хорошо, тогда вы вызываете правильную функцию с неправильным аргументом, не могли бы вы сказать нам, что такое arg при вызове gethostbyname?

3. Попробуй отладочную печать, мой друг. Вы передаете список в gethostbyname() .

4. Да, если вы используете только print этот аргумент, вы должны четко видеть, что это список. Иногда я становился жертвой функций, которые возвращают список только с одним элементом, таких как struct.unpack().

Ответ №2:

В верхней части вашего скрипта это выглядит так, как будто вы выполнили:

 from socket import *
  

Или что-то «относительно» большое, которое переносит socket имена непосредственно в ваше глобальное пространство имен.

Вы не должны этого делать, потому что это плохая практика и вызывает проблемы, подобные той, с которой вы столкнулись, когда вы путаете socket.socket (класс) с socket (модулем). В вашем пространстве имен возникла путаница со всем, что импортируется из модуля сокета, а это очень много:

 >>> import socket
>>> len(socket.__all__)
241
  

( __all__ является переменной модуля, которая задает общедоступные имена для модуля и определяет, что экспортируется, когда кто-то выполняет from x import * над вашим модулем).

241 — это множество различных имен для импорта в глобальное пространство имен (при условии, что это так), и это дает вам много возможностей, на которых можно повеситься, вплоть до перезаписи или случайного повторного использования переменных, которые были импортированы из socket .

Ответ №3:

gethostbyname должны быть откуда-то импортированы? Попробуйте socket.gethostbyname() или что бы вы ни импортировали socket как.

Комментарии:

1. с sck.gethostbyname() я получаю эту ошибку AttributeError: '_socketobject' object has no attribute 'gethostbyname'

2. Да, я обнаружил, что это функция в модуле socket, попробуйте socket.gethostbyname (по крайней мере, на моем компьютере это работает).

Ответ №4:

Вы можете довольно легко выполнять сканирование портов примерно в 2 строки с помощью Scapy. Вы можете ввести DNS-имя вашей цели непосредственно в него. Если вам все еще нужен IP-адрес цели, не забудьте импортировать socket перед вызовом socket.gethostbyname .