!/빈/배시

!/빈/배시

정규식

Grep/Awk/Sed/Tr 등과 같은 텍스트 처리 프로그램을 사용하여 Nessus 보고서에서 IP 주소와 파일 경로를 추출해야 합니다.

IP 주소와 파일 경로를 분리하는 스크립트가 이미 있지만 텍스트를 추가로 처리하고 "원격 버전이 아직 패치되지 않았습니다..."를 제거해야 합니다.

192.168.1.1   - C:\WINDOWS\SYSTEM32\GPPREF.DLL HAS NOT BEEN PATCHED.    REMOTE VERSION : 6.2.9200.16384    SHOULD BE      : 6.2.9200.16859"

192.168.1.2 THE REMOTE HOST IS MISSING ONE OF THE FOLLOWING ROLLUP KBS :   - 4022719  - 4022722C:\WINDOWS\SYSTEM32\BCRYPT.DLL HAS NOT BEEN PATCHED.    REMOTE VERSION : 6.1.7601.23796    SHOULD BE      : 6.1.7601.23816"

192.168.1.3   - C:\WINDOWS\SYSTEM32\GPPREF.DLL HAS NOT BEEN PATCHED.    REMOTE VERSION : 6.2.9200.16384    SHOULD BE      : 6.2.9200.16859"

192.168.1.4   - C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL12.ACT7\MSSQL\BINN\SQLSERVR.EXE HAS NOT BEEN PATCHED.    REMOTE VERSION : 2014.120.5000.0    SHOULD BE      : 2014.120.5203.0"

따라서 최종 결과는 위의 예와 같이 다음과 같이 출력되어야 합니다.

192.168.1.1\WINDOWS\SYSTEM32\GPPREF.DLL

192.168.1.2\WINDOWS\SYSTEM32\BCRYPT.DLL

192.168.1.3\WINDOWS\SYSTEM32\GPPREF.DLL

192.168.1.4\프로그램 파일\마이크로소프트 SQL 서버\MSSQL12.ACT7\MSSQL\BINN\SQLSERVR.EXE



지금까지 내 스크립트는 다음과 같습니다.

!/빈/배시

*만약 ["$1"==""];

echo "No file specified."

echo "Usage: nesparse [filename.csv]"

기타

cat $1 | tr -d "\n" | tr "\r" "\n" | awk -F '","' '{ print $5,$13 }' | grep "has not been patched." | sort -u | awk '{ match($0,/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*[cC]:\\(.*) has.*/; ip=substr $0,RSTART,RLENGTH);print ipadd ip} '

*

다음 코드 섹션은 위 예제의 텍스트를 처리합니다. 여기서 $5는 IP 주소를 인쇄하고 $13은 파일 경로를 인쇄합니다.

!/빈/배시

* if [ "$1" == "" ];

echo "No file specified."

echo "Usage: nesparse [filename.csv]"

기타

cat $1 | tr -d "\n" | tr "\r" "\n" | awk -F '","' '{ print $5,$13 }' | 

grep "아직 패치되지 않았습니다." |

두 번째 awk 파이프라인

* awk '{는 ($0,/([0-9]+.[0-9]+.[0-9]+.[0-9]+)와 일치합니다.[참조]:\(.) 가지다. */ *

필요한 출력과 일치하는 올바른 정규식이 있지만(그림 참조) 정규식 출력을 인쇄하는 데 문제가 있습니다.

이것은 어느 줄입니까?

* ip=substr $0,RSART,RLENGTH);ipadd ip 인쇄} ' *

보너스 포인트:

IP 정규식은 모든 숫자와 일치하므로 192.168.1.1/1.1.1.1이지만 위 예의 버전 번호(2014.120.5203.0)와도 일치합니다. 이상적으로는 이 정규식을 수정해야 합니다. *[ 0-9]+.[0 - 9]+.[0-9]+.[0-9]+ *

0.0.0.0 --> 255.255.255.255로 제한하세요.

답변1

sed해결책:

sed -E 's/^(([0-9]+\.){3}[0-9]+).*(C:\\.+) *HAS NOT BEEN PATCHED.*/\1 - \3/' reportfile

답변2

$ sed -E -n -e '/ HAS NOT BEEN PATCHED/ {
                  s/^(\[[^]]*\]).*([A-Z]:)/\1 - \2/;
                  s/ HAS NOT BEEN PATCHED.*//p}' nessus.log
[IP address] - C:\WINDOWS\SYSTEM32\GPPREF.DLL
[IP address] - C:\WINDOWS\SYSTEM32\BCRYPT.DLL
[IP address] - C:\WINDOWS\SYSTEM32\GPPREF.DLL
[IP address] - C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL12.ACT7\MSSQL\BINN\SQLSERVR.EXE

일치하는 각 줄에 대해 HAS NOT BEEN PATCHEDIP 주소와 첫 번째 드라이브 문자( ) [A-Z]:사이의 모든 항목을 삭제합니다. "IP 주소"는 줄 시작 부분의 대괄호 안의 모든 항목으로 정의됩니다(닫는 대괄호( [^]]*) 아님). 그런 다음 HAS NOT BEEN PATCHED해당 줄부터 끝까지 모든 내용을 삭제 하고 수정된 줄을 인쇄합니다.

내 제안은 (공백, 대시, 공백) \t대신 IP 주소와 경로 이름 사이의 필드 구분 기호로 탭을 사용하는 것입니다 . -이렇게 하면 향후 작업이 더 쉬워질 것입니다.

정규식에는 / HAS NOT BEEN.../출력에 공백 문자가 남지 않도록 시작 부분에 공백이 포함되어 있습니다.

답변3

 sed -rn '/NOT BEEN PATCHED/ {s/(^\[.*\]).*C:(.*) HAS.*$/\1 - \2/p} ' filename

"패치되지 않은" 항목에 초점을 맞춘 다음 필요한 문자열 부분(괄호 안)을 꺼내고 두 부분(IP 주소 및 파일 이름)을 텍스트로 바꿉니다.

IP 주소는 항상 대괄호 안에 있다고 가정합니다. 그렇지 않은 경우 IP 주소와 패턴 일치가 필요합니다.

답변4

이상한 해결책 :

awk '/HAS NOT BEEN PATCHED/ { match($0,/\[.*\]/);ipadd=substr($0,RSTART,RLENGTH);match($0,/C.* HAS/);fle=substr($0,RSTART,RLENGTH-4);print ipadd" - "fle }' filename

"HAS NOT BEEN PATCHED"와 패턴 일치를 수행한 다음 awk의 일치 기능을 사용하여 IP 주소와 파일 이름을 추출합니다. 반환된 RSTART 및 RLENGTH 변수와 awk의 substr 함수를 사용하여 IP 주소 및 파일 이름과 관련된 문자열의 하위 부분을 가져옵니다. 생성된 ipad 및 fle 변수를 인쇄합니다.

관련 정보