питон-скапи:как перевести номера портов в названия служб?
Вопрос
Уровень TCP в Scapy содержит исходный порт:
>>> a[TCP].sport
80
Есть ли простой способ преобразовать номер порта в имя службы?Я видел, как у Скапи TCP_SERVICES
и UDP_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
Кто-нибудь знает, как я могу сопоставить порты со службами?
Заранее благодарю вас
Решение
Если это то, что вам нужно делать часто, вы можете создать обратное отображение TCP_SERVICES
:
>>> TCP_REVERSE = dict((TCP_SERVICES[k], k) for k in TCP_SERVICES.keys())
>>> TCP_REVERSE[80]
'www'
Другие советы
Питоновский розетка модуль сделает это:
>>> import socket
>>> socket.getservbyport(80)
'http'
>>> socket.getservbyport(21)
'ftp'
>>> socket.getservbyport(53, 'udp')
'domain'
Это может сработать для вас (фильтрация словаря на основе значения):
>>> [k for k, v in TCP_SERVICES.iteritems() if v == 80][0]
'www'
Если вы используете unix или linux, есть файл /etc/services, который содержит это сопоставление.
Я нашел хорошее решение, заполняющее другой dict самостоятельно.MYTCP_SERVICES
for p in scapy.data.TCP_SERVICES.keys():
self.MYTCP_SERVICES[scapy.data.TCP_SERVICES[p]] = p
Не связан с StackOverflow