我正在尝试通过 SSH 使用远程 GPG 安装来加密和签署本地文件:
pv file | ssh -tt [ssh server] gpg -se -r [receipt key] > file.gpg
使用双t选项消除了gpg "cannot open '/dev/tty': No such device or address"
错误。但是,要加密的内容不是发送到 gpg 的输入,而是在 ssh 密码提示之后立即打印。然后输入被关闭,因此它挂在 gpg 上,询问密码以解锁私钥进行签名(或者如果文件太大,则 ssh 连接将关闭)。
将数据传递到通过 SSH 执行的交互式命令的输入的正确方法是什么?
答案1
将数据传输到ssh
(就像你做的那样)是将输入数据传递给通过 SSH 执行的命令的正确方法。
这里的问题是gpg
需要二要读取的输入流:
- 一个(STDIN)来读取要加密的数据,
- 另一个(交互式终端
/dev/tty
)来读取密码(这就是为什么您需要将选项传递-t
给ssh
)。
如果您将两者混为一谈并尝试将 STDIN 用于这两个目的,则需要一种发出 EOF 信号的方法来分隔两个输入。但是,ssh
也会读取文件结尾,并关闭转发的输入流。
我能想到的唯一实用的解决方法是将数据保存到文件中,然后使用gpg
(需要二单独ssh
调用)::
pv file | ssh ... '(umask 077; cat > file.unencrypted)'
ssh -t ... 'gpg -se -r ... < file.unecrypted > file.gpg; rm -f file.unencrypted'