linux权限sudo和su,系统运维|深入理解 sudo 与 su 之间的区别

在早前的一篇文章中,我们深入讨论了 sudo 命令的相关内容 。同时,在该文章的末尾有提到相关的命令 su 的部分内容 。本文,我们将详细讨论关于 su 命令与 sudo 命令之间的区别 。
在开始之前有必要说明一下,文中所涉及到的示例教程都已经在14.04 LTS 上测试通过 。
Linux su 命令
su 命令的主要作用是让你可以在已登录的会话中切换到另外一个用户 。换句话说,这个工具可以让你在不登出当前用户的情况下登录为另外一个用户 。
su 命令经常被用于切换到超级用户或 root 用户(因为在命令行下工作,经常需要 root 权限),但是 - 正如前面所提到的 - su 命令也可以用于切换到任意非 root 用户 。
如何使用 su 命令切换到 root 用户,如下:
如上,su 命令要求输入的密码是 root 用户的密码 。所以,一般 su 命令需要输入目标用户的密码 。在输入正确的密码之后,su 命令会在终端的当前会话中打开一个子会话 。
su -
还有一种方法可以切换到 root 用户:运行 su - 命令,如下:
那么,su 命令与 su - 命令之间有什么区别呢?前者在切换到 root 用户之后仍然保持旧的(或者说原始用户的)环境,而后者则是创建一个新的环境(由 root 用户 ~/. 文件所设置的环境),相当于使用 root 用户正常登录(从登录屏幕登录) 。
su 命令手册页很清楚地说明了这一点:
可选参数 - 可提供的环境为用户在直接登录时的环境 。
因此,你会觉得使用 su - 登录更有意义 。但是, su 命令也是有用的,那么大家可能会想知道它在什么时候用到 。以下内容摘自wiki 网站 - 关于 su 命令的好处和坏处:
有的时候,对于系统管理员(root)来讲,使用其他普通用户的 Shell 账户而不是自己的 root Shell 账户更会好一些 。尤其是在处理用户问题时,最有效的方法就是是:登录目标用户以便重现以及调试问题 。
然而,在多数情况下,当从普通用户切换到 root 用户进行操作时,如果还使用普通用户的环境变量的话,那是不可取甚至是危险的操作 。因为是在无意间切换使用普通用户的环境,所以当使用 root 用户进行程序安装或系统更改时,会产生与正常使用 root 用户进行操作时不相符的结果 。例如,以普通用户安装程序会给普通用户意外损坏系统或获取对某些数据的未授权访问的能力 。
注意:如果你想在 su - 命令的 - 后面传递更多的参数,那么你必须使用 su -l 而不是 su - 。以下是 - 和 -l 命令行选项的说明:
-, -l, --login

linux权限sudo和su,系统运维|深入理解 sudo 与 su 之间的区别

文章插图
提供相当于用户在直接登录时所期望的环境 。
当使用 - 时,必须放在 su 命令的最后一个选项 。其他选项(-l 和 --login)无此限制 。
su -c
还有一个值得一提的 su 命令行选项为:-c 。该选项允许你提供在切换到目标用户之后要运行的命令 。
su 命令手册页是这样说明:
-c, --
使用 -c 选项指定由 Shell 调用的命令 。
被执行的命令无法控制终端 。所以,此选项不能用于执行需要控制 TTY 的交互式程序 。
参考示例:
su [-user] -c [-to-run]
示例中,-to-run 将会被这样执行:
[shell]-c[-to-run]
示例中的 shell 类型将会被目标用户在 /etc/ 文件中定义的登录 shell 类型所替代 。
sudo vs. su
现在,我们已经讨论了关于 su 命令的基础知识,是时候来探讨一下 sudo 和 su 命令之间的区别了 。
关于密码
两个命令的最大区别是:sudo 命令需要输入当前用户的密码,su 命令需要输入 root 用户的密码 。
很明显,就安全而言,sudo 命令更好 。例如,考虑到需要 root 访问权限的多用户使用的计算机 。在这种情况下,使用 su 意味着需要与其他用户共享 root 用户密码,这显然不是一种好习惯 。