web-dev-qa-db-ja.com

SnetのインストールがOS Xでdnetインポートエラーで失敗する

Scapyのインストールに問題があり、依存関係が必要です。私はソリューションのグーグルに時間を費やしましたが、すべての「ソリューション」は古いバージョンのPythonに影響を与えるか、単に機能しないようです。

脚本:

#!/usr/bin/python

import threading
import Queue
import time
from scapy.all import *

class WorkerThread(threading.Thread) :

    def __init__(self, queue, tid) :
        threading.Thread.__init__(self)
        self.queue = queue
        self.tid = tid
        print 'Worker: %d' %self.tid

    def run(self) :
        total_ports = 0
        while True :
            port = 0
            try :
                port = self.queue.get(timeout=1)
            except Queue.Empty :
                print 'Worker %d exiting. %d ports scanned'  %(self.tid, total_ports)

                return

                #Scanning begins

            ip = sys.argv[1]
            response = sr1(IP(dst=ip)/TCP(dport=port, flags='S'), verbose=False, timeout=.2)


            if response :
                if response[TCP].flags == 18 :

                    print 'ThreadID: %d: Got port no. %d status: OPEN' %(self.tid, port)
                self.queue.task_done()
                total_ports += 1

queue = Queue.Queue()

threads = []
for i in range(1, 10) :
    print 'Creating WorkerThread : %d' %i
    worker = WorkerThread(queue, i)
    worker.setDaemon(True)
    worker.start()
    threads.append(worker)
    print 'WorkerThread %d created' %i

for j in range(1, 100) :
    queue.put(j)

queue.join()

for item in threads :
    item.join()

print 'Scanning complete'

Pythonのバージョンは2.7.5で、Pythonへのパスが確認されています。

which python
/usr/bin/python

スクリプトを実行すると、次のエラーが発生します。

./multi-threaded-scanner.py
Traceback (most recent call last):
  File "./multi-threaded-scanner.py", line 6, in <module>
    from scapy.all import *
  File "/Library/Python/2.7/site-packages/scapy/all.py", line 16, in <module>
    from Arch import *
  File "/Library/Python/2.7/site-packages/scapy/Arch/__init__.py", line 75, in <module>
    from bsd import *
  File "/Library/Python/2.7/site-packages/scapy/Arch/bsd.py", line 12, in <module>
    from unix import *
  File "/Library/Python/2.7/site-packages/scapy/Arch/unix.py", line 20, in <module>
    from pcapdnet import *
  File "/Library/Python/2.7/site-packages/scapy/Arch/pcapdnet.py", line 160, in <module>
    import dnet
ImportError: No module named dnet

ScapyとPythonインタラクティブインタープリターを使用してimport scapy Pythonインタプリタではエラーは発生しません。スクリプトが最初に実行されたとき、pcapyモジュールがありませんでしたが、それをインストールしてから、問題がdnetに切り替わりました。 同様の投稿 は同じ問題を説明しているようですが、回避策は効果がありません。

Pcapyおよびlibdnetのインストールに使用されるコマンド:

libdnet-1.11.tar.gz(2005年1月19日)

` ~/Downloads/libdnet-1.11    
chmod a+x configure
 ~/Downloads/libdnet-1.11    
./configure  && make`

正常に終了します

Pcapy:2010年8月26日更新の最新の安定版リリース(0.10.8)

~/Downloads/pcapy-0.10.8 
Sudo python setup.py install Password: running install running build running build_ext running build_scripts running install_lib running install_scripts changing mode of /usr/local/bin/96pings.pcap to 777 changing mode of /usr/local/bin/pcapytests.py to 777 running install_data running install_Egg_info Removing /Library/Python/2.7/site-packages/pcapy-0.10.8-py2.7.Egg-info Writing /Library/Python/2.7/site-packages/pcapy-0.10.8-py2.7.Egg-info ~/Downloads/pcapy-0.10.8 

新しいフラグでコンパイルした結果

 ~/Downloads/libdnet-1.12    
Sudo CFLAGS='-Arch i386 -Arch x86_64' ./configure --prefix=/usr and archargs='-Arch i386 -Arch x86_64' make
configure: WARNING: you should use --build, --Host, --target
configure: WARNING: you should use --build, --Host, --target
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
/Users/richardcurteis/Downloads/libdnet-1.12/config/missing: Unknown `--is-lightweight' option
Try `/Users/richardcurteis/Downloads/libdnet-1.12/config/missing --help' for more information
configure: WARNING: 'missing' script is too old or missing
checking for a thread-safe mkdir -p... config/install-sh -c -d
checking for gawk... no
checking for mawk... no
checking for nawk... no
checking for awk... awk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking build system type... Invalid configuration `and': machine `and' not recognized
configure: error: /bin/sh config/config.sub and failed
 ~/Downloads/libdnet-1.12   
19
3therk1ll

[〜#〜] edit [〜#〜]- 以下のこの回答 言及されたすべての問題が修正されたと述べており、はるかに簡単ですインストール方法。ただし、そのコメントは、OS X 10.10 YosemiteおよびOS X 10.11 El Capitanで動作するように見えても失敗する可能性があることを示唆しています他の特定のバージョンの場合。


libdnetのインストールガイド に記載されているように、 Scapy とそのPythonラッパー)のインストールが完了していません:

$ wget https://github.com/dugsong/libdnet/archive/libdnet-1.12.tar.gz
$ tar xfz libdnet-1.12.tgz
$ ./configure
$ make
$ Sudo make install
$ cd python
$ python2.5 setup.py install

システムが64ビットの場合は、代わりに次のコンパイルコマンドを使用します。

$ CFLAGS='-Arch i386 -Arch x86_64' ./configure
$ archargs='-Arch i386 -Arch x86_64' make

さらに、正しいバージョン、つまり1.11ではなく1.12がインストールされていることを確認してください。

それでも失敗する場合は、macportsを使用してインストールし、そのdnet.soファイルを使用して説明します こちら

$ port selfupdate
$ port upgrade outdated
$ port install py27-libdnet
$ port install libdnet 
$ cp /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/dnet.so /Library/Python/2.7/site-packages

そのリンクでは、/Library/Python/2.7/site-packages/scapy/Arch/unix.pyの一部のコードを変更することも推奨しています(OSError: Device not configuredを修正)。

34行目を次のように変更します。

f=os.popen("netstat -rn") # -f inet

に:

f=os.popen("netstat -rn | grep -v vboxnet") # -f inet

次のように:

def read_routes():
    if scapy.Arch.SOLARIS:
#       f=os.popen("netstat -rvn") # -f inet
        f=os.popen("netstat -rn | grep -v vboxnet") # -f inet

それでもエラーOSError: Device not configuredが発生する場合は、 この回答 の説明に従って、if句の他のブランチ(具体的には、elseブランチ)に同様の変更を行ってください。

15
Yoel

上記の問題はすべて修正されたようです。 OS X Yosemiteを実行しています。次の3つのコマンドを実行するだけで、動作するscapyを取得しました。

brew install --with-python libdnet
pip install pcapy
pip install scapy
16
Tim Wu

私はOSX 10.5.9を実行しています-scapyを動作させるために永遠に費やしました-dnet/pcapライブラリをインストールした後、 "OSError:Device not configured"も取得しました。 unix.pyの34行目を次のように置き換えてみました

"netstat -rn | grep -v vboxnet"

それでも同じエラーが発生します。しかし、ifブロックの「else」の部分で37行目を変更すると、次のようになります。

def read_routes():
    if scapy.Arch.SOLARIS:
        f=os.popen("netstat -rvn") # -f inet
    Elif scapy.Arch.FREEBSD:
        f=os.popen("netstat -rnW") # -W to handle long interface names
    else:
        # f=os.popen("netstat -rn") # -f inet
        f=os.popen("netstat -rn | grep -v vboxnet") # -f inet

魅力的な作品!

2
Adam B

(これは Tim W の回答へのコメントですが、そうするための評判がありません)

Brewが実際に伝えていることを行うことを覚えておいてください。

==>警告
Pythonモジュールがインストールされており、HomebrewのサイトパッケージがPython sys.pathにないため、この式がインストールされたモジュールをインポートできません。
これらのモジュールを使用して開発する場合は、次を実行してください:[...]

mkdir -p /Users/YourUsernameHere/Library/Python/2.7/lib/python/site-packages
echo 'import site; site.addsitedir("/usr/local/lib/python2.7/site-packages")' >> /Users/YourUsernameHere/Library/Python/2.7/lib/python/site-packages/homebrew.pth

したがって、brewコマンドを再実行して、インストールされているすべてのbrew pythonパッケージを使用するように指示している2行を実行します。

2
MeFisto94

OSX El Capitanでは、pipにSudoを使用してpcapyを再インストールするように強制するのがうまくいきました:Sudo pip install --user pcapy -I

0
Josep Valls