【问题标题】:python-scapy: how to translate port numbers to service names?python-scapy:如何将端口号转换为服务名称?
【发布时间】:2010-11-01 20:57:43
【问题描述】:

Scapy 中的 TCP 层包含源端口:

>>> a[TCP].sport
80

有没有简单的方法将端口号转换为服务名称?我见过 Scapy 有 TCP_SERVICESUDP_SERVICES 来翻译端口号,但是

print TCP_SERVICES[80] # fails
print TCP_SERVICES['80'] # fails
print TCP_SERVICES.__getitem__(80) # fails
print TCP_SERVICES['www'] # works, but it's not what i need
80

有人知道如何将端口映射到服务吗?

提前谢谢你

【问题讨论】:

    标签: python tcp scapy


    【解决方案1】:

    Python 的 socket 模块可以做到这一点:

    >>> import socket
    >>> socket.getservbyport(80)
    'http'
    >>> socket.getservbyport(21)
    'ftp'
    >>> socket.getservbyport(53, 'udp')
    'domain'
    

    【讨论】:

    • 我又添加了一个示例,因为即使您提供了文档的链接,它也几乎不会被注意到;希望你不介意。干杯+1 :)
    【解决方案2】:

    如果这是你需要经常做的事情,你可以创建一个TCP_SERVICES的反向映射:

    >>> TCP_REVERSE = dict((TCP_SERVICES[k], k) for k in TCP_SERVICES.keys())
    >>> TCP_REVERSE[80]
    'www'
    

    【讨论】:

    • 这是一个奇怪的字典(scapy.dadict.DADict 对象),它没有 .iteritems() 方法
    • 好的。我只是查看了 DADict 代码并更改了我的解决方案。
    【解决方案3】:

    这可能对您有用(根据值过滤字典):

    >>> [k for k, v in TCP_SERVICES.iteritems() if v == 80][0]
    'www'
    

    【讨论】:

      【解决方案4】:

      如果您使用的是 unix 或 linux,则有一个文件 /etc/services 包含此映射。

      【讨论】:

        【解决方案5】:

        我找到了一个很好的解决方案来填充另一个字典 self.MYTCP_SERVICES

        for p in scapy.data.TCP_SERVICES.keys():
          self.MYTCP_SERVICES[scapy.data.TCP_SERVICES[p]] = p 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-01
          • 2019-09-28
          • 2021-05-03
          • 2012-09-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多