#python #python-3.x #attributes #scapy #arp
#python #python-3.x #атрибуты #scapy #arp
Вопрос:
Я экспериментировал с scapy и Python 3, и я хочу использовать протокол ARP для поиска mac-адресов компьютеров в сети. Это мой код:
>>> packet = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=IP_OF_HOST))
Затем для извлечения данных из этого пакета я использовал следующую строку:
>>> packet[0][Ether].src
Однако по какой-то причине это приводит к ошибке:
AttributeError: 'list' object has no attribute 'src'
В каждом учебном пособии, которое я прочитал, использовался метод, который я использовал для извлечения данных поля, почему это не сработало бы для меня?
Комментарии:
1. Из сообщения об ошибке это выглядит как
packet[0][Ether]
список. Вы могли бы попытатьсяprint(packet[0][Ether])
посмотреть, что в нем.
Ответ №1:
Это связано с различием между функциями srp() и srp1() (которые предназначены для сетевого уровня 2, для уровня 3 вы бы использовали sr() и sr1() соответственно).
srp() отправляет пакет и сохраняет все пакеты, независимо от того, получили они ответ или нет. Чтобы получить, скажем, исходный MAC-адрес, я бы сделал это:
answered_packets, unanswered_packets = packet
for packet_i_sent, packet_i_received in answered_packets:
print(packet_i_received.src)
srp1() отправляет пакет, ожидает одного ответа и сохраняет только ответный пакет. Это означает, что формат отличается, поскольку вам не нужно иметь дело с неотвеченными пакетами, и мой предыдущий метод будет работать:
print(packet.src) #The [Ether] part doesn't matter,
#that's just for looking fancier when you print(packet)
Итак, в основном я использовал команду srp() и попытался расшифровать ответ, как я использовал srp1 ()