Linux 中的 su 和 sudo 命令有什么区别?

发表于:2022-12-16 09:42

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:David Both    来源:Linux中国

  su 和sudo 命令都允许用户执行非特权用户不允许做的系统管理任务,即只有root用户能执行的命令。有些人更喜欢sudo 命令:例如SethKenlon。最近发布的一篇《在Linux上使用sudo的5个理由》,他在其中详细阐述了sudo命令的许多优点。
  但是,相较于sudo命令,我更偏好于su?命令来做系统管理工作。在本文中,我比较了这两个命令的区别,并解释了为什么我更喜欢su而不是sudo,但我仍然同时使用这两个命令的原因。
  过去的系统管理员主要使用su命令
  su和sudo命令是为不同的世界设计的。早期的Unix计算机需要全职系统管理员,他们使用root用户作为唯一的管理帐户。在这个古老的世界里,有管理员密码的人会在电传打字机或CRT终端(例如DECVT100)上以root用户登录,然后执行一些管理Unix计算机的工作。
  管理员还会有一些非root帐户,用于执行一些非root的任务,例如编写文档和管理电子邮件等。在这些Unix计算机上通常有许多非root帐户,他们都不需要完全的root访问权限,只需要以root权限运行很少的命令,大约1至2个就可以了。许多系统管理员以root用户登录,完成root工作,并在任务完成后,退出root会话。有时候,系统管理员需要整天以root用户来登录,因为sudo命令需要键入更多的内容才能运行必要的命令,因此大多数系统管理员很少使用sudo命令。
  sudo和su这两个命令都能够提权为root用户,但它们实现的方式大不相同。这种差异是由于它们最初打算用于不同的情况。
  sudo命令
  sudo命令的初衷是让root用户能够让几个非root用户访问他们经常需要的一两个特权命令。sudo命令允许非root用户暂时地获得更高权限,来执行一些特权命令,例如添加和删除用户、删除属于其他用户的文件、安装新软件以及管理现代Linux主机所需的任何命令。
  sudo命令允许非root用户访问一两个需要更高权限的常用命令,这样可以帮助系统管理员节省来自用户的许多请求,并减少等待时间。sudo命令不会将用户帐户切换为root用户,因为大多数非root用户永远不应该拥有完全的root访问权限。在大多数情况下,sudo允许用户执行一两个命令,然后提权就会过期。在这个通常为5分钟的短暂的提权时间内,用户可以执行任何需要提权的管理命令。需要继续使用提权的用户可以运行sudo-v命令来重新验证root访问权限,并将提权时间再延长5分钟。
  使用sudo命令还有一些副作用,例如生成非root用户使用命令的日志条目及其ID。这些日志可以在之后作为出现问题的检验,来给用户更多的操作培训。(你以为我会说“问责”用户,对吧?)
  su命令
  su命令能够将非root用户提权到root权限——事实上,能让非root用户成为root用户。唯一的要求是用户知道root密码。因为用户已经以root权限登录,所以之后的操作就没有限制了。
  su命令所提供的提权没有时间限制。用户可以作为root执行命令,不需要进行重新验证是否有root权限。完成任务后,用户可以执行退出命令exit,从root用户恢复到自己原来的非root帐户。
  su和sudo在使用上的争议和变化
  最近在su与sudo的使用上存在一些分歧。
  真正的系统管理员不会使用sudo。——PaulVenezia
  Venezia在他的InfoWorld文章中辩称,对于许多担任系统管理员的人来说,sudo是一个不必要的工具。他没有花太多时间为这个观点进行解释,他只是把它说成了一个事实。我同意他对于系统管理员的观点,因为我们不需要sudo来完成我们的工作。事实上,sudo使得事情变得更复杂了。
  然而,
  时代在“改变”。——BobDylan
  BobDylan是对的,尽管他唱的歌不是指计算机(LCTT译注:BobDylan是美国创作歌手、艺术家和作家,这里指他不是针对于电脑而说的)。
  自从人手一台的个人计算机时代到来,计算机的管理方式发生了重大变化。在许多环境中,计算机的使用者也是它的管理员,这使得为这些用户提供一些对root权限的访问是有必要的。
  一些现代发行版,例如Ubuntu及其衍生版本,只能使用sudo命令来执行特权命令。在这些发行版中,用户无法直接以root用户身份登录,甚至无法通过su切换到root,因此需要sudo命令来允许非root用户获得root权限。在这一环境中,所有系统管理任务均使用sudo来执行。
  通过锁定root帐户并将常规用户帐户添加到“轮子”组(wheel),可以实现此配置,但是这种配置很容易被绕过。接下来,让我们在Ubuntu主机或虚拟机上尝试一些小实验吧。我在这里说明一些我的设置,以便你可以根据需要来重现它。我安装的是Ubuntu16.04LTS1,并使用VirtualBox将其安装在虚拟机中。在安装过程中,我创建了一个非root用户student,为了简便起见我给这个用户设置了一个简单的密码。
  以student用户身份登录Ubuntu,并打开终端。查看/etc/shadow文件中的root条目,其中存储了经哈希的密码。
  student@ubuntu1:~$cat/etc/shadow
  cat:/etc/shadow:Permissiondenied
  可以看到终端拒绝了我们对/etc/shadow的访问,因此我们无法查看/etc/shadow文件。所有发行版都是如此,以防止非特权用户看到和访问加密的密码,因为非特权用户可能会使用常见的黑客工具来破解这些密码。
  现在,让我们使用su-命令来成为root用户。
  student@ubuntu1:~$su-
  Password:<Enterrootpassword–butthereisn'tone>
  su:Authenticationfailure
  认证失败的原因是因为root帐户没有密码、并且被锁定了。接下来,使用sudo?命令查看/etc/shadow文件。
  student@ubuntu1:~$sudocat/etc/shadow
  [sudo]passwordforstudent:<enterthestudentpassword>
  root:!:17595:0:99999:7:::
  <截取>
  student:$6$tUB/y2dt$A5ML1UEdcL4tsGMiq3KOwfMkbtk3WecMroKN/:17597:0:99999:7:::
  <截取>
  在这里,我仅截取了部分结果,只显示root和student用户的条目。我还缩短了加密密码,以便该条目能显示在一行中。各个字段以冒号(:)分隔,第二个字段是密码。请注意,root的密码字段是一个感叹号(!),这表明root帐户已被锁定,且无法使用。
  现在,要将root帐户变成一个合适的系统管理员,你只需为root帐户设置密码。
  student@ubuntu1:~$sudosu-
  [sudo]passwordforstudent:<Enterpasswordforstudent>
  root@ubuntu1:~#passwdroot
  EnternewUNIXpassword:<Enternewrootpassword>
  RetypenewUNIXpassword:<Re-enternewrootpassword>
  passwd:passwordupdatedsuccessfully
  root@ubuntu1:~#
  现在,你可以直接以root身份登录到控制台,或者直接使用su登录到root,而不是在每个命令前都加一个sudo。当然,你也可以在每次想以root身份登录时,使用sudosu-,但这又是何必呢?
  请不要误解我的意思。像Ubuntu这样的发行版及其上下游衍生版非常好,多年来我已经使用了其中的几个。在使用Ubuntu和相关发行版时,我做的第一件事就是设置一个root密码,这样我就可以直接以root身份登录。其他发行版,如Fedora及其相关发行版,现在在安装过程中提供了一些有趣的选择。我注意到的第一个Fedora版本是Fedora34,我在写我的一本即将出版的书时安装了很多次。
  在安装页面上,可以找到其中一个安装选项,来设置root密码。这个新选项允许用户选择“锁定root帐户Lockrootaccount”,就像Ubuntu锁定root帐户的方式一样。此页面上还有一个选项,允许使用密码以root身份远程SSH登录到此主机,但这仅在root帐户解锁时有效。第二个选项位于允许创建非root帐户的页面上。此页面上的选项之一是“让此用户成为管理员Makethisuseradministrator”。选中此选项后,用户ID将添加到一个名为wheel组的特殊组中,该组授权该组的成员使用sudo命令。Fedora36甚至在该复选框的描述中提到了wheel组。
  可以将多个非root用户设置为管理员。使用此方法指定为管理员的任何人都可以使用sudo命令在Linux计算机上执行所有管理任务。Linux在安装时只允许创建一个非root用户,所以其他新用户可以在创建时添加到wheel组中。root用户或其他管理员可以使用文本编辑器或usermod命令直接将现有用户添加到wheel组。
  在大多数情况下,今天的管理员只需要执行一些基本任务,例如添加新的打印机、安装更新或新软件,或者删除不再需要的软件。这些GUI工具需要root或管理密码,并将接受来自管理员用户的密码。
  在Linux上,我是怎么使用su和sudo的呢
  我同时使用su?和sudo。它们都是我所使用的很重要的系统管理员工具。
  我不锁定root帐户,因为我需要用root帐户来运行我的Ansible脚本和我编写的rsbuBash程序,来执行备份。这两个程序都需要以root身份运行,我编写的其他几个管理Bash的脚本也是如此。我使用su?命令切换到root用户,这样我就可以执行这些脚本和许多其他常见的命令。当我需要确定问题和解决问题时,使用su命令将我的权限提升到root十分有用,因为我不希望sudo带来的提权会话超时。
  当非root用户需要执行这些任务时,我使用sudo?命令,来执行需要root权限的任务。我在sudoers文件中设置了非root帐户,只允许访问完成任务所需的一两个命令。当我只需要运行一两个需要提权的快速命令时,我自己也会使用sudo命令。
  结论
  实际上只要你把工作完成好了,你使用什么工具都无大碍。你使用的是Vim还是Emacs,是systemd还是SystemV,是RPM亦或是DEB,是sudo亦或是su,在结果上会有什么区别呢?这里的关键在于你应该使用最适合你的工具。Linux和开源软件的最大优势之一是通常有许多选项可用于我们需要完成的任务。
  su和sudo都各有长处,如果正确使用的话,两者都是非常安全的。我选择同时使用su和sudo命令,基于它们的历史功能,因为这对我来说十分有用。对于我自己的大部分工作,我更喜欢su命令,因为它与我的工作流程最适配。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号