cryptsetup - 它如何绕过标准输出/标准输入重定向打印提示?

Lap*_*sio 4 file-descriptors

我只是注意到,无论将哪些cryptsetupFD 转发给/dev/null它,它仍然会显示输入密码的提示。例如这仍然显示提示:

cryptsetyp luksOpen /dev/sdXY name >/dev/null 2>/dev/null

如何在无法使用标准重定向重定向到文件的终端消息中显示?

我想在 bash 脚本中获得这样的功能,因为我使用 stdout 将结果返回给母脚本,但我仍然想显示交互式提示 - 是否可以使用 bash 这样做?

fro*_*utz 6

如果您使用strace它,您可能会看到它/dev/tty直接使用。

...
open("/dev/tty", O_RDWR)                = 6
ioctl(6, TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(6, "Enter passphrase for .......: ", 30) = 30
ioctl(6, SNDCTL_TMR_CONTINUE or TCSETSF, {B38400 opost isig icanon -echo ...}) = 0
...
Run Code Online (Sandbox Code Playgroud)

在源代码 ( utils_crypt.c) 中:

static int interactive_pass(const char *prompt, char *pass, size_t maxlen,
                long timeout)
{
[...]
        /* Read and write to /dev/tty if available */
        infd = open("/dev/tty", O_RDWR);
        if (infd == -1) {
                infd = STDIN_FILENO;
                outfd = STDERR_FILENO;
        } else
                outfd = infd;

        if (tcgetattr(infd, &orig))
                goto out_err;
Run Code Online (Sandbox Code Playgroud)

所以它/dev/tty通过打开它来测试,如果有效,它就会使用它。如果失败,它会回退到常规标准输入、标准输出,然后您将不再看到提示。

至于/dev/tty,它是进程的终端,更多细节参见man 4 tty