Gentoo Linux GPG对通过参数传递的文件进行了正确加密,但是从标准输入中读取时会抛出“设备不正确的ioctl”


23

我正在运行带有内核4.1.7-hardened-r1的Gentoo Hardened,并且尝试使用GPG从SSH打开的Shell会话中使用GPG加密文件,并DISPLAY禁用该变量,以便使用pinentry-curses进行密码提示。使用gpg -o file.gpg --symmetric file我可以加密就可以了。使用pv file | gpg -o file.gpg --symmetric我得到以下错误信息:

gpg-agent[30745]: command get_passphrase failed: Inappropriate ioctl for device

Answers:


41

您应该将其设置为GPG_TTY变量才能使其正常工作,如本文档所示

GPG_TTY=$(tty)
export GPG_TTY

这两行应该放在您的.bashrc(假设bash中),因此每次您打开新的终端会话时它们都会运行。

但是,还有另一种解决方案:在bash中,您可以运行您pv的进程并假装它是一个文件,可以使用进程替换:

gpg -o file.gpg --symmetric <(pv file)

因此,将内容插入需要额外输入的程序中可能不是一个好主意。它的工作方式可能与预期的不同。


有什么办法可以更改或修复此行为?现在,我刚刚在Debian上尝试了完全相同的read-from-stdin命令,GPG确实要求输入密码。
RAKK

@RAKK可以解密生成的文件吗?
TNW

是的,对Debian毫无阻碍。创建一个包含随机数据的小文件dsfargeg,使用进行加密pv dsfargeg | gpg -o dsfargeg.gpg --symmetric,在出现提示时输入密码,使用解密输出gpg -o dsfargeg.gpg.dec --decrypt dsfargeg.gpg,输入密码,然后使用比较原始文件和解密文件sha256sum dsfargeg dsfargeg.gpg.dec。两个哈希将相同。
RAKK

@RAKK你是对的。似乎gpg正在/dev/ttyDebian 上开放。在我看来,这是1.4版。从那时起,gpg进行了一些大修。可能由于某种原因而放弃了这种方法-您可能希望自己找到更多信息(或者可以是一些Debian特定的补丁程序)。因此,最好不要指望它。我将深入研究痕迹,以检查更新的gpg(我有2.1)中到底发生了什么。
TNW

奇怪的是,我找到了解决方案!设置GPG_TTY变量对我有用。我将相应地更新答案。
TNW
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.