python/scapy RandMAC() 问题

问题描述 投票:0回答:3

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

我尝试自己解决这个问题,查阅了文档。 但没有任何效果。

我的问题是

当我用

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

提前谢谢大家。

python scapy
3个回答
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
RandMAC
相同,但是例如如果你有一个随机整数,那么
_fix
会给你一个实际的整数,而
str
会给你它的字符串表示形式。

这些似乎都没有记录在案。不要对它在未来版本中仍然有效进行任何大赌注。 (但是,就其价值而言,

volatile.py
大约两年没有改变。)


1
投票

我不知道

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

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

0
投票

为什么不直接使用循环来打印它:

x=str(RandMAC())

for i in range(3):
  print(x)
© www.soinside.com 2019 - 2024. All rights reserved.