我在 c:\ temp 中有一个名为 secure.txt 的文件。我想从命令行运行Perl命令来打印 secure.txt 的SHA1哈希。我正在使用ActivePerl 5.8.2。我之前没有使用过Perl,但它是目前最方便的选择。
答案 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
运算符的一个特例:
空文件句柄
<>
很特殊:它可用于模拟sed
和awk
的行为。<>
的输入来自标准输入,或来自命令行中列出的每个文件。以下是它的工作原理:第一次评估<>
时,会检查@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
如果您希望将此代码放在方便的实用程序中,例如#! /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 Perl和ActiveState 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);
编辑:为什么投票失败?这段代码不起作用吗?这不是解决问题的合适方法吗?