2017-09-23 87 views
2

我想写一个逐行运行的基本脚本,每行加密sha256,然后将其与固定测试进行比较以匹配结果。从bash生成sha256(无回声)

file.txt

foo 
bar 
bazz 
password 

我的代码:

#!/bin/bash 
file="./file.txt" 
while IFS='' read -r line || [[ -n "$line" ]] ; do 
    password="5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8" 
    echo "Testing $line: " 
    try=$line | sha256sum 
    if [[ "$try" == "$password" ]] ; then 
     echo "match" 
    else 
     echo "no match" 
    fi 
done <"$file" 

结果:

testing foo 
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 - 
no match 
testing bar 
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 - 
no match 
testing bazz 
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 - 
no match 
testing password 
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 - 
no match 

相信try=$line | sha256sum这里成为问题,因为如果我本身运行它使用的例子来自file.txt

foo | sha256sum 
foo: command not found 
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 - 

在“”配售foo不会改变上述

我能得到它正确处理管道的唯一办法,结果是放置在前面echo

echo -n foo | sha256sum 
2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae 

这不是我想要的结果,因为我不想打印每个sha256sum我只想对行进行编码,然后检查它。如果匹配,则打印匹配,否则不匹配。

预期结果:

testing foo #2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae - 
no match 
testing bar #fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9 - 
no match 
testing bazz #ef9b462f01f881c97791114d6244476bb33e418d3dbe0ee0967c4c80e764cd9c - 
no match 
testing password #5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 - 
match 

回答

3

打印线,以管它sha256不会将其打印到屏幕上。但是,如果要捕获sha256的输出,则需要使用命令替换而不是仅运行该命令。

这行应该是:

try="$(printf '%s' "$line" | sha256sum | cut -f1 -d' ')" 

我们将在我们的变量try使用printf instead of echo,然后我们从管道捕捉stdout和存储。另外,sha256sum将打印它正在读取的文件,其中包括stdin,因此我们将使用cut来摆脱该部分。

+0

感谢解决方案附带的解释!真的帮助新人出去! :d – Ben