Por padrão, nem sudo
nem su
lê uma senha de stdin. Eles tentam usar um dispositivo terminal diretamente (algumas implementações podem até mesmo reclamar quando usadas em um tubo). Existe a opção sudo -S
para alterar este comportamento, mas, até onde eu sei, não existe uma opção semelhante para su
.
Solução: use expect
.
expect
is a program that "talks" to other interactive programs according to a script. Following the script,expect
knows what can be expected from a program and what the correct response should be.[…]
In general,
expect
is useful for running any program which requires interaction between the program and the user. All that is necessary is that the interaction can be characterized programmatically.
No seu caso, o script pode ser:
#!/usr/bin/expect
log_user 0
spawn /bin/su - otherusr
expect "Password: "
send "mypassword\n"
interact
Eu aconselho fazer este script acessível somente para você ( chmod go-rwx
). Outros usuários não devem ter permissão para lê-lo porque contém mypassword
em texto simples; eles não devem ter permissão para executá-lo, porque ele dá acesso ao shell de otherusr
.