Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Perl从Windows命令行获取文件的SHA1哈希?_Windows_Perl_Command Line_Sha1 - Fatal编程技术网

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

如何使用Perl从Windows命令行获取文件的SHA1哈希?,windows,perl,command-line,sha1,Windows,Perl,Command Line,Sha1,我在c:\temp中有一个名为secure.txt的文件。我想从命令行运行一个Perl命令来打印secure.txt的SHA1散列。我正在使用ActivePerl 5.8.2。我以前没有使用过Perl,但它是目前可用的最方便的选项 perl -MDigest::SHA1=sha1_hex -le "print sha1_hex <>" secure.txt 代码在之前删除可选的(所有版本的Perl)空格,删除,并从切换到 -E命令行 除了隐式启用所有可选功能(

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

perl -MDigest::SHA1=sha1_hex -le "print sha1_hex <>" secure.txt
代码在之前删除可选的(所有版本的Perl)空格,删除,并从切换到

  • -E命令行

    除了隐式启用所有可选功能(在主编译单元中)之外,其行为与相同。看

这些可选功能之一是,这使得不必要

  • 说出文件句柄列表

  • 说出列表

  • 就像,但隐式地附加了一个换行符
    saylist
    只是

      { local $\ = "\n"; print LIST }
    
    仅当启用了
    say
    功能时,此关键字才可用:请参阅

如果您希望将此代码放在一个方便的实用程序中,比如说
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包的一部分。

请这样使用:

#/usr/bin/perl-w
严格使用;
使用摘要::SHA1 qw/SHA1_hex/;
#打开文件
在_数据中打开,“尝试该模块

在撰写本文时,和都包括随附的命令。如果您在安装过程中选择了默认选项,则这将已经出现在您的
%PATH%

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

如果您只想“使用Perl”获取文件的SHA1散列,在某种意义上说,您有ActiveState Perl,并且它附带了
shasum
命令行实用程序,那么它非常简单:

shasum secure.txt
默认的散列算法是SHA1;如果希望显式(这主意不错),可以添加
-a1

默认的输出格式是散列,两个空格,然后是文件名。这与Unix/Linux系统上常见的和类似的实用程序的格式相同。如果重定向到文件中,可以稍后将该文件名提供给
shasum-c
,以验证您以前散列过的任何文件的完整性

如果你真的,真的不想看到文件名,只需要SHA1散列,它们中的任何一个都会切掉文件名部分:

使用Powershell:

shasum secure.txt |%{$\u split()[0]}
使用命令提示符(旧式批量脚本):


对于第二个,请确保使用
%%i
而不是
%i
(两个位置)如果你把它放在
.cmd
.bat
文件中。

请使用本地词法文件句柄-
打开我的$in_数据,@Ether-这是个人偏好的问题。使用词法句柄有很好的理由。请参阅使用好习惯,即使你不需要这样做,当你需要时它们也会保持习惯。:)有一种方法可以做到这一点不读取文件yourself.nit的内容:因为secure.txt是唯一的文件,所以它的内容成为sha1_hex的参数(每行一个单独的参数)。恰巧,sha1_hex将其参数重新连接在一起,并给出整个文件的sha1,但使用其他位置不一定会这样。将来大家好!ActiveState和草莓Perl都包含Digest::SHA,如果您在安装过程中选择默认选项,它应该已经是您的
%PATH%
lly,如果您真的想为Digest::SHA编写自己的包装器,那么这里的其他答案非常好。但是,如果您想使用一个恰好由“标准”Perl模块提供的命令行工具,请参阅下面我的答案。
#!/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);
C:\> perl -MDigest::SHA -e "print Digest::SHA->new(1)->addfile('secure.txt')->hexdigest"
shasum secure.txt
for /f %i in ('shasum secure.txt') do echo %i