Gnupg требует, чтобы многие его входные данные поступали буквально из терминала, а не из стандартного ввода.
Я иногда могу обойти это с:
pty-run:
#!/bin/bash
printf -v cmd '%q ' "$@"
exec script --quiet --return -f --command "$cmd" /dev/null
А потом
$ { echo my-input; } | pty-run the-gpg-command
Например, я могу неинтерактивно назначить определенный уровень доверия определенному набору ключей с помощью:
marginal=3
for k in "${keyset[@]}"; do printf '%s\n' trust "$marginal" save | pty-run gpg --edit-key "$k"; done
Но это не удается, когда требуются пароли, даже если я предоставляю пароли на стандартном компьютере.
Моя наивная эмуляция того, что, я думаю, должна делать команда -gpg:
printf '%s\n' A B | pty-run bash -c ' read -s a < /dev/tty; read -s b </dev/tty; echo a=$a b=$b; '
работает (т. е. с pty-run
, a
и b
назначаются из stdin, даже когда скрипт bash читает непосредственно с управляющего терминала).
Что делает gnupg, чтобы это не работало и как я могу это выяснить?