Как с помощью gpg получить отпечаток секретного ключа PGP в кодировке ASCII?

Начните с простейшего возможного случая.Создание функции:

f() { read -p "Type smthng: " $1 ; }

Вызов функции, присвоение переменной $ p для удержания ее ввода, затем отображение ввода после выхода функции:

f p ; echo $p

It запросов, я набираю «woof», и echo $ p выводит то же самое:

Type smthng: woof
woof

Один из способов проверить переменную - заключить эту функцию в другую:

g() { unset $1 ; until f "$1" && eval [ \"\$"$1"\" ] ; do echo wrong ; done ; }

Сложность заключается в том, что OP хочет чтобы назначить имя переменной как параметр функции, для анализа которого я использую "evil" eval . Передача имен переменных в качестве параметров функции выполняется редко (или требуется), но здесь показан один из способов сделать это.

Протестируйте:

g p ; echo $p

Появляется запрос, я нажимаю Enter , выводится сообщение об ошибке; затем во втором приглашении я набираю «foo»:

Type smthng: 
wrong
Type smthng: foo
foo

Эта часть кода OP не будет работать:

if [[ -z $$var ]]; then

$$ - это переменная bash , которая возвращает текущий PID:

 man bash | grep -A 28 "Special Parameters$"  | sed -n '1,3p;28,$p'
   Special Parameters
       The shell treats several parameters specially.  These  parameters  may  only
       be referenced; assignment to them is not allowed.
       $      Expands to the process ID of the shell.  In a () subshell, it expands
              to the process ID of the current shell, not the subshell.

1
12.09.2018, 23:54
3 ответа

Как указано в комментариях, самое простое решение, по-видимому, состоит в том, чтобы сначала удалить ключ, а затем запустить --list-secret-keysдля нового файла:

$ gpg --dearmor secret.asc  # Creates secret.asc.gpg
$ gpg --with-fingerprint --no-default-keyring --secret-keyring./secret.asc.gpg --list-secret-keys

Раздражает то, что, несмотря на то, что деарморированный ключ может быть записан на стандартный вывод с опцией -o -, ни --secret-keyring -, ни --secret-keyring /dev/stdinне позволят второй команде считать ключ со стандартного ввода, поэтому объединение двух команд в одну с помощью труба не вариант. Кроме того, выполнение второй команды с gpg2вместо gpgпо-прежнему не дает желаемого результата.

Чуть более сложный подход, но тот, который работает с обеими версиями gpg, состоит в том, чтобы импортировать секретный ключ во временный домашний каталог GPG, а затем перечислить закрытые ключи временного дома.:

$ mkdir -m 0700 tmphome
$ gpg --homedir tmphome --import secret.asc
$ gpg --homedir tmphome --with-fingerprint --list-secret-keys
4
27.01.2020, 23:18

Это, вероятно, изменилось с новыми версиями GnuPG, так как в настоящее время вы можете сделать это в одном канале:

$ gpg --with-colons --import-options show-only --import --fingerprint < secret.asc | awk -F: '$1 == "fpr" {print $10;}'

Главным изменением правил игры является опция import-options, которая включает фальшивый импорт . Мы просто работаем с файлом, так как он был бы импортирован, но это не так.

Опция --with-colonsгарантирует стабильный и машинный -анализируемый формат, который мы используем в последней awkчасти.

awkпросто печатает 10-й столбец из строки с отпечатком (, который начинается сfpr).

10
27.01.2020, 23:18

Начиная с gpg 2.2.8 (, выпущенного в середине -2018 ), появилась опция --show-keysдля отображения ключей без их импорта, предоставлена ​​в качестве ярлыка для--import --import-options show-only.

Показать ключ (с )в файлеsecret.asc:

$ gpg --show-keys secret.asc

Другой формат отпечатка пальца:

$ gpg --show-keys --with-fingerprint secret.asc
1
30.06.2021, 15:46

Теги

Похожие вопросы