为什么在这种情况下 su 保留 SHELL=/bin/bash ?

为什么在这种情况下 su 保留 SHELL=/bin/bash ?

我正在尝试使用命令切换用户su。我很困惑为什么 su 会将SHELL环境变量传递给用户monty。练习如下所示:

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

如上所示:

  • 至少有两个用户vagrantmonty
  • vagrant具有指定的 shell/bin/bash
  • monty有一个未指定的 shell,应默认为如文件 /bin/sh中所示/etc/default/useradd
    • 这是通过 ssh 进入 monty 并检查 shell 来支持的
  • 但奇怪的是,为什么使用环境su monty变量SHELL保持不变/bin/bash

最后一点是我感到困惑的主要原因。看一下man su似乎也没什么帮助,注意-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.

列表如下:

  • 我没有使用-s--shell标志,所以这不能解释任何事情
  • 我也没有使用--preserve-environment可以解释这种情况的开关,但不能解释,因为我没有使用它
  • /etc/passwd目标用户中没有 shell ,这应该意味着它默认为/bin/sh,所以这没有帮助
  • 缺少条目和所有上述 fag 或开关都会导致找不到任何内容,这是有道理的,除非/bin/sh使用 then...但事实并非如此,所以这也无济于事

所以我真的很困惑,似乎我在阅读完有关这个问题的每个配置文件和手册条目后,看到了人们所能预期的任何行为的完美反转哈哈。

希望得到一些帮助和指导:)

编辑:请参阅下面的答案和评论。另请参阅手册页中描述部分的第一段和倒数第二段

描述

...可选参数 - 可用于提供与用户直接登录时所期望的类似的环境。

...

当前环境被传递给新的 shell...

答案1

su默认情况下,在切换到另一个用户时保留当前用户的环境,其中包括当前用户的 shell。

要使用目标用户的环境和配置,您需要启动一个登录外壳通过添加-l/--login选项或者简单地添加-

su - monty

相关内容