O que você digita é exibido no terminal porque o terminal "ecoa" de volta. Ao pedir senha, o eco está desativado. Veja também help read
e sua opção -s
.
Desculpas se esta é uma questão abstrata - tentarei ser o mais específico possível.
Quando estou no bash shell e mudo para uma conta diferente via su - foo
, me pedem uma senha. Os caracteres que eu digito nesse prompt de senha estão ocultos da tela, sem indicação de quantos caracteres eu estou digitando ou o que eles são. Como o bash (ou o Linux em geral) está fazendo isso?
Acreditei que su
provavelmente abriu /dev/tty
, alterou as configurações do driver de terminal para não fazer eco e, em seguida, leu o descritor de arquivos /dev/tty
.
Para testar essa crença, eu corri strace -o su.out su -
no meu laptop Arch linux. A parte relevante da strace
output:
ioctl(0, SNDCTL_TMR_CONTINUE or TCSETSF, {B38400 opost isig icanon -echo ...}) = 0
write(2, "Password: ", 10) = 10
read(0, "hahanotthis\n", 511) = 7
ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig icanon echo ...}) = 0
Eu não estava 100% errado. su
lê de fato de stdin, mas desativa o eco em stdin usando um controle de terminal ioctl()
. Depois que coloco a senha, su
volta a ativar o eco, novamente com ioctl()
chamada do sistema.
Eu sei que alguns outros programas, o ftp
client em particular, usa /dev/tty
para ler senhas, o que significa que você não pode colocar uma senha na linha de comando, ou em um "aqui documento", você tem que usar algumas travessuras.