su vs sudo -s vs sudo -i vs sudo bash


89

以下命令之间有什么区别:

su
sudo -s
sudo -i
sudo bash

我知道,因为su我需要知道root密码,并且sudo必须在sudoers文件中,但是一旦执行,有什么区别?

我知道su和之间有区别,sudo -s因为我的主目录/root在执行之后su,但是我的主目录仍然/home/myname在执行之后sudo -s。但是我怀疑这只是我所缺少的根本差异的征兆。


3
我更喜欢使用sudo su - 这种方式,您不需要root密码,并且-可以确保主目录设置正确。
Jens Timmerman 2013年

Answers:


114

使用su,您将成为另一个用户-默认情况下是root,但可能是另一个用户。如果您说su -,您的环境也将被该用户的登录环境所替换,因此您所看到的内容与以该用户身份进行的登录是无法区分的。系统无法su通过该用户登录时该用户的操作来告诉您该用户在做什么。

事情大不相同sudo

  • 您运行的命令以目标用户身份sudo 执行 -默认情况下是root,但可以更改-u-但它会记录您在其中运行的命令,并用您的用户名对其进行标记,以便以后可以进行指责。:)

  • sudo非常灵活。例如,您可以限制允许给定用户或用户组运行的命令。使用su,全部或全部消失。

    此功能通常用于定义角色。例如,您可以定义一个允许运行dump和的“备份”组tar,每个组都需要root用户访问权限才能正确备份系统磁盘。

    我在这里提到这一点是因为它意味着您可以授予某人sudo特权而无需给予他们sudo -s任何特权sudo bash。他们只有执行工作所需的权限,而su他们拥有整个系统的运行权。不过,您必须对此小心谨慎:sudo vi例如,如果您赋予某人说的能力,那么他们可以脱颖而出,vi并且具有与with相同的能力sudo -s

  • 因为它使用的是sudoer的密码而不是root密码,所以可以sudo隔离多个sudoer 之间的权限。

    这解决了的管理问题su,即当root密码更改时,su必须告知所有必须知道使用该密码的人。sudo允许sudoers的密码独立更改。实际上,通常密码锁定系统上的root用户帐户,并sudo通过强制执行所有sysadmin任务sudo。在拥有许多受信任的sudoers的大型组织中,这意味着当一名sysadmin管理员离开时,您无需更改root密码并将其分发给剩下的管理员。

之间的主要区别sudo bashsudo -s-s更短,让你通过在一对夫妇的方式为自己的用户默认的shell执行命令:

  1. 您可以说sudo -s some-command哪个some-command在您的外壳下运行。它基本上是的简写sudo $SHELL -c some-command

  2. 您可以改为将命令传递到S​​hell的标准输入,例如sudo -s < my-shell-script。您可以将其与heredoc一起使用,以将多个命令发送给单个sudo调用,而无需sudo重复键入。

这些行为都是可选的。更常见的是,您只给-s一个,所以它只是交互式地运行用户的外壳程序。在这种模式下,它的不同之处sudo bash在于,它可能运行的外壳程序不同于bash,因为它首先在SHELL环境变量中查找,然后如果未设置,则以用户的登录外壳程序设置(通常在中)/etc/passwd

运行的shell将sudo -s继承您当前的用户环境。如果您真正想要的是一个干净的环境(如刚登录后得到的),那么您想要的是sudo -i相对较新的功能sudo。粗略地说,sudo -isudo -s因为su -su:它重置所有,但一些关键的环境变量,并发送你回到你的用户的主目录。如果您也没有通过标准输入或向其提供在该Shell下运行的命令sudo -i some-command,它将作为交互式登录Shell运行该Shell,因此您的用户的Shell启动脚本(例如.bash_profile)将再次运行。

所有这些都使sudo -i安全性大大高于sudo -s。为什么?因为如果有人可以在之前修改您的环境sudo -s,则可能导致执行意外的命令。最明显的情况是修改SHELL,但修改也可能不那么直接,例如,PAGER如果您man foo在while下说,则可能会通过sudo -s

您可能会说:“如果他们可以进行修改PAGER,他们可以进行修改PATH,然后就可以替代一个邪恶的sudo程序了,”但是有些偏执狂的人可以说/usr/bin/sudo /bin/bash避免这种陷阱。不过,您可能并不那么偏执,因此也避免了所有其他易受影响的环境变量中的陷阱。您还记得EDITOR例如在运行任何VCS命令之前进行过检查吗?这样sudo -i

因为sudo -i也改变了你的工作目录到用户的主目录,你仍然可能要使用sudo -s的那些你知道你想留在你同一个目录的情况cd倒是到,当你跑了sudo。它仍然是比较安全的sudo -i,并cd回到原来的地方,虽然。


2
“ vi脱壳”是什么意思?
crisron

11
@crisron:在中vi,键入:sh并按Enter。现在,您处于子外壳程序中,具有vi生成该外壳程序的所有特权。如果vi运行时具有root特权,那么外壳程序也将运行。或者,您可以通过运行Shell以外的其他东西:!cmd,通过:r !cmd等将命令的输出读取到编辑缓冲区中。如果所有这些都被锁定,则Makefile目标是shell脚本,而Vim具有该:make命令,可以有效地运行任意shell编辑器中的脚本。恶作剧的可能性实在太大,以至于此注释框无法容纳。
沃伦·杨

2
如果有人可以在您的PATH中放置一个假的bash,那么有人可以在您的PATH中放置一个假的sudo。以确保您必须使用完整路径调用sudo:/usr/bin/sudo
lesmana 2015年

1
@lesmana:我已经在编辑中解决了这个问题;基本上,这PATH不是唯一的问题。
沃伦·杨

6
很好的解释;读它很头疼。
罗比,2015年

27

我在不久前发表ubuntuforums帖子中

请考虑以下实验:

applic@ion:~% sudo su
[sudo] password for applic:
root@ion:/home/applic# env > /tmp/sudo_su_env
root@ion:/home/applic# exit
exit
applic@ion:~% sudo -s
applic .bashrc read...
root@ion:~% env >/tmp/sudo_s

这是我发现的差异:

sudo -s

HOME=/home/applic
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
reads $USER's ~/.bashrc

sudo su

HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
reads /etc/environment
reads /root/.bashrc

请注意中的差异$HOME。成为root用户并$HOME设置为普通用户的家可能会导致问题。例如,如果您运行图形应用程序,则普通用户~/.Xauthority可以被root 用户覆盖。这会在以后引起普通用户问题,例如无法通过cron运行某些图形应用程序。

总结一下:

                                     corrupted by user's 
        HOME=/root  uses root's PATH     env vars
sudo -i     Y       Y[2]                 N
sudo -s     N       Y[2]                 Y
sudo bash   N       Y[2]                 Y
sudo su     Y       N[1]                 Y
  1. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 可能是由 /etc/environment
  2. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

最重要的sudo -i是,当您需要不受用户环境污染的根外壳程序时,可以运行该命令。


1
环境被“污染”了多少还取决于sudo(在/etc/sudoers及相关文件中)的配置。配置设置,例如always_set_homeenv_resetenv_keepenv_checkenv_reset,并且这些可以根据用户和命令而变化。请参见sudoers(5)联机帮助页的“命令环境”SUDOERS OPTIONS部分。
Curt J. Sampson

就我个人而言,sudo -Hs当我想要不受设置影响的环境时,我会选择使用,因为我使用zsh和可能要更改为使用bash的所有应用程序帐户。这确实使一定数量的环境变量不受干扰地传递,但是我通常会发现重要的变量被/etc/profile.d/*覆盖。
埃德·格林

7

su小号女巫ü SER或小号 ubstitute ü SER)可以让您切换用户。su基本上是使用目标用户的特权启动另一个Shell实例。默认情况下,它会将您切换到root用户,如果我们要切换特定用户,则需要按以下方式传递用户:

$ su bob  # switches to bob (requires bob's password)

su -意味着环境变量将被重置为root,并且su意味着环境变量作为旧用户。

例如:如果使用root的主目录,或者使用su -老式用户的主目录su

须藤(小号 UPER ü SER )是一个命令行实用程序,允许用户运行与另一用户的安全权限的程序,默认情况下是超级用户即root。它使用一个配置文件/etc/sudoers,其中列出了哪些用户有权执行特定操作

sudo应该读为/ ˈsuːduː /。语法sudo command小号女巫ü SER和执行该命令。

  • su等效于sudo -i并模拟到根帐户的登录。您的工作目录将是/root,它将读取root的.profile等。提示符将从$更改为#,表示您具有root访问权限。

  • sudo -s 以root身份启动Shell,但不更改您的工作目录。

  • sudo bash 在何处bash运行命令sudo。该命令bash以超级用户身份运行 。

  • 使用sudo记录可以记录某人所做的一切。
  • 使用sudo可以防止用户知道root密码。
  • 使用sudo我们可以限制允许运行的命令。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.