Questão Como iniciar uma festa interativa com o su


eu não tenho sudo su sobre um nome de usuário, no entanto eu tenho sua senha. Eu quero ter um script que passe a senha e me dê uma festança interativa.

Eu tentei isso:

echo mypassword | su - otherusr
Password: Last login: Wed Jul 25 12:09:38 COT 2018
[myuser@myserver ~]$ 

Ele me retorna para myuser e eu não tenho uma festança interativa com o outro usuário.

Eu também tentei:

echo mypassword | su -c "/bin/bash" - otherusr
echo mypassword | su -s "/bin/bash" - otherusr
echo mypassword | su -c "/bin/bash -i" - otherusr
Password: bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
bash-4.2$ exit

Como eu posso fazer isso? Eu quero criar um script que me retorne uma sessão bash interativa com outro usuário; não apenas executar um comando com outro usuário.


0


origem


Parece que você está trabalhando em algum shell super limitado e não está colocando sua senha. Tente su e digite a senha normalmente? Além disso, você normalmente não deve usar esse método para efetuar login, pois sua senha é registrada nos logs bash. Isso geralmente é uma preocupação grave de segurança. Se você vai usar esse método, também pode adicionar nopasswd para sudoers - Chris
Por que não su - otherusr e digite a senha se você for interativo de qualquer maneira. Parece que você já está em um shell. - Hogstrom


Respostas:


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). Há sim sudo -S opção para mudar este comportamento, mas tanto quanto eu sei não há nenhuma opção semelhante para su.

Solução: use expect.

expect é um programa que "fala" com outros programas interativos de acordo com um script. Seguindo o roteiro, expect sabe o que pode ser esperado de um programa e qual deve ser a resposta correta.

[…]

Em geral, expect é útil para executar qualquer programa que requer interação entre o programa e o usuário. Tudo o que é necessário é que a interação possa ser caracterizada programaticamente.

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 apenas para você (chmod go-rwx). Outros usuários não devem ter permissão para lê-lo porque ele contém mypassword em texto simples; eles não deveriam ser autorizados a executá-lo, porque dá acesso a otherusr's shell.


0