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

su
sudo -s
sudo -i
sudo bash


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

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

评论

我更喜欢使用sudo su-这样,您不需要root密码,并且-确保主目录设置正确。

另请参阅哪种最安全的方式来获得root特权:sudo,su或login?

#1 楼

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

sudo的情况大不相同:


通过sudo运行的命令以目标用户身份执行-默认情况下是root,但可以通过-u更改-但它会记录通过它运行的命令,并用您的用户名标记它们,以便以后可以分配责任。 :)

sudo非常灵活。例如,您可以限制允许给定用户或用户组运行的命令。对于su,它是全部或全部。

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

我在这里提到这一点是因为您可以给不授予sudosudo -s能力的人sudo bash特权。他们只有执行工作所需的权限,而使用su,他们可以运行整个系统。但是,您必须对此小心谨慎:例如,如果您允许某人说sudo vi,那么他们可以脱身vi,并具有与sudo -s相同的能力。


由于sudo会使用sudoer的密码而不是root密码,因此可以隔离多个sudoer之间的权限。

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


sudo bashsudo -s之间的主要区别是-s较短,可以让您通过以下两种方式传递命令以在用户的​​默认Shell中执行:


您可以说在您的操作系统下运行sudo -s some-commandsome-command贝壳。它基本上是sudo $SHELL -c some-command的简写。
您可以改为将命令传递到S​​hell的标准输入,例如sudo -s < my-shell-script。您可以将其与heredoc一起使用,以将多个命令发送到单个sudo调用,而无需重复键入sudo

这两种行为都是可选的。更常见的是,您单独提供-s,因此它只是交互式运行用户的外壳程序。在这种模式下,它与sudo bash的不同之处在于,它可能运行与bash不同的外壳程序,因为它首先在SHELL环境变量中查找,然后在用户的登录外壳程序设置(通常在/etc/passwd中)中将其设置为未设置。 >
sudo -s运行的外壳程序继承了您当前的用户环境。如果您真正想要的是一个干净的环境(例如刚登录后得到的),则您想要的是sudo -i,它是sudo的相对较新的功能。粗略地讲,sudo -isudo -ssu -su:它重置除几个关键环境变量外的所有关键环境变量,然后将您发送回用户的主目录。如果您也没有通过标准输入或sudo -i some-command为其提供在该Shell下运行的命令,它将作为交互式登录Shell运行该Shell,因此您的用户的Shell启动脚本(例如.bash_profile)将再次运行。

所有这些使sudo -isudo -s更加安全。为什么?因为如果有人可以在sudo -s之前修改您的环境,那么他们可能会导致执行意外的命令。最明显的情况是修改SHELL,但是它也可以不太直接地发生,例如,如果在PAGER下说man foo,则通过sudo -s进行。

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

因为sudo -i还将工作目录更改为用户的主目录,对于那些您想保留在与sudo -s相同的目录中的情况,您可能仍要使用cd。当您运行sudo时。不过,将sudo -icd返回到您所在的位置仍然更安全。

评论


“ vi脱壳”是什么意思?

– Crisron
14-10-20在5:01

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

–沃伦·杨(Warren Young)
14-10-20在5:57

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

– Lesmana
15年8月2日在19:35

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

–沃伦·杨(Warren Young)
15年8月2日在23:39

很好的解释;读它很头疼。

–lobi
2015年10月1日在16:53

#2 楼

从我不久前发表的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




PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
可能是/etc/environment设置的

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

底线是sudo -i是要使用根外壳程序时运行的正确命令不受用户环境的影响。

评论


环境被“污染”了多少还取决于sudo的配置(在/ etc / sudoers和相关文件中)。配置设置,例如always_set_home,env_reset,env_keep,env_check和env_reset,这些设置可能会因用户和命令而异。请参见sudoers(5)联机帮助页的“命令环境”和SUDOERS OPTIONS部分。

– cjs
17年12月7日,11:35



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

–爱德·格林
19年2月12日在2:49

没有理由进行sudo su。请停止输入并发布它。

–克里斯托弗(Christopher)
19年11月22日15:10



#3 楼

su(切换用户或替代用户)使您可以切换用户。 su基本上以目标用户的特权启动另一个shell实例。默认情况下,它将切换到root用户,如果要切换特定用户,则需要按以下方式传递用户:

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


su -意味着将环境变量重置为root和su表示环境变量为旧用户。

例如:如果使用su -,则为根主目录;如果使用su,则为旧用户主目录。

root。它使用一个配置文件/etc/sudoers,该文件列出了哪些用户有权执行特定操作。sudo command,即切换用户并执行此命令。


susudo -i等效,并且模拟对root帐户的登录。您的工作目录为/root,它将读取root的.profile等。提示符将从$更改为#,表示您具有root访问权限。
sudo -s以root身份启动外壳程序,但不会更改工作方式。
目录。
sudo bash,其中bash是与sudo一起运行的命令。此命令以超级用户身份运行

使用bash可以记录某人所做的一切。
使用sudo可以防止用户知道root密码。
使用sudo我们可以限制允许运行的命令。


评论


普通su不会更改工作目录。

–AndréWerlang
20 Mar 3 '20 at 19:09