cryptsetup - stdout/stdin 리디렉션 인쇄 프롬프트를 우회하는 방법은 무엇입니까?

cryptsetup - stdout/stdin 리디렉션 인쇄 프롬프트를 우회하는 방법은 무엇입니까?

cryptsetup어느 FD로 전달되든 /dev/null여전히 비밀번호를 묻는 메시지가 표시되는 것을 확인했습니다 . 예를 들어 다음과 같은 프롬프트가 계속 표시됩니다.

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

표준 리디렉션을 사용하여 파일로 리디렉션할 수 없다는 터미널 메시지를 어떻게 표시합니까?

stdout을 사용하여 상위 스크립트에 결과를 반환하기 때문에 bash 스크립트에서 이와 같은 기능을 얻고 싶습니다. 하지만 여전히 대화형 프롬프트를 표시하고 싶습니다. 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켜서 테스트하고, 작동하면 사용합니다. 실패하면 일반 stdin, stdout으로 돌아가고 프롬프트가 다시 표시되지 않습니다.

/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는 현재 셸이 실행되는 동안 리디렉션 상태를 유지해야 합니다.

간단한 명령의 리디렉션:

$ echo yes       3>file

명령이 실행되는 동안 지속됩니다. 명령(이 경우 echo)이 끝나면 쉘은 리디렉션을 제거하고 "현재 쉘" 실행 환경으로 되돌아갑니다.

ㅏ:

$ 3>file

실행된 명령이 "없음"이고 리디렉션이 오래 지속되지 않는 "간단한 명령"입니다.

대신에:

$ exec 3>file

exec는 "현재 쉘"을 리디렉션이 포함된 새 쉘로 대체합니다. 이로 인해 "현재 쉘"이 존재하는 한 리디렉션이 활성 상태로 유지됩니다. 이 작업은 다음과 같이 취소할 수 있습니다(실제로는 fd 3을 닫음).

$ exec 3>&-

관련 정보