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>&-