Как я могу использовать Perl для получения хеша SHA1 файла из командной строки Windows?

У меня есть файл под названием secure.txt в c:\temp. Я хочу выполнить команду Perl из командной строки для печати хеша SHA1 secure.txt. Я использую ActivePerl 5.8.2. Я не использовал Perl прежде, но это - самая удобная опция, доступная прямо сейчас.

6
задан Greg Bacon 13 September 2010 в 19:07
поделиться

3 ответа

perl -MDigest::SHA1=sha1_hex -le "print sha1_hex <>" secure.txt

Параметры командной строки для Perl задокументированы в perlrun . Переход слева направо в приведенной выше команде:

  • -M Digest :: SHA1 = sha1_hex загружает модуль Digest :: SHA1 во время компиляции и импортирует sha1_hex , что дает дайджест в шестнадцатеричной форме.
  • -l автоматически добавляет новую строку в конец любого print
  • -e вводит код Perl для выполнения

Забавный на вид ромбик - это особый случай Perl Оператор readline :

Нулевой дескриптор файла <> является особенным: его можно использовать для имитации поведения sed и awk . Ввод из <> поступает либо из стандартного ввода, либо из каждого файла, указанного в командной строке.Вот как это работает: при первой оценке <> проверяется массив @ARGV , и если он пуст, то $ ARGV [0] становится установите на "-" , что при открытии дает стандартный ввод. Затем массив @ARGV обрабатывается как список имен файлов.

Поскольку secure.txt - единственный файл, указанный в командной строке, его содержимое становится аргументом для sha1_hex .

В Perl версии 5.10 или новее вы можете сократить приведенный выше однострочный текст на пять символов.

perl -MDigest::SHA=sha1_hex -E 'say sha1_hex<>' secure.txt

Код удаляет необязательный (во всех версиях Perl) пробел перед <> , удаляет -l и переключается с -e на ] -E .

  • -E командная строка

    ведет себя так же, как -e , за исключением того, что она неявно включает все дополнительные функции (в основном модуле компиляции). См. функцию .

Одной из этих дополнительных функций является скажем , что делает ненужным -l .

  • say FILEHANDLE LIST
  • say LIST
  • say

    Точно так же, как print , но неявно добавляет новую строку. говорят, что СПИСОК - это просто сокращение для

     {local $ \ = "\ n"; print LIST} 
     

    Это ключевое слово доступно, только если включена функция скажем : см. функция .

Если вы хотите использовать этот код в удобной утилите, скажем mysha1sum.pl , используйте

#! /usr/bin/perl

use warnings;
use strict;

use Digest::SHA1;

die "Usage: $0 file ..\n" unless @ARGV;

foreach my $file (@ARGV) {
  my $fh;
  unless (open $fh, $file) {
    warn "$0: open $file: $!";
    next;
  }

  my $sha1 = Digest::SHA1->new;
  $sha1->addfile($fh);
  print $sha1->hexdigest, "  $file\n";

  close $fh;
}

. Это вычислит дайджест для каждого файла, названного в командной строке, и вывод формат совместим с утилитой Unix sha1sum .

C:\> mysha1sum.pl mysha1sum.pl mysha1sum.pl 
8f3a7288f1697b172820ef6be0a296560bc13bae  mysha1sum.pl
8f3a7288f1697b172820ef6be0a296560bc13bae  mysha1sum.pl

Вы не сказали, установлен ли у вас Cygwin, но если да, то sha1sum является частью пакета coreutils.

20
ответ дан 8 December 2019 в 04:51
поделиться

Попробуйте модуль Digest::SHA.

C:\> perl -MDigest::SHA -e "print Digest::SHA->new(1)->addfile('secure.txt')->hexdigest"
5
ответ дан 8 December 2019 в 04:51
поделиться

Используйте Digest :: SHA1 вот так:

#!/usr/bin/perl -w
use strict;

use Digest::SHA1    qw/ sha1_hex /;

# open file
open IN_DATA, "<secure.txt" or die "cannot open file secure.txt for reading: $!";
# read in all file contents
my $file_contents;
{local $/; $file_contents = <IN_DATA>;}
# close file
close IN_DATA;
print &sha1_hex($file_contents);

Редактировать: Почему голосование "против"? Этот код не работает? Разве это не подходящее решение проблемы?

-1
ответ дан 8 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

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