Uma coisa com o mysql
programa me chamou a atenção. Ele pode ser instruído a solicitar a senha interativamente com o -p
sinalizador, nesse caso, como seria de esperar, um prompt aparece no seu terminal e o que for inserido será aceito como a senha. O que me surpreendeu é que isso acontece mesmo se você redirecionar todos os três std{in,out,err}
:
$ mysql -p </dev/null >/dev/null 2>/dev/null
Enter password:
Ele lê a senha corretamente também. Se você redirecionar stderr
para um arquivo, poderá verificar se o login falhou.
Como o processo sabe em qual terminal pedir a senha? Ele verifica os terminais conectados aos processos pai?
Um processo unix pode ler de /dev/tty e, assim, contornar o redirecionamento.
Ele pode chamar a
isatty
função unistd.Provavelmente, como @Gerard H. Pille observou, o mysql não verifica, mas simplesmente usa
/dev/tty
quando você o chama com-p
.Algum detalhe adicional
Eu verifiquei em fontes glibc a implementação isatty .
Ele simplesmente usa a
tcgetattr
função para obter os recursos do terminal do descritor de arquivo. Se a função retornar true, então é um terminal.Ele usa
getpass()
libc (quando disponível) que é descrito nas páginas man da seguinte forma: