我正在尝试使用命令切换用户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
如上所示:
- 至少有两个用户
vagrant
和monty
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