質問

本当に厄介な問題があり、それを数日間解決しようとしました。ネット上で情報が見つかりません。

ドキュメントを参照して自分で解決しようとしました。しかし、何も機能しません。

私の問題は

変数を代入するとき XRandMAC() 関数、 X 使うたびに同じになるはずです。

のように、 X = RandMAC(), 、そして言ってみましょう X 今でしょ AA:BB:CC:DD:EE:FFX を 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

皆様、よろしくお願いします。

役に立ちましたか?

解決

RandMAC はクラスであり、呼び出すと RandMAC() 取得するのはそのクラスのインスタンスです。 scapy これらをたくさん持っています RandXXXXX クラスであり、それらはすべて同じように動作します。クラスのインスタンスは実際には、固定された (ただしランダムに選択された) ものではなく、一種のランダムなものジェネレーターです。この場合、 RandMac 6 つの要素から構成されています RandByteと、 RandByte 値が要求されるたびに、0 から 255 までのランダムな値に変わります。

私の考えでは、そのアイデアは、(たとえば) パケットごとにいくつかのフィールドがランダムに選択されることを除いてすべて同じ IP パケットを提供する IP パケット ランダマイザーを簡単に構築できるようにすることです。

したがって、とにかく、ランダムなオブジェクトに対する多くの操作は、それらを「修正」した結果 (つまり、特定のランダムな値を選択したこと) に事実上委任されます。見る volatile.py ソースコードのクラス内で VolatileValue;魔法はそこで起こります __getattr__ 方法。特に、これは文字列化に当てはまります。 __str__, 、それは何ですか str() Lycha が観察したとおりに何をするか print Karun S が観察したとおりに行います。

単一のランダムな値を取得したい場合、正しい方法に最も近い方法はおそらく、 _fix 方法: X = RandMAC()._fix(). 。それはたまたま同じです str のために RandMAC, 、しかし、例えばランダムな整数がある場合 _fix 実際の整数が得られますが、 str 文字列表現が得られます。

これはどれも文書化されていないようです。将来のバージョンでも動作するかどうかに大きな賭けをしないでください。(しかし、それだけの価値があるのに、 volatile.py 2年くらい変わってないです。)

他のヒント

RandMacがこのような方法で行う方法があるかどうかわかりませんが、Xを文字列に変換することができます。あなたのコードでXは実際には毎回機能を呼び出します。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top