[英]How can I use Perl to get a SHA1 hash of a file from the Windows command line?
我在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 的命令行選項記錄在perlrun 中。 在上面的命令中從左到右:
-M Digest::SHA1=sha1_hex
在編譯時加載Digest::SHA1模塊並導入sha1_hex
,它以十六進制形式給出摘要。-l
自動在任何print
的末尾添加一個換行符-e
引入要執行的 Perl 代碼看起來很有趣的菱形是 Perl 的readline
操作符的一個特例:
空文件句柄
<>
是特殊的:它可以用來模擬sed
和awk
的行為。<>
輸入要么來自標准輸入,要么來自命令行上列出的每個文件。 這是它的工作原理:第一次計算<>
,檢查@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
。
如果您想在方便的實用程序中使用此代碼,請說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 包的一部分。
試試Digest::SHA模塊。
C:\> perl -MDigest::SHA -e "print Digest::SHA->new(1)->addfile('secure.txt')->hexdigest"
在撰寫本文時, Strawberry Perl和ActiveState Perl都包含Digest::SHA附帶的shasum
命令。 如果您在安裝過程中選擇了默認選項,這將已經在您的%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
對於第二個,如果您將它放在.cmd
或.bat
文件中,請確保使用%%i
而不是%i
(兩個地方)。
像這樣使用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);
編輯:為什么投反對票? 這段代碼不起作用嗎? 這不是問題的適當解決方案嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.