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また、変数名をすべて大文字以外の名前に変更することをお勧めします。

関連情報