有大量的 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
我懷疑是不是有看不見的東西,但不知道怎麼顯示出來
想請問怎麼解決,感謝
你可以嘗試把 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