仅从 shasum 回显哈希值

仅从 shasum 回显哈希值

有什么办法可以shasum到达仅有的打印哈希值?

我知道这可以通过将输出管道到另一个程序来实现,例如

shasum something | cut -d' ' -f1

有没有一种方法可以仅使用来实现此目的shasum,而无需将结果通过管道传输到其他地方?

答案1

不可以。从 Perl shasum 6.02 和 GNU coreutils 9.1 中的相应程序开始,无法仅打印没有文件名(可以-用于标准输入)的哈希的十六进制表示形式。

但不要让这成为一个问题! shell 旨在组合多个程序并管道是外壳的基本特征。您只需要小心不要接受错误 - 这是 sh 管道的设计缺陷。

在普通的 sh 中,通过命令替换使用“隐藏”管道实际上比 shell 管道更容易。

out=$(shasum <something) && echo "${out%%[!0-9A-Za-z]*}"

说明:命令的第一部分(在 之前&&)设置out为 的输出shasum。由于是简单的赋值,所以它的状态是单个命令替换的状态,所以失败就失败shasum。操作&&员确保如果左侧失败,则整个命令都会失败。如果左侧成功,右侧将打印输出的前导字母数字字符。 (… && echo "${out%% *}"也可以,如果将来的版本使用选项卡,上面的版本会稍微更强大。)

答案2

否,shasum始终打印为其计算哈希值的文件的文件名,或者-如果它从标准输入读取的话。

为了避免管道,你可以使用

perl -MDigest::SHA -e '$s=Digest::SHA->new(); $s->add(<>); print $s->hexdigest(),"\n"' filename

答案3

sha1sumFWIW, (或)的 ast-opencksum -x sha1也可以是ifsha1sum的内置函数ksh93,作为 ast-open 的一部分构建(通过builtin sha1sum或 放在/opt/ast/bin前面启用$PATH),或者sha1在 FreeBSD 上找到的实用程序,仅打印校验和求和标准输入时。

因此,通过这些实现,您可以执行以下操作:

sha1sum < thefile
sha1 < thefile
$ ./ast-open/arch/linux.i386-64/bin/ksh
$ builtin sha1sum
$ whence -a sha1sum
sha1sum is a shell builtin
sha1sum is a shell builtin version of /usr/bin/sha1sum
$ echo test | sha1sum
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83
$ echo test | /usr/bin/sha1sum
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83  -

openssl sha1还可以打印原始校验和,您可以使用以下命令将其转换为十六hexdump -e '20/1 "%02x" "\n"'进制xxd -p

openssl sha1 -binary -- "$file" | xxd -p

sha1sum输出的 GNU 实现<thehexsum> -(第二个空格可能替换为*以指示二进制模式在类似 MSDOS 的系统上),shasum对于perl. openssl sha1输出(stdin)= <thehexsum>(旨在模拟 GNU coreutils 格式)openssl sha1 -r输出-r<thehexsum> *stdin

因此,正如已经说过的,对于这些,您必须从中提取校验和:

sha1sum < "$file" | awk '{print $1}'

(和set -o pipefail事先支持保留sha1sum(或文件输入重定向)失败(如果有)

或者,在类似 POSIX 的 shell 中:

sum=$(sha1sum < "$file") && sum=${sum%%[[:space:]]*}

[[:space:]]*也可以替换为[![:xdigit:]]*以删除以第一个非十六进制数字字符开头的所有内容。

答案4

您可以使用cut命令

  1. 无需将管道插入切口
$ sha256sum ~/hwinfo.txt
d7e1653cc9e37552a70a9daebefdc3bc25949a691086cd325d071a98dfc105aa  /home/user/hwinfo.txt

cut2.使用空间作为分隔符时进行管道插入

$ sha256sum ~/hwinfo.txt | cut -d" " -f 1
d7e1653cc9e37552a70a9daebefdc3bc25949a691086cd325d071a98dfc105aa

有3个字段

字段 1 是 sha256sum

$ sha256sum ~/hwinfo.txt | cut -d" " -f 1
d7e1653cc9e37552a70a9daebefdc3bc25949a691086cd325d071a98dfc105aa

字段 2 为空,因为两个空格之间没有任何内容

$ sha256sum ~/hwinfo.txt | cut -d" " -f 2

字段 3 是文件名

$ sha256sum ~/hwinfo.txt | cut -d" " -f 3
/home/user/hwinfo.txt

相关内容