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:Nname="",

이를 통해 데이터에 포함된 유사한 데이터 file",나 파일 이름 으로 작업할 수 있습니다 .name="hello"gpg

특수 문자는 파일에 포함되기 전에 16진수 이스케이프 시퀀스로 인코딩됩니다 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}'

관련 정보