Java поворачивает string1 + string2 в конструкцию StringBuffer, добавьте (), и toString (). Это имеет смысл.
Однако в Java 1.4 и ранее, это сделало бы это для каждый + оператор в операторе отдельно . Это означало, что, делая + b + c приведет к два конструкции StringBuffer с два toString () вызовы. Если бы у Вас была длинная строка concats, это превратилось бы в реальную путаницу. Выполнение его самостоятельно означало, что Вы могли управлять этим и сделать это правильно.
Java 5.0 и выше, кажется, делает это более разумно, таким образом, это - меньше проблемы и является, конечно, менее подробным.
Ответ на вопрос с помощью Python зависит от вашей платформы. У меня нет Windows под рукой, поэтому следующее решение работает с Linux, на котором я его написал. Небольшое изменение регулярного выражения заставит его работать в OS X.
Во-первых, вы должны пропинговать цель. Это поместит цель - до тех пор, пока она находится в пределах вашей сетевой маски, как это звучит в данной ситуации - в кеш ARP вашей системы. Заметьте:
13:40 jsmith@undertow% ping 97.107.138.15
PING 97.107.138.15 (97.107.138.15) 56(84) bytes of data.
64 bytes from 97.107.138.15: icmp_seq=1 ttl=64 time=1.25 ms
^C
13:40 jsmith@undertow% arp -n 97.107.138.15
Address HWtype HWaddress Flags Mask Iface
97.107.138.15 ether fe:fd:61:6b:8a:0f C eth0
Зная это, вы совершаете небольшую магию подпроцесса - в противном случае вы сами пишете код проверки кэша ARP, и вы не хотите этого делать:
>>> from subprocess import Popen, PIPE
>>> import re
>>> IP = "1.2.3.4"
>>> # do_ping(IP)
>>> # The time between ping and arp check must be small, as ARP may not cache long
>>> pid = Popen(["arp", "-n", IP], stdout=PIPE)
>>> s = pid.communicate()[0]
>>> mac = re.search(r"(([a-f\d]{1,2}\:){5}[a-f\d]{1,2})", s).groups()[0]
>>> mac
"fe:fd:61:6b:8a:0f"
Похоже, вы хотите отслеживать спуферы ARP? В этом случае все, что вам нужно, это arpwatch , доступный в каждом хорошо поставляемом дистрибутиве Linux рядом с вами. Загрузите источники здесь: http://ee.lbl.gov/
Не так давно на этом сайте был дан аналогичный вопрос . Как упоминалось в ответе, выбранном тем, кто задает этот вопрос, Python не имеет встроенного способа сделать это. Вы должны либо вызвать системную команду, например arp
, чтобы получить информацию ARP, либо сгенерировать свои собственные пакеты, используя Scapy .
Изменить: Пример с использованием Scapy со своего веб-сайта :
Вот еще один инструмент, который постоянно контролировать все интерфейсы на машина и распечатайте все запросы ARP видит, даже на кадрах 802.11 из Карта Wi-Fi в режиме монитора. Обратите внимание store = 0 параметр для sniff (), чтобы избежать сохранение всех пакетов в памяти для ничего.
#! /usr/bin/env python
from scapy import *
def arp_monitor_callback(pkt):
if ARP in pkt and pkt[ARP].op in (1,2): #who-has or is-at
return pkt.sprintf("%ARP.hwsrc% %ARP.psrc%")
sniff(prn=arp_monitor_callback, filter="arp", store=0)
Не совсем то, что вы ищете, но определенно на правильном пути. Наслаждайтесь!