Если вы запустите эту команду на вашем Unix
echo -n "foo" | openssl dgst -sha1
Вы получите этот вывод:
(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
(сопровождается переводом строки).
Как я могу заставить openssl не показывать (stdin)=
префикс и избежать завершающего перевода строки?
Ответы:
Сырой двоичный формат не добавляет никаких посторонних выводов.
Выведите как двоичный файл, затем преобразуйте в шестнадцатеричный код:
Даст вам это:
Этот метод должен быть ориентирован на будущее в случае, если кто-то решит снова изменить формат текстового вывода. Я уверен, что они исправят префикс «SHA1 (stdin) =», чтобы он соответствовал вводу файла.
Я не могу поверить, что они изменили это! Интересно, сколько скриптов было сломано.
источник
-c 256
опцию, чтобы расширить его до 256 октетов на строку.Я наблюдаю такое поведение под OpenSSL 1.0.0e на Ubuntu 11.10, тогда как OpenSSL 0.9.8k и 0.9.8t выводят только хеш. Командная строка OpenSSL не предназначена для гибкости, это скорее быстрый и грязный способ выполнения криптографических вычислений из командной строки.
Если вы хотите использовать OpenSSL, отфильтруйте вывод:
В Linux (с инструментами GNU или BusyBox) вы можете использовать
sha1sum
, который не требует установки OpenSSL и имеет стабильный формат вывода. Он всегда печатает имя файла, поэтому удалите его.На системах BSD, включая OSX, вы можете использовать
sha1
.Все они выводят контрольную сумму в шестнадцатеричном формате с последующим переводом строки. Текст в системах Unix всегда состоит из последовательности строк, и каждая строка заканчивается символом новой строки. Если вы сохраните вывод команды в переменной оболочки, последний символ новой строки будет удален.
Если вам нужно передать данные в программу, которая требует контрольной суммы без окончательного перевода строки (что действительно редко), удалите перевод строки.
источник
Вот еще одна альтернатива:
источник
Вот способ сделать это, используя встроенные модули bash вместо pipe, awk, sed, tr, cut и т.д .:
источник