Por que su preservar SHELL = / bin / bash neste caso?

1

Eu estava experimentando com a troca de usuários com o comando su . Estou confuso porque su carregando a variável de ambiente SHELL para um usuário monty . O exercício é mostrado abaixo:

vagrant@cats:/home$ cat /etc/passwd | grep -E "monty|vagrant"
vagrant:x:900:900:vagrant,,,:/home/vagrant:/bin/bash
monty:x:1000:1002::/home/monty:
vagrant@cats:/home$ cat /etc/default/useradd | grep SHELL
# The SHELL variable specifies the default login shell on your
SHELL=/bin/sh
vagrant@cats:/home$ echo $SHELL
/bin/bash
vagrant@cats:/home$ ssh monty@localhost
monty@localhost's password:
Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-31-generic x86_64)

* Documentation:  https://help.ubuntu.com
* Management:     https://landscape.canonical.com
* Support:        https://ubuntu.com/advantage
Last login: Wed Sep 28 17:34:36 2016 from ::1
$ echo $SHELL
/bin/sh
$ exit
Connection to localhost closed.
vagrant@cats:/home$ su monty
Password:
monty@cats:/home$ echo $SHELL
/bin/bash
monty@cats:/home$ exit
exit

Como pode ser visto acima:

  • Existem pelo menos dois usuários vagrant e monty
  • vagrant tem um shell especificado de /bin/bash
  • monty tem um shell não especificado que deve usar como padrão /bin/sh , conforme mostrado no arquivo /etc/default/useradd
    • é feito o backup por sshing em monty e verificando o shell
  • exceto que, estranhamente, por que usar su monty a variável SHELL env permanece como /bin/bash

Essa última bala é a principal razão pela qual estou confuso. Observar man su não parece ajudar, observe o sinal -s :

-s, --shell SHELL
           The shell that will be invoked.

           The invoked shell is chosen from (highest priority first):

               The shell specified with --shell.

               If --preserve-environment is used, the shell specified by the $SHELL environment variable.

               The shell indicated in the /etc/passwd entry for the target user.

               /bin/sh if a shell could not be found by any above method.

Descendo a lista:

  • Eu não usei o sinal -s ou --shell , então isso não explica nada
  • Eu também não usei a opção --preserve-environment que explicaria a situação, mas não porque não a usei
  • Não há shell no /etc/passwd para o usuário de destino, o que significa que o padrão é /bin/sh , de modo que não ajuda
  • Seria sensato para a falta de uma entrada e todos os cigarros ou interruptores acima para causar nada a ser encontrado, exceto então /bin/sh seria usado ... o que não é, então isso não acontece ajuda

Então, estou realmente confuso, parece que estou literalmente vendo uma inversão perfeita de qualquer comportamento que se poderia esperar depois de ler cada arquivo de configuração e a entrada de um cara nessa questão haha.

Adoraria alguma ajuda e orientação:)

Editar: veja a resposta e o comentário abaixo. Veja também o primeiro e o segundo ao último parágrafo na seção DESCRIÇÃO da página man

  

DESCRIÇÃO

     

... O argumento opcional - pode ser usado para fornecer um ambiente semelhante ao que o usuário esperaria se o usuário tivesse feito login diretamente.

     

...

     

O ambiente atual é passado para o novo shell ...

    
por mbigras 28.09.2016 / 20:01

1 resposta

4

su por padrão preserva o ambiente do usuário atual ao alternar para outro usuário, isso inclui o shell do usuário atual.

Para usar o ambiente e a configuração do usuário de destino, você precisa iniciar um login shell adicionando a opção -l / --login ou simplesmente - :

su - monty
    
por Byte Commander 28.09.2016 / 20:16