1

私は最近、Microsoft Windows DHCP サーバーのダンプ ファイルを処理し、スプレッドシートの XML 形式を使用して現在の予約の XML ファイルを生成するスクリプトを Python で作成しました。

このスクリプトは、基本的に python open()コマンドを使用してファイルを開き、すべての行(ファイル内の行) を反復処理して、キーワードreservedipを探します。キーワードが見つかった場合、行は shlex split()コマンドを使用してフィールドに分割されます。

ただし、Microsoft DHCP サーバーの既定のダンプ ファイルを使用してこのスクリプトを実行すると、結果が得られません。また、Linux の grep コマンドを使用してファイルを検索できなかったことにも注意してください。

次に、ファイルをgeditで開き、UNIXテキストファイルとして保存しようとしました。これが完了すると、結果が得られ、ファイル内で grep できました。ただし、この方法では、作業を自動化するためにスクリプトを作成するという点がすべて無効になります。

私はグーグルで検索していましたが、探しているものを見つけることができませんでした. ファイルをバイナリモードで開いてみましたが、これも役に立ちませんでした。

誰かがこれで私を助けてくれることを願っています。

リクエストに応じて、スクリプトの動作 (少なくともループ部分) と DHCP サーバーの出力の例を次に示します。

脚本

# Setup an empty dictionary to store the extracted records
records = {}

# Open dhcp dump file
f = open(dhcp.txt, "r")

# Iterate file line by line
for line in f:

  # Only use line with the word "reservedip" in it
  if "reservedip" in line:

    # Split line into fields by spaces (excluding quoted substrings)
    field = shlex.split(line)

    # Add new entry for each record using the 32bit IP address int as it's key
    records[addr_to_int(field[7])] = [field[7], field[8], field[9], field[10]]

*注: addr_to_int は、ドット付き IPv4 アドレスを整数に変換する関数です*

DHCP ダンプ

残念ながら、会社のポリシーにより、実際の DHCP サーバーのダンプを含めることはできません。しかし、ファイルから取得しようとしている行は次のようになります。

DHCP サーバー \\servername.company.local スコープ 172.16.104.0 追加 reservedip 172.16.104.207 003386dd00gg "hostname.company.local" "ホストの説明" "BOTH"

前もってありがとう、パスカル

4

3 に答える 3

1

ファイル内のこれらの文字列のエンコードが、ASCII 互換の文字エンコードではない可能性があります。UTF-8 とラテン語は、ASCII の文字に正確に 1 バイトを使用するため、互換性があるはずです。UTF-16と UTF-32 は互換性がなく、常に 1 文字あたり 1 バイト以上を使用します。UTF-16 は MS ファイルでは珍しくなく、ファイルが混在していることさえあります。

おそらく、ASCII 文字の場合でも、ダンプは 2 バイトを使用します。次にr~e~s~e~r~v~e~d~i~p、ファイル内に~他のバイトを含めることができます~r(.~~r

実際のファイルを投稿することは許可されておらず、MS DHCP サーバーのダンプについては何も知らないため、単なる推測です。

何が

file file.txt

あなたを与える?

どうですか

file --mime-type --mime-encoding

「混合」バイナリ/文字列ファイルの場合、必ずしもエンコーディングがわかるわけではありませんが、プレーンな UTF/ASCII テキストの場合は、それがわかるはずです。

于 2012-12-17T12:42:15.767 に答える
1

これが行末文字の問題であることを解消する 1 つの方法は、re: を使用して行末文字を Unix スタイルにすることです。

import re

dhcp_file = open( path_to_dhcp_file, 'r' )
for line in dhcp_file:
    # Change en line char to UNIX style
    line = re.sub( "\r\n", r"\n", line )

    # now do your things on line
于 2012-12-17T10:28:16.510 に答える
1

DHCP ダンプ ファイルの内容の例として提供された 2 行に基づいて、次のテスト ケースを作成しました (この例を明確にするために、l1、l2、l3、... を先頭に追加しました)。各行、行番号を参照)

Linux Fedora Core 17 (x86_64) data.txt で作成したダンプ ファイルは次のとおりです。

l1: Dhcp Server \\servername.company.local Scope 172.16.104.0 Add reservedip 172.16.104.207 
l2: 003386dd00gg "hostname.company.local" "Host Description" "BOTH"
l3: Dhcp Server \\servername.company.local Scope 172.16.104.0 Add reservedip 172.16.104.207 
l4: 003386dd00gg "hostname.company.local" "Host Description" "BOTH"
l5: Dhcp Server \\servername.company.local Scope 172.16.104.0 Add  172.16.104.207 
l6: 003386dd00gg "hostname.company.local" "Host Description" "BOTH"
l7: Dhcp Server \\servername.company.local Scope 172.16.104.0 Add  172.16.104.207 
l8: 003386dd00gg "hostname.company.local" "Host Description" "BOTH"
l9: Dhcp Server \\servername.company.local Scope 172.16.104.0 Add reservedip 172.16.104.207 
l10: 003386dd00gg "hostname.company.local" "Host Description" "BOTH"  

あなたが言った:

また、Linux の grep コマンドを使用してファイルを検索できなかったことにも注意してください。

上記のサンプル ファイルで grep を実行すると、次のようになります。

$ cat data.txt | grep reservedip
l1: Dhcp Server \\servername.company.local Scope 172.16.104.0 Add reservedip 172.16.104.207 
l3: Dhcp Server \\servername.company.local Scope 172.16.104.0 Add reservedip 172.16.104.207 
l9: Dhcp Server \\servername.company.local Scope 172.16.104.0 Add reservedip 172.16.104.207 
$ 

また、スクリプトがサンプル ファイル内のキーワード「reservedip」を検出できるかどうかを確認するために、Python スクリプトを使用して行ったテストも次に示します。

lineNumber = 0
with open("./data.txt") as dhcpDumpFile:
    for line in dhcpDumpFile:
        lineNumber += 1
        if "reservedip" in line:
            print("Found 'reservedip' at the line: ", lineNumber)

そして、私が得る結果は次のとおりです。

$ python -tt myscript.py
("Found 'reservedip' at the line: ", 1)
("Found 'reservedip' at the line: ", 3)
("Found 'reservedip' at the line: ", 9)
$

だから、それは私のために働く。

よろしく、

ダリヨーシュ

于 2012-12-17T12:14:25.023 に答える