为什么 GPG 管道会出现故障?

Brō*_*rāx 2 password-management

我正在寻求将密码通过管道传输到 gpg 中以进行对称加密,但它的表现就好像我没有通过管道传输任何内容,并且仍然要求我输入密码并重新输入密码。

\n\n

这是我正在尝试的(“输入”是密码):

\n\n
(echo 'enter'; echo 'enter') | gpg -c test.py\n
Run Code Online (Sandbox Code Playgroud)\n\n

为什么这不起作用?

\n\n

我已经知道您可以使用--batch --yes --passphrase='enter',但这会在任务管理器中的任务中显示密码(因此似乎不太安全\xe2\x80\x94如果我错了请告诉我)。

\n\n

编辑:我刚刚意识到 echo 仍然可能会出现在任务管理器中(只是与 gpg 命令分开)。因此,为了解决这个问题,我可以将密码保存到临时文件中并cat myPasswordFile使用echo myPassword. 这样,他们必须从临时文件(当它存在时)实时获取密码,而不是仅仅记录所有已运行的任务并在闲暇时获取密码。

\n

小智 6

您可以使用--passphrase-fd 0告诉 gpg 从 stdin 读取密码。这应该与管道相处得很好。不要发送两次;仅当您以交互方式进行拼写错误检测时才需要这样做。

通常 gpg 从 tty 读取,因此您可以重定向输入和输出,并且仍然能够输入密码。

在正常的登录会话中,您的 shell 通过 3 个文件描述符连接到终端:stdin、stdout 和 stderr。管道和重定向运算符会更改这些文件描述符指向的位置。

如果运行不带任何重定向运算符的命令,则其所有文件描述符都将从 shell 继承。当它从 stdin 读取时,它是从 tty 读取。

如果您使用<重定向运算符运行相同的命令,则其标准输入将连接到名称出现在<. 如果将命令放在运算符的右侧|,则其标准输入将连接到管道文件描述符(其相对端连接到 . 左侧的命令的标准输出|

这些你可能已经知道了。您不知道的是,除了文件描述符之外,还有另一个链接终端和进程的东西:控制终端。您的 shell 进程有一个控制终端,并且它由所有子进程继承,在本例中包括您的gpg.

当程序想要从用户那里获取键盘输入时,尽管 stdin 不是终端,但它可以通过打开特殊文件来访问其控制终端/dev/tty

严重依赖此功能的一种程序是寻呼机(例如moreless)。如果你运行somecommand | lessless想要做的是从标准输入上的管道读取一些输入,显示第一个屏幕,然后从键盘读取以等待你按下一个键来告诉它下一步要做什么。stdin 不能同时是管道和键盘,因此lessopens /dev/tty

进程的控制终端在TTY列中列出ps