Como o comando su está mascarando / protegendo minha senha de ser exibido na tela? [duplicado]

5

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?

    
por Mike B 17.03.2016 / 19:10

2 respostas

8

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 .

    
por 17.03.2016 / 19:13
6

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.

    
por 17.03.2016 / 19:36