人们可以使用查看加密文件的嵌入文件名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}'