Por que o sudo -S impede um shell interativo?

2

Estou tentando mudar para outro usuário usando o sudo, mas quando eu uso a opção -S para ler a senha do stdin, volto ao meu usuário original.

por exemplo,

Conteúdo de ~newuser/.profile :

echo "Welcome to newuser's account"

Usando o sudo sem -S :

$ whoami
origuser
$ sudo -iu newuser
[sudo] password for origuser:
Welcome to newuser's account
$ whoami
newuser

Mas ao usar -S :

$ whoami
origuser
$ sudo -Siu newuser < password.txt
Welcome to newuser's account
$ whoami
origuser

Assim, como você pode ver, usar -S faz com que o shell seja invocado e o .profile é analisado, mas o shell retorna ao usuário original.

Por que isso acontece?

É possível contornar isso?

    
por swampf0etus 06.04.2018 / 14:16

2 respostas

4

Com sudo -Siu newuser < password.txt , a entrada padrão para o comando sudo -Siu newuser é obtida de password.txt . A opção -S faz com que sudo leia a senha da entrada padrão e, portanto, de password.txt . Mas a entrada padrão para o shell resultante permanece redirecionada.

Quando a entrada é redirecionada para um shell - esteja ou não em execução no modo interativo - e o final da entrada é atingido, o shell é encerrado. Isso é semelhante a executar um script e fazer com que ele atinja o final do arquivo ou pressionar Ctrl + D para fazer com que seu terminal indique o fim da entrada. / p>

Portanto, você está iniciando um shell cuja entrada é redirecionada de um arquivo, cujo conteúdo provavelmente já é lido principalmente. Chega ao fim e sai. Realmente, seu objetivo é que o shell comece com sudo para receber entrada de seu terminal e não daquele arquivo.

Embora você provavelmente possa contornar isso com descritores de arquivos adicionais e mais informações indiretas, bem como outros métodos, sugiro que você simplesmente execute a autenticação como uma etapa separada primeiro, antes de executar o shell: / p>

sudo -Sv < password.txt

Feito isso, você pode simplesmente executar:

sudo -iu newuser

Se você executar o segundo comando logo após o primeiro, seu timestamp ainda será válido e você não precisará inserir senhas.

Observe que, quando você executa um comando como um usuário nomeado com sudo com -u , ele funciona da mesma forma que quando você executa um comando como root (que geralmente é feito sem -u ). A senha que ele pede é sua senha , não a do usuário alvo, e é por isso que o comando que apenas faz autenticação (com -v ) não menciona o outro usuário. É possível configurar sudo para esperar a senha do usuário alvo, mas as pessoas raramente fazem isso na prática e você não mencionou isso, então eu suponho que não é isso que você (e a maioria dos outros leitores) está interessado em.

(É claro que as advertências habituais sobre os riscos de segurança associados à leitura da senha em um arquivo como este continuam a se aplicar, na mesma medida em que foram aplicadas anteriormente).

    
por 06.04.2018 / 14:41
1

Quando um shell é executado com sua entrada padrão conectada a algo diferente de um terminal, ele lê os comandos da entrada padrão e os executa, até que a entrada padrão seja fechada.

Quando você corre

sudo -Siu newuser < password.txt
A leitura padrão de

sudo é de password.txt ; sudo não altera isso antes de iniciar o shell, portanto, o shell também lê a partir de password.txt . Duas coisas podem acontecer então: se sudo necessitar de uma senha, ela terá lido e o shell atingirá imediatamente o final do arquivo (assumindo que não contém mais nada) e sairá; caso contrário, o shell tentará analisar a senha e executá-la ...

Não sei se há uma maneira confiável e, em qualquer caso, o tratamento duplo significa que você provavelmente não deseja (a menos que tenha desativado os tokens). Você pode preparar um token antes de iniciar um shell, conforme descrito na resposta de Eliah Kagan , se você não desativou os tokens.

    
por 06.04.2018 / 14:39

Tags