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

时间:2010-05-11 15:48:49

标签: windows perl command-line sha1

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

4 个答案:

答案 0 :(得分:20)

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

Perl的命令行选项记录在perlrun中。在上面的命令中从左到右:

  • -MDigest::SHA1=sha1_hex加载Digest::SHA1模块在​​编译时和进口sha1_hex,这使消化以十六进制形式。
  • -l会自动在任何print
  • 的末尾添加换行符
  • -e介绍了要执行的Perl代码

这个看起来很滑稽的钻石是Perl readline运算符的一个特例:

  

空文件句柄<>很特殊:它可用于模拟sedawk的行为。 <>的输入来自标准输入,或来自命令行中列出的每个文件。以下是它的工作原理:第一次评估<>时,会检查@ARGV数组,如果它为空,$ARGV[0]设置为"-",打开时会给出@ARGV你的标准输入。然后将secure.txt数组作为文件名列表处理。

由于sha1_hex是命名的命令行中的唯一文件,其内容成为参数perl -MDigest::SHA=sha1_hex -E 'say sha1_hex<>' secure.txt

使用Perl版本5.10或更高版本,您可以将上述单行缩短五个字符。

-E commandline

代码丢弃可选的(用Perl的所有版本)空白之前<>,滴剂-l,并从开关-e-E

  
      
  • <强> say FILEHANDLE LIST

         

    的行为与-e类似,只是它隐式启用所有可选功能(在主编译单元中)。请参阅feature

  •   

其中一个可选功能是say,这使-l变得不必要。

  
      
  • say LIST
  •   
  • say
  •   
  • <强> say LIST

         

    就像print一样,但隐式添加换行符。 { local $\ = "\n"; print LIST } 只是

    的缩写
    say
         

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

  •   

如果您希望将此代码放在方便的实用程序中,例如#! /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; } ,请使用

sha1sum

这将计算的摘要名为在命令行上的每个文件,并且输出格式是与Unix的C:\> mysha1sum.pl mysha1sum.pl mysha1sum.pl 8f3a7288f1697b172820ef6be0a296560bc13bae mysha1sum.pl 8f3a7288f1697b172820ef6be0a296560bc13bae mysha1sum.pl 效用的兼容。

sha1sum

您没有说是否有安装了Cygwin,但如果这样做,{{1}}是coreutils软件包的一部分。

答案 1 :(得分:5)

尝试Digest::SHA模块。

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

答案 2 :(得分:0)

在撰写本文时,Strawberry PerlActiveState Perl都包含shasum附带的Digest::SHA命令。如果您在设置过程中选择了默认选项,则该选项将已经在您的%PATH%中。

如果您真的想要为Digest :: SHA编写自己的包装器,那么这里的其他答案都很好。

如果您只是想“使用Perl”来获取文件的SHA1哈希,就意味着拥有 ActiveState Perl,它附带了shasum命令行实用程序,就像:

shasum secure.txt

默认哈希算法为SHA1;如果您想露骨(不坏主意),请添加-a1

默认输出格式是哈希,两个空格,然后是文件名。该格式与sha1sum相同,并且在Unix / Linux系统上通常使用类似的实用程序。如果重定向到文件,则以后可以将该文件名提供给shasum -c,以验证完整性,无论您以前哈希过什么文件。

如果真的,真的不想看到文件名,仅想查看SHA1哈希,这两个文件都会截断文件名部分:

使用Powershell:

shasum secure.txt | %{$_split()[0]}

使用命令提示符(老式的批处理脚本):

for /f %i in ('shasum secure.txt') do echo %i

对于第二个,如果要将其放在%%i%i文件中,请确保使用.cmd而不是.bat(两个地方)。< / p>

答案 3 :(得分:-1)

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

编辑:为什么投票失败?这段代码不起作用吗?这不是解决问题的合适方法吗?