2

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

我试图自己解决它,查阅了文档。但没有任何效果。

我的问题是

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

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

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  

所以每次我调用 print X 时它都会改变。

我该如何解决这个问题?

我的代码如下。

from scapy.all import *

X = RandMAC()

print X
print X
print X

谢谢大家。

4

2 回答 2

3

RandMAC是一个类,当你调用RandMAC()你得到的是那个类的一个实例。scapy有很多这样的RandXXXXX类,它们的行为方式都相同:类的实例实际上是一种随机事物生成器,而不是固定(但随机选择)的事物。在这种情况下,aRandMac由 6 个RandBytes 构成,并且RandByte每次请求其值时,a 都会变成 0 到 255 之间的随机值。

我认为,这个想法是为了让构建(例如)一个 IP 数据包随机化器变得容易,它为您提供所有相同的 IP 数据包,除了为每个数据包随机选择几个字段。

因此,无论如何,对随机事物对象的许多操作都有效地委托给“修复”它们的结果(即,选择特定的随机值);见volatile.py源代码,类VolatileValue;魔法发生在__getattr__方法中。特别是,这适用于 stringifying via __str__,这是str()Lycha 观察到的和printKarun S 观察到的。

如果要获取单个随机值,最接近 Right Way 的方法可能是调用_fix方法:X = RandMAC()._fix(). 这恰好与strfor相同RandMAC,但例如,如果你有一个随机整数,那么_fix会给你一个实际的整数,同时str会给你它的字符串表示形式。

这些似乎都没有记录。不要对它在未来版本中仍然有效的任何大赌注。(但是,就其价值而言,volatile.py大约两年没有改变。)

于 2012-05-20T09:42:19.583 回答
1

我不知道是否RandMac有其他方法可以做到这一点,但你可以将它转换X成一个字符串,这样它就会保持不变。在您的代码中X实际上每次都调用一个函数。

X = str(RandMAC())
print X
print X
print X
于 2012-05-20T09:01:50.787 回答