Печать SHA Summes без «-» в конце?

Еще один sed

sed '$!N;s/\n/-/p;s/-/\n/;D' 

, который можно изменить (спасибо mikeserv ):

sed -n 'N;y/\n/-/;P;y/-/\n/;D' 

0
10.12.2018, 22:26
3 ответа

Это невозможно без другого инструмента или без редактирования реального скрипта/бинарного файла sha1sum. Когда sha1sum получает файл, он печатает имя файла после суммы. Когда sha1sum не передает файл или используется с каналом. Он помещает -в качестве заполнителя, чтобы указать, что ввод не был файлом.

5
28.01.2020, 02:31

в bash, без дополнительных инструментов.

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%-}

также может быть успешным, хотя использование массивов является более интуитивным выбором.

добавление base64

xxd + base64 можно использовать для увеличения энтропии (уменьшения количества битов )в диапазонах печатных символов

 h=($(echo test | sha1sum )) ;echo $h|xxd -r -p |base64
ThJDvSLGbnbCup7dwfkTlOV/n4M=
5
28.01.2020, 02:31

Новая строка

Поймите, что эхо добавляет новую строку в конце, которая изменяет хэш:

 $ 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
4
28.01.2020, 02:31

Теги

Похожие вопросы