如何获取 GPG 加密文件的嵌入文件名

如何获取 GPG 加密文件的嵌入文件名

人们可以使用查看加密文件的嵌入文件名gpg --list-packets 001.gpg,其中显示:

[...]

:literal data packet:
    mode b (62), created 1630584912, name="elephant.jpg",
    raw data: 87417 bytes

[...]

有没有办法只获取嵌入的文件名?有没有只显示的命令elephant.jpg

答案1

name="要获取行之间和",行后的数据:literal data packet:,请使用sed

gpg --list-packets file.gpg |
sed -e '/^:literal data packet:$/!d' \
    -e 'N' \
    -e 's/[^=]*name="//' \
    -e 's/",$//' \
    -e 'q'

表达式sed首先删除从中读取的所有行,gpg直到找到该:literal data packet:行。然后,它立即附加下一行N并删除缓冲区中现在直到第一个子字符串(包括第一个子name="字符串)的所有内容。然后它",从行尾删除并退出(输出缓冲区中剩余的内容)。

这使我们能够处理类似数据file",name="hello"嵌入数据中的文件名gpg

请注意,特殊字符在嵌入文件之前将被编码为十六进制转义序列gpg。例如,每个换行符将被编码为\x0a.

答案2

您可以使用sed该模式来提取文件名:

$ text='
[...]

:literal data packet:
    mode b (62), created 1630584912, name="elephant.jpg",
    raw data: 87417 bytes

[...]
'
$ echo "$text" | sed -n 's/.*name="\(.*\)",/\1/p'
elephant.jpg
$ 

答案3

我想,一种方法是使用 gpg 库并执行与 CLI 实用程序相同的操作。

否则你可以过滤 gpg 输出:

#!/bin/bash
if [ -z "$1" ]; then
    echo "No filename specified" 1>&2
    exit 1
fi
if [ ! -r "$1" ]; then
    echo "File not found" 1>&2
    exit 2
fi
gpg --list-packets "$1" \
    | grep ", name=" | cut -f2 -d '"'

(这假设嵌入的名称不包含双引号)。

答案4

一个简短的版本:

gpg --list-packets file.gpg | awk -F\" '/created/ {print $2}'

相关内容