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

Jim*_*Jim 6 windows perl command-line sha1

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

Gre*_*con 20

perl -MDigest::SHA1=sha1_hex -le "print sha1_hex <>" secure.txt
Run Code Online (Sandbox Code Playgroud)

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版本5.10或更高版本,您可以将上面的单行缩短五个字符.

perl -MDigest::SHA=sha1_hex -E 'say sha1_hex<>' secure.txt
Run Code Online (Sandbox Code Playgroud)

代码删除了可选的(所有版本的Perl)空白之前<>,删除-l和切换-e-E.

  • -E commandline

    表现就像-e,除了它隐式启用所有可选功能(在主编译单元中).见feature.

其中一个可选功能是say,这是-l不必要的.

如果您希望将此代码放在方便的实用程序中,请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;
}
Run Code Online (Sandbox Code Playgroud)

这将计算命令行中命名的每个文件的摘要,并且输出格式与Unix sha1sum实用程序的输出格式兼容.

C:\> mysha1sum.pl mysha1sum.pl mysha1sum.pl 
8f3a7288f1697b172820ef6be0a296560bc13bae  mysha1sum.pl
8f3a7288f1697b172820ef6be0a296560bc13bae  mysha1sum.pl
Run Code Online (Sandbox Code Playgroud)

你没有说你是否安装了Cygwin,但如果你这样做,sha1sum则是coreutils软件包的一部分.

  • nit:因为secure.txt是唯一的文件,其内容成为参数*S*到sha1_hex(每行是一个单独的参数).碰巧的是,sha1_hex将它的参数连接在一起并给出整个文件的SHA1,但是使用<>其他地方不一定会那样. (4认同)
  • 这么多的信息.​​.....如果可以的话我会+2! (2认同)

小智 5

试试Digest :: SHA模块.

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