Python中的端口扫描器

1 投票
4 回答
2737 浏览
提问于 2025-04-16 15:40
  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() 这个函数。

撰写回答