如何使用Perl从Windows命令行获取文件的SHA1哈希值?

我在c:\ temp中有一个名为secure.txt的文件。 我想从命令行运行一个Perl命令来打印secure.txt的SHA1哈希值。 我使用ActivePerl 5.8.2。 我以前没有用过Perl,但是这是目前最方便的select。

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运算符的特例:

null filehandle <>是特殊的:它可以用来模拟sedawk的行为。 来自<>输入来自标准输入,或来自命令行上列出的每个文件。 这是如何工作的:第一次计算<> ,@ $ARGV[0]数组被检查,如果它是空的, $ARGV[0]被设置为"-" ,当打开时给你标准输入。 @ARGV数组然后被处理成一个文件名列表。

因为secure.txt是命令行中唯一命名的文件,所以其内容成为sha1_hex的参数。

使用Perl版本5.10或更高版本,可以缩短上面的一行五个字符。

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

代码在<>之前删除可选(所有版本的Perl)空格,drop -l ,并从-e切换到-E

  • -E commandline

    行为就像-e ,除了它隐式启用所有可选功能(在主编译单元中)。 查看feature

这些可选功能之一say ,这使得-l不必要的。

  • say FILEHANDLE LIST
  • say LIST
  • say

    就像print一样,但隐含地附加一个换行符。 say LIST只是一个简称

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

    此关键字仅在say功能启用时可用:请参阅feature

如果你想在一个方便的实用程序中使用这个代码,请使用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软件包的一部分。

尝试Digest :: SHA模块。

 C:\> perl -MDigest::SHA -e "print Digest::SHA->new(1)->addfile('secure.txt')->hexdigest" 

像这样使用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); 

编辑:为什么投票? 这个代码不起作用吗? 这不是一个适当的解决方案?