cryptsetup - 如何绕过 stdout/stdin 重定向打印提示?

cryptsetup - 如何绕过 stdout/stdin 重定向打印提示?

我刚刚注意到,无论cryptsetup转发到哪个FD,/dev/null它仍然显示提示输入密码。例如这仍然显示提示:

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

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

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

答案1

如果你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
...

在源代码中(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;

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

至于/dev/tty,它是进程的终端,详细信息请参见man 4 tty

答案2

据推测,它直接写入/dev/tty(无论如何,您可以获得相同的行为)

#!/bin/bash

# set up the new file descriptor
exec 3> /dev/tty

# test
echo "Stdout"
echo "Stderr" >&2
echo "Directly to tty" >&3

或者,您可以简单地执行以下操作:

echo "Directly to tty" >/dev/tty

$ ./foo.sh >/dev/null 2>/dev/null
Directly to tty 

read如果你这样做仍然有效。


exec 需要在当前 shell 的持续时间内保持重定向。

简单命令的重定向:

$ echo yes       3>file

在执行命令时持续。一旦命令(本例中为 echo)结束,shell 就会删除重定向并恢复到“当前 shell”执行环境。

A:

$ 3>file

仍然是一个“简单命令”,其中执行的命令是“无”,重定向不会持续很长时间。

而是在:

$ exec 3>file

exec 将“当前 shell”替换为包含重定向的新 shell。这使得只要“当前 shell”存在,重定向就保持活动状态。这可以通过以下方式撤消(好吧,实际上是关闭 fd 3):

$ exec 3>&-

相关内容