为什么 gnupg 不会被我的伪终端技巧欺骗?

为什么 gnupg 不会被我的伪终端技巧欺骗?

Gnupg 要求它的许多输入实际上来自终端而不是仅仅来自标准输入。

我有时可以这样解决这个问题:

pty-运行

#!/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,即使 bash 脚本直接从控制终端读取,ab可以从 stdin 分配)。

gnupg 做了什么导致它无法工作以及我该如何解决?

相关内容