2012-02-08 2 views
0

상황

내가 파일에서 논문 라인을 추출하는 FINDSTR /C:"portid=" "scanports.xml"를 사용하여 메일을 보내는 바람직하지 않은 포트를 추출 :Nmap은 : 일괄 및 BLAT

<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> 

질문

  • 어떻게 21를 추출, 22, 80, 4433389이 줄의? 21, 22, 80, 4433389 제외 [0-9]에서 임의의 숫자에 대한
  • 같은 질문?

열려있는 모든 포트를 이메일로 보내고 싶습니다.

답변

3

두 번째 FINDSTR을 사용하여 "정상적으로 열려있는"포트를 필터링 할 수 있습니다. 필자가 제시 한 솔루션은 외부 파일을 사용하여 제외 할 포트 (정상적으로 열린 포트)를 나열합니다. 또는 명령 행에서 여러 개의 /C 옵션으로 목록을 지정할 수도 있습니다.

ignore.txt (필요에 따라 편집)

portid="21" 
portid="22" 
portid="80" 
portid="443" 
portid="3389" 
는 서로 다른 길이의 여러 문자 검색 문자열이있는 경우 일치하는 항목을 찾을 실패 할 수 있다는 점에서 FINDSTR 버그가 있습니다

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

. 이것이 내가 정규식 옵션 인 /R을 사용하기로 선택한 이유입니다.

XML 파일의 형식이 일치하면 FOR/F를 DELIMS를 인용 부호로 설정하여 4 번째 토큰을 추출 할 수 있습니다. 따옴표로 구분 기호로 FOR/F 옵션을 지정하는 구문은 홀수입니다. 일반적으로 "tokens=4 delims=,"과 같은 작업을 수행합니다. 단락 기호로 따옴표를 포함하려면 다음을 수행해야합니다. tokens^=4^ delims^=^". 는 XML은 다를 수의 형식 (주문 속성) 경우 모든 퍼팅

함께 당신은 그 솔루션이 더 복잡,

@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 

얻을. 먼저 FOR/F 바깥 쪽을 사용하여 전체 행을 변수로 읽습니다. SET * 검색을 사용하여 문자열 내의 portid 위치를 찾기 위해 op를 대체 한 다음 실제 포트를 구문 분석하기 위해 두 번째 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을 사용하는 것이 좋습니다.

+0

나는 대본을 끝내었지만 감사합니다. 나는 당신의 대답을 읽었습니다. :) –

+0

시간을 악용해서 정말 죄송합니다. –

1

줄을 구문 분석하는 데 FOR/F를 사용할 수 있습니다.

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

FOR /F "tokens=3 delims=>=" %%1 in (tmpFile.tmp) DO (
    echo %%~1 
) 
+0

방금''가 아닌'21'이 필요합니다. 하지만 당신의 대답이 나를 도왔습니다. 고마워요! –

0

내 스크립트는 jeb's answerthis link으로 끝납니다.

코드 :

@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 [email protected] 
SET [email protected] 

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 
) 
1

이 조금 부정 행위이지만, VBScript를 스크립트를 호출 할 수있는 배치 파일 :

scanports.vbs 다음 스크립트
c:\windows\system32\cscript.exe //nologo scanports.vbs 

:

Option Explicit 
Dim xml, port 
Set xml = CreateObject("Microsoft.XMLDOM") 
xml.load "scanports.xml" 
For Each port in xml.documentElement.selectNodes("//port") 
    WScript.Echo port.getAttribute("portid") 
Next