su命令和sudo命令都让用户可以执行非特权用户(除root用户之外的所有人)无权执行的系统管理任务。一些人偏爱sudo命令,比如Seth Kenlon最近发表了《在Linux上使用sudo的五个理由》,该文盛赞sudo的诸多优点。
另一方面,我偏爱su命令,更喜欢用它而不是用sudo来处理我从事的大部分系统管理工作。我在本文中比较了这两个命令,解释了为什么我更喜欢su而不是sudo,但仍然同时使用这两个命令。
系统管理员的历史观点
su命令和sudo命令是为不同的世界设计的。早期的Unix计算机需要全职系统管理员,他们使用root帐户作为唯一的管理帐户。在那个时代,拥有root密码的人以root身份登录电传打字机或CRT终端,然后执行管理Unix计算机所必需的管理任务。root用户也会拥有非root帐户来处理非root活动,比如编写文档和管理个人电子邮件。
这些计算机上通常有许多非root用户帐户,这些用户都不需要全面的root访问权。用户可能需要以root身份运行一两个命令,但很少这样。许多系统管理员以root身份登录,完成工作后退出root会话。有时需要整天保持以root身份登录的状态。大多数系统管理员之所以很少使用sudo,是由于它需要输入比运行基本命令所需的更多内容。这些工具都可以提升权限,但方式大不相同。这种差异归因于它们最初面向不同的用例。
sudo
sudo的初衷是让root用户能够向一两个非root用户授予这一权限:访问他们经常需要的一两个特定命令。sudo命令使非root用户可以临时访问执行任务所需的提升权限,比如添加和删除用户、删除属于其他用户的文件、安装新软件以及通常管理现代Linux主机所需的任何任务。
允许用户访问需要提升权限的一两个常用命令可以让系统管理员避免用户的大量请求,并消除等待时间。sudo命令并不将用户帐户切换成root;大多数非root用户永远不应该拥有全面的root访问权。在大多数情况下,sudo让用户可以发出一两个命令,然后允许权限提升到期失效。在这个短暂的间隔(通常设置为5分钟),用户可以执行任何需要提升权限的必要管理任务。如果用户需要继续使用提升的权限,但尚未准备好发出另一个与任务相关的命令,可以运行sudo -v命令,重新验证登录信息,并将间隔时间再延长5分钟。
使用sudo命令确实有这个副作用:生成非root用户使用的命令的日志条目及其ID。日志便于事后分析问题,以确定用户何时需要加强培训。
su
su命令旨在允许非root用户将权限级别提升到root——实际上就是非root用户成为root用户。唯一的要求是用户需要知道root密码。这方面没有任何限制,因为用户现在以root身份登录。su命令提供的权限提升没有时间限制。用户以root身份想工作多久就可以多久,无需重新验证身份。完成工作后,用户可以发出exit命令,从root恢复到自己的非root帐户。
争议和变化
最近su与sudo的使用存在一些分歧。“真正的[系统管理员]不使用sudo”——Paul Venezia
Venezia在其文章中称,对于许多充当系统管理员的人来说,sudo被用作不必要的道具。他没有用太多的篇幅来捍卫或解释这一立场,只是声称这是事实。我同意他的看法,对于系统管理员来说是这样。我们不需要辅助轮来完成我们的工作。实际上,辅助轮很碍事。
然而,时代在“变化” ——美国民谣之父Bob Dylan是对的。自单人单机时代问世以来,管理计算机的方式发生了显著变化。在许多环境中,计算机的用户也是管理员。因此有必要为那些用户提供root的部分权限。一些现代发行版(比如Ubuntu及衍生版)经配置后,可将sudo命令专门用于特权任务。在那些发行版中,不可能以root用户身份直接登录或者甚至使用su成为root,因此需要sudo命令允许非root用户访问root权限。在这种环境下,所有系统管理任务都使用sudo来执行。
如果锁定root帐户,并将常规用户帐户添加到wheel组,可以进行这种配置。这种配置很容易被规避。
不妨在任何Ubuntu主机或虚拟机上先进行试验。我安装了Ubuntu 16.04 LTS1,并使用VirtualBox将它安装在虚拟机中。我在安装过程中为这个试验创建了一个非root用户student,并使用了一个简单的密码。
以用户student身份登录,打开终端会话。查看/etc/shadow文件中root对应的条目,加密的密码存储在该文件中。
student@ubuntu1:~$ cat /etc/shadow
cat: /etc/shadow: Permission denied
权限被拒绝,因此我们无法查看/etc/shadow文件。这对所有发行版都很常见,旨在防止非特权用户查看和访问加密的密码,不然可以使用常见的黑客工具破解这些密码。现在不妨尝试使用su –成为root。
student@ubuntu1:~$ su -
Password: <Enter root password – but there isn't one>
su: Authentication failure
左右滑动查看完整代码这会失败,因为root帐户没有密码,被锁在外面。使用sudo命令查看/etc/shadow文件。
student@ubuntu1:~$ sudo cat /etc/shadow
[sudo] password for student: <enter the student password>
root:!:17595:0:99999:7:::
<snip>
student:$6$tUB/y2dt$A5ML1UEdcL4tsGMiq3KOwfMkbtk3WecMroKN/:17597:0:99999:7:::
<snip>
左右滑动查看完整代码我截断了输出结果,只显示root和student用户对应的条目。我还缩短了加密的密码,因此条目将放在一行中。字段由冒号(:)隔开,第二个字段是密码。请注意,root的密码字段是bang,即是个感叹号(!)。这表明该帐户已被锁住,无法使用。
现在,要使用root帐户成为真正的系统管理员,就需要为root帐户设置密码。
student@ubuntu1:~$ sudo su -
[sudo] password for student: <Enter password for student>
root@ubuntu1:~# passwd root
Enter new UNIX password: <Enter new root password>
Retype new UNIX password: <Re-enter new root password>
passwd: password updated successfully
root@ubuntu1:~#
左右滑动查看完整代码现在您可以直接在控制台上以root身份登录,或者直接使用su成为root,而不是对每个命令使用sudo。当然,每当您想以root身份登录,完全可以就使用sudo su -,但何必劳这个神?
请别误解我的意思。Ubuntu及上下游衍生版之类的发行版非常好,这些年来我就用过其中几个。在使用Ubuntu及相关发行版时,我最先做的事情之一是设置root密码,以便我可以直接以root身份登录。
其他发行版(如Fedora及衍生版)如今在安装过程中提供几个有意思的选择。我注意到这点的第一个Fedora版本是Fedora 34。可以在页面上找到这些安装选项之一,以设置root密码。新选项允许用户以锁定Ubuntu root帐户的方式选择“锁定root帐户”。该页面上还有一个选项,允许使用密码,以root身份远程SSH登录到该主机,但仅当root帐户被解锁时才适用。
页面上的第二个选项允许创建非root用户帐户。该页面上的选项之一是“将该用户设为管理员”。选中该选项后,用户ID被添加到名为wheel组的特殊组中,授权该组成员可以使用sudo命令。Fedora 36甚至在该复选框的描述中提到了wheel组。
可以将多个非root用户设为管理员。使用该方法指定为管理员的任何人都可以使用sudo命令,在Linux计算机上执行所有管理任务。
Linux只允许在安装过程中创建一个非root用户,因此其他新用户可以在创建时添加到wheel组中。root用户或另一个管理员可以使用文本编辑器或usermod命令,将现有用户直接添加到wheel组。在大多数情况下,今天的管理员只需要执行几项基本任务,比如添加新打印机、安装更新或新软件,或者删除不再需要的软件。这些GUI工具需要root或管理员密码,接受指定为管理员的用户输入的密码。
我如何在Linux上使用su和sudo?
我既使用su又使用sudo。它们在我的系统管理员工具箱中都有重要的位置。
我无法锁定root帐户,因为我需要使用它来运行我的Ansible剧本和为执行备份而编写的rsbu Bash程序。这两个命令都需要以root身份运行,我编写的另外几个管理Bash脚本也是如此。我使用su命令将用户切换成root用户,那样我就可以执行这些任务和其他许多常见任务。在确定和解决问题时,使用su将我的权限提升到root尤其有用。
当非root用户需要执行需要root权限的任务时,我将sudo命令用于这些任务。我在sudoers文件中设置了非root帐户,以便只访问完成任务所需的一两个命令。当我只需要运行一两个拥有升级权限的快速命令时,我自己也会使用sudo。
结论
使用哪种工具其实不如完成工作那么重要。使用vim或Emacs、systemd或SystemV、RPM或DEB、sudo或su,并没有那么大的区别。
归根到底,应该使用最顺手、最适合自己的工具。Linux和开源的最大优点之一便是,我们通常都有许多可供选择工具帮助我们完成任务。su和sudo各有优点,适当用于预期的用例时,两者都表现不俗。我偏爱用su处理自己的大部分工作,因为它最适合我和我的工作流程。
参考链接:
ps://opensource.com/article/22/6/linux-su-vs-sudo-sysadmin