python / scapy RandMAC()问题

时间:2012-05-20 08:48:18

标签: python scapy

我有一个非常恼人的问题,我试图解决几天。 我在网上找不到任何信息。

我试图自己解决,咨询文件。 但没有任何作用。

我的问题是

当我使用X函数分配变量RandMAC()时,X每次使用时都应该相同。

赞,X = RandMAC(),让我们说X现在是AA:BB:CC:DD:EE:FF 当我打印X三次时,它应该是这样的。

X = AA:BB:CC:DD:EE:FF  
X = AA:BB:CC:DD:EE:FF  
X = AA:BB:CC:DD:EE:FF  

但代码实际上做的是

X = AA:BB:CC:DD:EE:FF  
X = 00:0A:0B:0C:0D:0E:0F  
X = 11:22:33:44:55:66  

所以每当我打印X时它都会改变。

我该如何解决这个问题?

我的代码如下。

from scapy.all import *

X = RandMAC()

print X
print X
print X

提前谢谢大家。

2 个答案:

答案 0 :(得分:3)

RandMAC是一个类,当你调用RandMAC()时,你得到的是该类的一个实例。 scapy有很多这些RandXXXXX类,它们都以相同的方式运行:类的实例实际上是一种随机事物生成器,而不是固定的(但随机选择) )事情。在这种情况下,RandMac由六个RandByte构建,RandByte每次要求其值变为0到255之间的随机值。

我认为,这个想法是为了轻松构建(例如)一个IP数据包随机数发生器,它为您提供完全相同的IP数据包,除了为每个数据包随机选择几个字段。

因此,无论如何,对随机事物对象的许多操作被有效地委托给“修复”它们的结果(即,选择特定的随机值);请参阅源代码中的volatile.py,类VolatileValue;魔术发生在__getattr__方法中。特别是,这适用于通过__str__进行字符串化,这是Lycha观察到的str()以及Karun S观察到的print所做的事情。

如果你想获得一个随机值,最接近正确方法的东西可能是调用_fix方法:X = RandMAC()._fix()。这恰好与str的{​​{1}}相同,但例如如果你有一个随机整数,那么RandMAC会给你一个实际的整数,而_fix会给你一个字符串表示。

这些似乎都没有记录在案。不要对它进行任何大赌注仍然可以在将来的版本中使用。 (但是,对于它的价值,str大约两年没有改变。)

答案 1 :(得分:1)

我不知道RandMac是否有办法以其他方式执行此操作,但您可以将X转换为字符串,这样它将保持不变。在您的代码X中,每次实际调用一个函数。

X = str(RandMAC())
print X
print X
print X