su
sudo -s
sudo -i
sudo bash
我知道
su
我需要知道root密码,而sudo
我必须在sudoers
文件中,但是一旦执行,有什么区别?我知道
su
和sudo -s
之间存在差异,因为执行/root
之后我的主目录是su
,但是我的主目录仍然是/home/myname
之后的sudo -s
。但是我怀疑这只是我所缺少的根本差异的征兆。 #1 楼
使用su
,您将成为另一个用户-默认情况下是root,但可能是另一个用户。如果您说su -
,那么您的环境也将被该用户的登录环境所替换,因此您所看到的内容与以该用户身份进行的登录是无法区分的。当用户在su
登录到另一个用户时,系统无法告诉他们该怎么做。sudo
的情况大不相同:通过
sudo
运行的命令以目标用户身份执行-默认情况下是root,但可以通过-u
更改-但它会记录通过它运行的命令,并用您的用户名标记它们,以便以后可以分配责任。 :) sudo
非常灵活。例如,您可以限制允许给定用户或用户组运行的命令。对于su
,它是全部或全部。此功能通常用于定义角色。例如,您可以定义一个允许运行
dump
和tar
的“备份”组,每个组都需要root用户访问权限才能正确备份系统磁盘。我在这里提到这一点是因为您可以给不授予
sudo
或sudo -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 bash
和sudo -s
之间的主要区别是-s
较短,可以让您通过以下两种方式传递命令以在用户的默认Shell中执行:您可以说在您的操作系统下运行
sudo -s some-command
的some-command
贝壳。它基本上是sudo $SHELL -c some-command
的简写。您可以改为将命令传递到Shell的标准输入,例如
sudo -s < my-shell-script
。您可以将其与heredoc一起使用,以将多个命令发送到单个sudo
调用,而无需重复键入sudo
。这两种行为都是可选的。更常见的是,您单独提供
-s
,因此它只是交互式运行用户的外壳程序。在这种模式下,它与sudo bash
的不同之处在于,它可能运行与bash
不同的外壳程序,因为它首先在SHELL
环境变量中查找,然后在用户的登录外壳程序设置(通常在/etc/passwd
中)中将其设置为未设置。 > sudo -s
运行的外壳程序继承了您当前的用户环境。如果您真正想要的是一个干净的环境(例如刚登录后得到的),则您想要的是sudo -i
,它是sudo
的相对较新的功能。粗略地讲,sudo -i
是sudo -s
,su -
是su
:它重置除几个关键环境变量外的所有关键环境变量,然后将您发送回用户的主目录。如果您也没有通过标准输入或sudo -i some-command
为其提供在该Shell下运行的命令,它将作为交互式登录Shell运行该Shell,因此您的用户的Shell启动脚本(例如.bash_profile
)将再次运行。所有这些使
sudo -i
比sudo -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 -i
和cd
返回到您所在的位置仍然更安全。评论
“ 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
,该文件列出了哪些用户有权执行特定操作。su
与sudo -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
评论
我更喜欢使用sudo su-这样,您不需要root密码,并且-确保主目录设置正确。另请参阅哪种最安全的方式来获得root特权:sudo,su或login?