簡體   English   中英

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

[英]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操作符的一個特例:

空文件句柄<>是特殊的:它可以用來模擬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 commandline

    行為就像-e ,除了它隱式啟用所有可選功能(在主編譯單元中)。 請參閱feature

其中一項可選功能是say ,這使得-l變得不必要。

  • say FILEHANDLE LIST

  • say LIST

  • say

    就像print ,但隱式附加一個換行符。 say LIST只是一個縮寫

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

    此關鍵字僅在啟用say功能時可用:請參閱feature

如果您想在方便的實用程序中使用此代碼,請說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 PerlActiveState 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM