Bash를 사용하여 파일에서 변수를 읽을 때 이스케이프 문자 손실을 방지하는 방법

Bash를 사용하여 파일에서 변수를 읽을 때 이스케이프 문자 손실을 방지하는 방법

ntlm-extract.ntds다음 형식의 사용자 이름과 해시가 포함된 랩 파일이 있습니다 .domain\username:integer:hash:hash2

예를 들어: somedomain.local\jcricket:5201:0020cfaecd41954fb9c9da8c61ccacd7:0020cfaecd41954fb9c9da8c61ccacd7

LINE[3]/hash2열의 해시 값을 다음과 비교하고 있습니다 .NTLM HIBP 데이터베이스, 그리고 일치하는 사용자 이름을 인쇄하고 싶지만 시도한 모든 것이 계속 domain\username사라지고 읽거나 쓰는 동안 잃어버리는 것인지 확실하지 않습니다.\

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

#!/usr/bin/bash

while read line
do
    IFS=':' read -ra "LINE" <<< ${line}
    HASH=${LINE[3]}
    HASH=${HASH^^}
    printf "Checking for %s\n" $HASH
    found=(`grep "$HASH" "./pwned-passwords-ntlm-ordered-by-hash-v7.txt"`)
    if [ -n $found ]; then
        printf "Match on username %s\n" "${LINE[0]}"
    fi
done < "ntlm-extract.ntds"

제안 사항을 바탕으로 최종 작업 스크립트는 다음과 같습니다.

#!/usr/bin/bash

numoflines=(`wc -l ntlm-extract.ntds`)
numcomp=0
while IFS= read -r line; do
    IFS=: read -ra hashline <<< "${line}"
    passhash="${hashline[3]}"
    printf "Checking for %s\n" $passhash
    printf "Line %d of %d\n" $numcomp $numoflines
    numcomp=$((numcomp+1))
    found=''
    found=(`grep -m 1 -i "$passhash" "./pwned-passwords-ntlm-ordered-by-hash-v7.txt"`)
    wait 
    if [ -z "$found" ]; then
        continue
    else
        printf "found return value is %s\n" "$found"
        printf "%s\n" "${hashline[0]}" >> ./hibp-busted.txt
    fi
done < "ntlm-extract.ntds"

답변1

당신은 내부뿐만 아니라 -r외부도 필요합니다 . 선행 공백을 명시적으로 제거하려는 경우가 아니면 인용 하고 (아마도) 원해야 합니다.readread -a"${line}"IFS=

while IFS= read -r line; do 
  IFS=: read -ra LINE <<< "${line}"; printf '%s\n' "${LINE[@]}"
done < ntlm-extract.ntds
somedomain.local\jcricket
5201
0020cfaecd41954fb9c9da8c61ccacd7
0020cfaecd41954fb9c9da8c61ccacd7

LINE또한 변수 이름을 모두 대문자가 아닌 다른 이름으로 변경하는 것이 좋습니다 .

관련 정보