Это невозможно без другого инструмента или без редактирования реального скрипта/бинарного файла sha1sum. Когда sha1sum получает файл, он печатает имя файла после суммы. Когда sha1sum не передает файл или используется с каналом. Он помещает -в качестве заполнителя, чтобы указать, что ввод не был файлом.
h=($(echo test | sha1sum )) ;echo $h
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83
или
h=( `echo test | sha1sum` ) ;echo $h
В bash используется объявление «Array» для h, создающее мультииндексный массив токенов. повторное обращение к переменной с массивом индексов $h аналогично ${h[0]}
h=`echo test | sha1sum` ;echo ${h// */}
или posix shell (sh, dash, bash )для удаления суффикса с%
h=`echo test | sha1sum` ;echo ${h%-}
также может быть успешным, хотя использование массивов является более интуитивным выбором.
xxd + base64 можно использовать для увеличения энтропии (уменьшения количества битов )в диапазонах печатных символов
h=($(echo test | sha1sum )) ;echo $h|xxd -r -p |base64
ThJDvSLGbnbCup7dwfkTlOV/n4M=
Поймите, что эхо добавляет новую строку в конце, которая изменяет хэш:
$ echo test | sha1sum
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83 -
$ echo -n test | sha1sum
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 -
Но нет, нельзя заставить sha1sum печатать только хэш. Причина в том, что строка на самом деле является закодированной строкой. Строка может начинаться с \
и второго пробела (да, есть два )между хешем, а имя файла может стать *
, чтобы указать binary
хэш (, полезный в DOS):
$ echo "hello" >'a\file'
$ md5sum -b 'a\file'
\b1946ac92492d2347c6235b4d2611184 *a\\file
Итак, нет,не рекомендуется пытаться анализировать этот вывод, не понимая вышеизложенного.
Несколько более простых решений для других языков::
$ echo "test" | perl -le 'use Digest::SHA qw(sha1_hex); print sha1_hex(<>);'
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83
Или (для более длинного ввода, меньше используемой памяти ), запись в файл (позволяет вызвать егоsha1.perl
):
use Digest::SHA qw(sha1_hex);
$state = Digest::SHA->new(sha1);
for (<>) { $state->add($_) }
print $state->hexdigest, "\n";
Выполнить:
$ echo "test" | perl sha1.perl
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83
$ echo "test" | php -r '$f = fgets(STDIN); echo sha1($f),"\n";'
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83
Запишите это в файл (Давайте назовем егоsha1.py
):
import hashlib
m = hashlib.sha1()
import sys
for line in sys.stdin:
m.update(line)
print m.hexdigest()
Используйте:
$ echo "test" | python sha1.py
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83