Генерация 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

Это не желаемый результат, так как я не хочу печатать каждую сумму sha256, я просто хочу закодировать строку и затем проверить ее. Если оно совпадает, то выведите совпадение, иначе совпадения нет

Ожидаемые результаты:

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

1 ответ

Решение

Печать линии, чтобы передать ее sha256 не будет печатать его на экране. Однако, если вы хотите захватить вывод sha256 вы захотите использовать подстановку команды вместо того, чтобы просто запустить команду.

Эта строка должна быть:

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

Мы будем использовать printf вместоecho а затем мы фиксируем stdout из конвейера и сохранить это в нашей переменной try, Также, sha256sum печатает файл, из которого он читал, в том числе stdinтак что мы будем использовать cut чтобы избавиться от этой части.

Другие вопросы по тегам