0

環境

FINDSTR /C:"portid=" "scanports.xml"ファイルから次の行を抽出するために使用します。

<port protocol="tcp" portid="21"><state state="open" reason="syn-ack" reason_ttl="124"/><service name="ftp" method="table" conf="3"/></port>
<port protocol="tcp" portid="22"><state state="open" reason="syn-ack" reason_ttl="124"/><service name="ssh" method="table" conf="3"/></port>
<port protocol="tcp" portid="80"><state state="open" reason="syn-ack" reason_ttl="124"/><service name="http" method="table" conf="3"/></port>
<port protocol="tcp" portid="443"><state state="open" reason="syn-ack" reason_ttl="124"/><service name="https" method="table" conf="3"/></port>
<port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="124"/><service name="ms-term-serv" method="table" conf="3"/></port>

質問

  • この行から212280443およびを抽出する方法は?3389
  • 、、、および?[0-9]以外の乱数に対する同じ質問2122804433389

通常開いていないすべての開いているポートをメールで送信したい。

4

4 に答える 4

3

2 番目の FINDSTR を使用して、「通常開いている」ポートを除外できます。私が示すソリューションでは、外部ファイルを使用して、除外するポート (通常開いているポート) をリストします。または、リストを複数のオプションとしてコマンド ラインで指定することもでき/Cます。

ignore.txt (必要に応じて編集)

portid="21"
portid="22"
portid="80"
portid="443"
portid="3389"

findstr /c:"portid=" test.txt | findstr /r /v /g:"ignore.txt"

FINDSTR には、長さが異なる複数のリテラル検索文字列がある場合、一致を見つけられない可能性があるというバグがあります。/Rこれが、正規表現オプションを使用することにした理由です。

XML ファイルの形式が一貫している場合は、DELIMS を引用符に設定して FOR /F を使用し、4 番目のトークンを取得できます。区切り文字として引用符を使用して FOR /F オプションを指定する構文は奇妙です。通常、次のようにし"tokens=4 delims=,"ます。ただし、引用符を区切り文字として含めるには、一連のエスケープを行う必要がありますtokens^=4^ delims^=^"

すべてをまとめると、

@echo off
for /f tokens^=4^ delims^=^" %%P in (
  'findstr /c:"portid=" test.txt ^| findstr /r /v /g:"ignore.txt"'
) do (
  echo unusual open port = %%P
)
exit /b

XML の形式 (属性の順序) が異なる場合、ソリューションはより複雑になります。最初に外側の FOR /F を使用して、行全体を変数に読み込みます。SET * search and replace op を使用して、文字列内のポート ID の場所を見つけてから、2 番目の FOR /F を使用して実際のポートを解析します。

setlocal enableDelayedExpansion
for /f "delims=" %%L in (
  'findstr /c:"portid=" test.txt ^| findstr /r /v /g:"ignore.txt"'
) do (
  set "ln=%%L"
  for /f delims^=^=^" %%A in ("!ln:*portid=!") do set port=%%A
  echo unusual open port = !port!
)

ポート ID を分離したら、メール メッセージを作成する準備が整います。Blat for Windowsを使用してメールを送信することをお勧めします。

于 2012-02-08T19:44:21.983 に答える
1

行の解析にはFOR/Fを使用できます。

FINDSTR /C:"portid=" "scanports.xml" > tmpFile.tmp

FOR /F "tokens=3 delims=>=" %%1 in (tmpFile.tmp) DO (
  echo %%~1
)
于 2012-02-08T19:02:22.517 に答える
0

jeb の回答このリンクでスクリプトを終了します。

コード:

@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION

REM Blat options:
SET blat="C:\Program Files (x86)\blat276\full\blat.exe"
SET server=127.0.0.1
SET port=25
SET from=x@x.com
SET to=y@y.com

FOR %%i IN (1,1,9) DO (  
  "C:\Program Files (x86)\Nmap\nmap.exe" server%%i.com -oX scanports%%i.xml

  FINDSTR /C:"portid=" scanports%%i.xml >> scanports%%itemp.txt

  FOR /F "tokens=*" %%a IN (scanports%%itemp.txt) DO (
    SET x=%%a
    SET x=!x:"=/!
    FOR /f "tokens=4,12 delims=/" %%a IN ("!x!") DO (
      IF NOT %%a==21 IF NOT %%a==22 IF NOT %%a==80 IF NOT %%a==443 IF NOT %%a==3389 (
        %blat% -server %server% -port %port% -f %from% -to %to% -html -s "Port ouvert sur server%%i" -body "Port %%a : %%b"
      )
    )
  )
  
  DEL scanports%%i.xml
  DEL scanports%%itemp.txt
)
于 2012-02-08T19:53:25.667 に答える