我正在尝试编写一个基本脚本,逐行运行一个文件,用 sha256 加密每一行,然后将其与固定测试进行比较以获得匹配结果。
文件.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
最佳答案
打印该行以将其通过管道传输到 sha256
不会将其打印到屏幕上。但是,如果您想捕获 sha256
的输出,您需要使用命令替换而不是仅仅运行命令。
那一行应该是:
try="$(printf '%s' "$line" | sha256sum | cut -f1 -d' ')"
我们将使用 printf
instead of echo
然后我们从管道中捕获 stdout
并将其存储在我们的变量 try
中。此外,sha256sum
打印它正在读取的文件,包括 stdin
,因此我们将使用 cut
删除该部分。
关于bash - 从 bash 生成 sha256(无回显),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46374968/