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

tktrz96b  于 2022-11-15  发布在  Perl
关注(0)|答案(4)|浏览(174)

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

6tqwzwtp

6tqwzwtp1#

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

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

  • -MDigest::SHA1=sha1_hex在编译时加载Digest::SHA1模块并导入sha1_hexsha1_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

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

*一米二一米一

行为与-e类似,只是它隐式启用所有可选功能(在主编译单元中)。请参阅feature
这些可选特性之一是say,它使得-l变得不必要。

*一米二十六分一秒
*一米二十七分一秒
*一米二十八分一秒

就像print一样,但隐式附加了一个换行符。say LIST只是

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

此关键字仅在启用say功能时可用:参见feature
如果您希望将此代码放在一个方便的实用程序中,例如mysha1sum.pl,则使用

#! /usr/bin/perl

use warnings;
use strict;

use Digest::SHA;

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

foreach my $file (@ARGV) {
  my $sha1 = Digest::SHA->new(1);  # use 1 for SHA1, 256 for SHA256, ...
  $sha1->addfile($file);
  say($sha1->hexdigest, "  $file");
}

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

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

你没有说你是否安装了Cygwin,但是如果你安装了,sha1sum是coreutils包的一部分。

smdnsysy

smdnsysy2#

尝试Digest::SHA模块。

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

ie3xauqp3#

在撰写本文时,Strawberry PerlActiveState Perl都包含Digest::SHA附带的shasum命令。如果您在安装过程中选择了默认选项,则%PATH%中已包含该命令。
如果您真的为Digest::SHA编写自己的 Package 器,这里的其他答案也很好。
如果您只想“使用Perl”来获取文件的SHA1哈希值,也就是说,您 * 拥有 * ActiveState Perl,并且它附带了shasum命令行实用程序,那么就像下面这样简单:

shasum secure.txt

默认哈希算法为SHA1;如果您想显式地添加-a1(这不是一个坏主意)。
默认的输出格式是hash,两个空格,然后是文件名。这与sha1sum和类似的实用程序的格式相同,常见于Unix/Linux系统。如果重定向到一个文件,该文件名可以在稍后提供给shasum -c,以验证您之前哈希过的任何文件的完整性。
如果你真的不想看到文件名,只想看到SHA1哈希,这两个方法都会去掉文件名部分:
使用Powershell:

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

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

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

对于第二个,如果要将其放入.cmd.bat文件中,请确保使用%%i而不是%i(两个位置)。

8zzbczxx

8zzbczxx4#

Digest::SHA1的用法如下:
使用OO策略:

#!/usr/bin/perl -w
use v5.10; # for 'say'
use strict;

require Digest::SHA1;
my $filename = 'secure.txt';
my $sha1 = Digest::SHA1->new->addfile($filename)->hexdigest;
say $sha1;
  • 请注意,调用->hexdigest会导致对象的状态被清除,从而导致正在计算的当前摘要被销毁。此时,您可以重用$sha1对象。*

你也可以对文件内容使用sha1_hex sub:

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

use Digest::SHA1 qw/ sha1_hex /;

my $filename = "secure.txt";
# open file
open my $fhi, '<', $filename or die "Cannot open file '$filename' for reading: $!";
# slurp all the file contents
my $file_contents;
{local $/; $file_contents = <$fhi>;}
close $fhi;
print &sha1_hex($file_contents);

请注意,您可以改用Digest::SHA,其中new()将算法作为参数使用(例如,1表示SHA1,256表示SHA256,...):

require Digest::SHA;
my $sha1 = Digest::SHA->new(1)->addfile($filename)->hexdigest();

相关问题