cryptsetup - como ele imprime o prompt ignorando o redirecionamento stdout / stdin?

4

Acabei de notar que não importa em que cryptsetup FDs sejam encaminhados para /dev/null , ele ainda exibe a solicitação de senha. Por exemplo, isso ainda mostra o prompt:

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

Como você pode exibir na mensagem do terminal que não pode ser redirecionada para o arquivo usando o redirecionamento padrão?

Eu gostaria de obter essa funcionalidade no script bash, já que eu uso o stdout para retornar o resultado para o script-mãe, mas ainda gostaria de exibir o prompt interativo - é possível fazer isso usando o bash?

    
por Lapsio 21.10.2017 / 21:23

2 respostas

3

Presumivelmente, ele escreve diretamente para /dev/tty (de qualquer forma, você pode obter o mesmo comportamento)

    #! / bin / bash

# set up the new file descriptor
# I have no idea why this needs exec, please tell me.
exec 3> /dev/tty

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

alternativamente, você pode simplesmente fazer:

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

read ainda funciona se você fizer isso.

    
por 21.10.2017 / 21:37
6

Se você strace , provavelmente verá que ele usa /dev/tty diretamente.

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

No código-fonte ( 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;

Por isso, testa para /dev/tty abrindo-o, e se isso funciona, ele usa isso. Se falhar, ele retorna ao stdin normal, stdout, e você não verá mais o prompt.

Quanto ao /dev/tty , é o terminal do processo, para mais detalhes, consulte man 4 tty .

    
por 21.10.2017 / 21:41