<code>su</code> 命令的主要作用是让你可以在已登录的会话中切换到另外一个用户。换句话说,这个工具可以让你在不登出当前用户的情况下登录为另外一个用户。
<code>su</code> 命令经常被用于切换到超级用户或 root 用户(因为在命令行下工作,经常需要 root 权限),但是 - 正如前面所提到的 - su 命令也可以用于切换到任意非 root 用户。
如何使用 <code>su</code> 命令切换到 root 用户,如下:

不带命令行参数的 su 命令
如上,<code>su</code> 命令要求输入的密码是 root 用户的密码。所以,一般 <code>su</code> 命令需要输入目标用户的密码。在输入正确的密码之后,<code>su</code> 命令会在终端的当前会话中打开一个子会话。
<a target="_blank"></a>
还有一种方法可以切换到 root 用户:运行 <code>su -</code> 命令,如下:
su - 命令
那么,<code>su</code> 命令与 <code>su -</code> 命令之间有什么区别呢?前者在切换到 root 用户之后仍然保持旧的(或者说原始用户的)环境,而后者则是创建一个新的环境(由 root 用户 <code>~/.bashrc</code> 文件所设置的环境),相当于使用 root 用户正常登录(从登录屏幕登录)。
<code>su</code> 命令手册页很清楚地说明了这一点:
可选参数 <code>-</code> 可提供的环境为用户在直接登录时的环境。
有的时候,对于系统管理员(root)来讲,使用其他普通用户的 shell 账户而不是自己的 root shell 账户更会好一些。尤其是在处理用户问题时,最有效的方法就是是:登录目标用户以便重现以及调试问题。
然而,在多数情况下,当从普通用户切换到 root 用户进行操作时,如果还使用普通用户的环境变量的话,那是不可取甚至是危险的操作。因为是在无意间切换使用普通用户的环境,所以当使用 root 用户进行程序安装或系统更改时,会产生与正常使用 root 用户进行操作时不相符的结果。例如,以普通用户安装程序会给普通用户意外损坏系统或获取对某些数据的未授权访问的能力。
注意:如果你想在 <code>su -</code> 命令的 <code>-</code> 后面传递更多的参数,那么你必须使用 <code>su -l</code> 而不是 <code>su -</code>。以下是<code>-</code> 和 <code>-l</code> 命令行选项的说明:
<code>-</code>, <code>-l</code>, <code>--login</code> 提供相当于用户在直接登录时所期望的环境。 当使用 - 时,必须放在 <code>su</code> 命令的最后一个选项。其他选项(<code>-l</code> 和 <code>--login</code>)无此限制。
还有一个值得一提的 <code>su</code> 命令行选项为:<code>-c</code>。该选项允许你提供在切换到目标用户之后要运行的命令。
<code>su</code> 命令手册页是这样说明:
<code>-c</code>, <code>--command command</code> 使用 <code>-c</code> 选项指定由 shell 调用的命令。 被执行的命令无法控制终端。所以,此选项不能用于执行需要控制 tty 的交互式程序。
参考示例:
<code>su [target-user] -c [command-to-run]</code>
示例中,<code>command-to-run</code> 将会被这样执行:
<code>[shell]&nbsp;-c&nbsp;[command-to-run]</code>
示例中的 <code>shell</code> 类型将会被目标用户在 <code>/etc/passwd</code> 文件中定义的登录 shell 类型所替代。
现在,我们已经讨论了关于 <code>su</code> 命令的基础知识,是时候来探讨一下 <code>sudo</code> 和 <code>su</code> 命令之间的区别了。
两个命令的最大区别是:<code>sudo</code> 命令需要输入当前用户的密码,<code>su</code> 命令需要输入 root 用户的密码。
很明显,就安全而言,<code>sudo</code> 命令更好。例如,考虑到需要 root 访问权限的多用户使用的计算机。在这种情况下,使用 <code>su</code> 意味着需要与其他用户共享 root 用户密码,这显然不是一种好习惯。
此外,如果要撤销特定用户的超级用户/root 用户的访问权限,唯一的办法就是更改 root 密码,然后再告知所有其他用户新的 root 密码。
而使用 <code>sudo</code> 命令就不一样了,你可以很好的处理以上的两种情况。鉴于 <code>sudo</code> 命令要求输入的是其他用户自己的密码,所以,不需要共享 root 密码。同时,想要阻止特定用户访问 root 权限,只需要调整 <code>sudoers</code> 文件中的相应配置即可。
两个命令之间的另外一个区别是其默认行为。<code>sudo</code> 命令只允许使用提升的权限运行单个命令,而 <code>su</code> 命令会启动一个新的 shell,同时允许使用 root 权限运行尽可能多的命令,直到明确退出登录。
尽管 <code>sudo</code> 命令是以目标用户(默认情况下是 root 用户)的身份执行命令,但是它们会使用 <code>sudoer</code> 所配置的用户名来记录是谁执行命令。而 <code>su</code> 命令是无法直接跟踪记录用户切换到 root 用户之后执行了什么操作。
<code>sudo</code> 命令比 <code>su</code> 命令灵活很多,因为你甚至可以限制 sudo 用户可以访问哪些命令。换句话说,用户通过<code>sudo</code> 命令只能访问他们工作需要的命令。而 <code>su</code> 命令让用户有权限做任何事情。
大概是因为使用 <code>su</code> 命令或直接以 root 用户身份登录有风险,所以,一些 linux 发行版(如 ubuntu)默认禁用 root 用户帐户。鼓励用户在需要 root 权限时使用 <code>sudo</code> 命令。
然而,您还是可以成功执行 <code>su</code> 命令,而不用输入 root 用户的密码。运行以下命令:
<code>sudo su</code>
由于你使用 <code>sudo</code> 运行命令,你只需要输入当前用户的密码。所以,一旦完成操作,<code>su</code> 命令将会以 root 用户身份运行,这意味着它不会再要求输入任何密码。
原文发布时间为:2017-04-14
本文来自云栖社区合作伙伴“linux中国”