#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)
и когда я пытаюсь импортировать asfrom 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. Да, если вы используете только
Ответ №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
.