Python中的端口扫描器
if data.find('!scan') != -1:
nick = data.split('!')[ 0 ].replace(':','')
targetip = gethostbyname(arg)
sck.send('PRIVMSG ' + chan + " :" ' scanning host' + targetip + '\r\n')
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,) + '\r\n')
s.close()
我正在为我的IRC机器人编写一个小的端口扫描器,但我一直遇到这个错误..
NameError: name 'gethostbyname' is not defined
4 个回答
0
你是不是需要从某个地方导入 gethostbyname
呢?试试用 socket.gethostbyname()
,或者看看你导入的 socket
是什么名字。
1
在你脚本的开头,看起来你做了:
from socket import *
或者你引入了一些“相对”较大的东西,这直接把socket
的名字放到了你的全局命名空间里。
这样做是不应该的,因为这是一种不好的做法,会导致你遇到的问题,比如把socket.socket
(类)和socket
(模块)搞混。你的命名空间被从socket模块导入的所有东西搞得乱七八糟,这些东西可不少:
>>> import socket
>>> len(socket.__all__)
241
(__all__
是一个模块变量,用来指定模块的公共名称,并决定当有人执行from x import *
时,哪些内容会被导出)。
241个不同的名字要导入到全局命名空间里(假设是这样的话),这给你带来了很多麻烦,可能会导致你覆盖或意外重用从socket
导入的变量。
3
>>> import socket
>>> socket.gethostbyname('localhost')
'127.0.0.1'
如前所述,确保你已经导入了socket模块。根据你导入的方式,你可以调用 gethostbyname()
这个函数。