iT邦幫忙

1

[已解決] shellscript 指令取得字串相同,字串比對結果卻 false

  • 分享至 

  • xImage

有大量的 linux 及 windows 檔案要比對,碰到一個奇怪狀況
先是個別取得 linux windows 檔案的 md5

sshpass -p ssh test@192.168.1.2 "certutil -hashfile c:/mylog.log MD5" 得到
MD5 ▒▒ c:/mylog.log ▒▒▒:
38e4b9e41b826d3e756ce5a9075bd8a1
CertUtil: -hashfile ▒R▒O▒▒▒\▒▒▒▒▒C

md5sum mylog.log 得到
38e4b9e41b826d3e756ce5a9075bd8a1  mylog.log

因此我寫了段 script 比對

TEST1=$(sshpass -p ssh test@192.168.1.2 "certutil -hashfile c:/mylog.log MD5" | awk 'NR==2{print}')
echo $TEST1
38e4b9e41b826d3e756ce5a9075bd8a1

TEST2=$(md5sum mylog.log|awk '{print$1}')
echo $TEST2
38e4b9e41b826d3e756ce5a9075bd8a1

看起來結果都相同,但實際比對卻有問題

[ "$TEST1" = "$TEST2" ] && echo true || echo false
false

那我如果把上面兩個結果各自

TEST1=38e4b9e41b826d3e756ce5a9075bd8a1
TEST2=38e4b9e41b826d3e756ce5a9075bd8a1
[ "$TEST1" = "$TEST2" ] && echo true || echo false 
true

想必當然一樣
因此我試試將原本取得結果用 echo 再賦值一次

TEST3=`echo $TEST1`
echo $TEST3
38e4b9e41b826d3e756ce5a9075bd8a1
TEST4=`echo $TEST2`
echo $TEST4
38e4b9e41b826d3e756ce5a9075bd8a1

看起來是一樣,但

if [[ "$TEST3" = "$TEST4" ]]; then echo true; else echo false; fi
false

我懷疑是不是有看不見的東西,但不知道怎麼顯示出來
想請問怎麼解決,感謝

看更多先前的討論...收起先前的討論...
wiseguy iT邦超人 1 級 ‧ 2023-02-24 10:06:53 檢舉
你的 $TEST1 awk 'NR==2{print}' 是直接印出第二行,含有換行字元
改為 awk 'NR==2{print $1 }' 試試看
vicentli iT邦研究生 4 級 ‧ 2023-02-24 12:24:59 檢舉
感謝提供的建議,我找到了
删除Windows文件“造成”的'^M'字符
tr -d '\n\r'
再轉 base64 就通了
淺水員 iT邦大師 6 級 ‧ 2023-02-24 17:32:20 檢舉
剛剛查了一下,md5sum 有 binary mode 可以用
`md5sum -b 目標檔案`
vicentli iT邦研究生 4 級 ‧ 2023-02-24 23:49:19 檢舉
謝謝,下周上班日我再試試看
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

4
JamesDoge
iT邦高手 1 級 ‧ 2023-02-24 01:35:34

你可以嘗試把 sshpass 指令執行的結果轉成 base64 編碼再做比對。具體作法如下:

TEST1=$(sshpass -p ssh test@192.168.1.2 "certutil -hashfile c:/mylog.log MD5" | awk 'NR==2{print}' | base64)
TEST2=$(md5sum mylog.log|awk '{print$1}' | base64)

if [[ "$TEST1" = "$TEST2" ]]; then echo true; else echo false; fi

這樣就可以排除原本字串中的控制字元或空白等問題。另外建議在比對字串前先使用 tr 指令刪除可能存在的換行字元:

TEST1=$(sshpass -p ssh test@192.168.1.2 "certutil -hashfile c:/mylog.log MD5" | awk 'NR==2{print}' | tr -d '\n' | base64)
TEST2=$(md5sum mylog.log|awk '{print$1}' | base64 | tr -d '\n')

if [[ "$TEST1" = "$TEST2" ]]; then echo true; else echo false; fi
vicentli iT邦研究生 4 級 ‧ 2023-02-24 12:24:51 檢舉

感謝提供的建議,我找到了
删除Windows文件“造成”的'^M'字符
tr -d '\n\r'
再轉 base64 就通了

我要發表回答

立即登入回答