Gpg

列出由給定密鑰簽名的所有密鑰

  • August 27, 2016

使用GNU Privacy Guard (GnuPG):對於某個給定的密鑰,例如0xDEADBEEF,使用者如何輕鬆地僅列出其密鑰環中具有已由該密鑰簽名的 UID 的公鑰?

如果您可以指定您的答案是否適用於 GnuPG Modern (2.1.x)、GnuPG Stable (2.0.x) 或 GnuPG Classic (1.4.x),將會很有幫助。

據我所知,沒有這樣的選擇。然而,將一個腳本一起編寫是微不足道的:

#!/bin/sh
KEY=${1:-'C840C4F6'}  # that's my key
gpg -k |
grep 'pub ' |
cut -d ' ' -f 4 |
cut -d / -f 2 |
while read x; do
   if gpg --list-sigs "$x" | grep C840C4F6 >/dev/null; then
       echo "$x"
   fi
done

而且,由於 GnuPG 非常快,它執行得足夠快。在便宜的 VPS 上執行不到一秒的 >300 個密鑰。

兩者都是非常古老的-k選擇。我只在 2.0 和 2.1 上對此進行了測試,但我相信它可以在 1.4 上執行。--list-sigs``gpg

GnuPG 中沒有這樣的選項,但是您可以使用一個簡單的腳本來列出所有匹配的鍵。與@grochmal 的腳本相比,讀取 GnuPG 的--with-colons輸出格式(旨在以程式方式解析)的惡意輸入速度更快、更健壯。我還限制了一個 GnuPG 呼叫:

#!/bin/sh
keyid=${1:-'0000000000000000'}
gpg --with-colons --fingerprint --list-sigs |
while read line; do
 packettype="$(echo "${line}" | cut -d':' -f1)"
 case $packettype in
   fpr)
     fingerprint="$(echo "${line}" | cut -d':' -f10)"
     ;;
   sig)
     issuedby="$(echo "${line}" | cut -d':' -f5)"
     if [ "x${issuedby}" = "x${keyid}" ]; then
       echo "${fingerprint}"
     fi
     ;;
 esac
done |
uniq

這依賴於作為第一個參數傳遞的長密鑰 ID,無論如何都不應該使用短密鑰 ID

引用自:https://unix.stackexchange.com/questions/305143