以下命令有什么区别:
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
。因为它使用 sudoer 的密码而不是 root 密码,所以
sudo
隔离了多个 sudoer 之间的权限。这解决了一个管理问题
su
,即当 root 密码更改时,su
必须告知所有必须知道该密码才能使用的人。sudo
允许 sudoers 的密码独立更改。事实上,对系统上的 root 用户帐户进行密码锁定以sudo
强制所有系统管理任务通过sudo
.在拥有许多受信任的 sudo 者的大型组织中,这意味着当其中一位系统管理员离开时,您不必更改 root 密码并将其分发给留下的管理员。
sudo bash
和之间的主要区别sudo -s
是:
-s
短于bash
您可以说在默认 shell 下
sudo -s some-command
运行,但具有超级用户权限。some-command
它基本上是 的简写sudo $SHELL -c some-command
。您可以将命令传递到 shell 的标准输入,例如
sudo -s < my-shell-script
.你可以将它与特雷多克向单个sudo
调用发送多个命令,从而避免sudo
重复键入。即使没有这些额外的命令参数,
sudo -s
仍然不同,sudo bash
因为它可能运行与 不同的 shellbash
,因为它首先在SHELL
环境变量中查找,然后如果未设置,则在用户的登录 shell 设置中查找,通常在/etc/passwd
.
运行的 shellsudo -s
继承您当前的用户环境。如果您真正想要的是一个干净的环境,就像登录后获得的那样,那么您想要的sudo -i
是sudo
.粗略地说,sudo -i
就是 to sudo -s
as su -
is to su
:它会重置除几个关键环境变量之外的所有变量,并将您带回用户的主目录。如果您没有通过标准输入或命令给它在该 shell 下运行的命令sudo -i some-command
,它将将该 shell 作为交互式登录 shell 运行,以便您的用户的 shell 启动脚本(例如.bash_profile
)再次运行。
所有这些sudo -i
都比sudo -s
.为什么?因为如果有人可以之前修改您的环境sudo -s
,他们可能会导致执行意外的命令。最明显的情况是修改SHELL
,但它也可能不太直接地发生,例如PAGER
如果您说man foo
while under则通过sudo -s
。
您可能会说,“如果他们可以修改PAGER
,他们就可以修改PATH
,然后他们就可以替换一个邪恶的sudo
程序”,但是足够偏执的人可以说/usr/bin/sudo /bin/bash
要避免这个陷阱。你可能并没有那么偏执,以至于你也避免了所有的陷阱其他但是,容易受到环境变量的影响。EDITOR
例如,您是否还记得在运行任何命令之前进行检查VCS命令?因此sudo -i
。
因为sudo -i
还将您的工作目录更改为用户的主目录,所以您可能仍然希望sudo -s
在您知道要保留在cd
运行时进入的同一目录中的情况下使用sudo
。不过,sudo -i
往返cd
原处仍然更安全。
您有时会看到的所有这一切的另一个变体是sudo su
,它大约相当于sudo -s
。同样,sudo su -
在功能上也非常接近sudo -i
。由于sudo
和su
是竞争命令,因此将它们像这样配对有点奇怪,因此我建议您改用标志sudo
。
答案2
来自一个ubuntu 论坛帖子我不久前做了:
考虑以下实验:
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
当您想要一个不受用户环境污染的 root shell 时,要运行正确的命令。
答案3
su
(s巫婆你序列或s替代品你ser) 允许您切换用户。su
基本上以目标用户的权限启动另一个 shell 实例。默认情况下,它会将您切换到root
用户,如果我们想切换特定用户,我们需要传递用户,如下所示:
$ su bob # switches to bob (requires bob's password)
su -
表示环境变量将重置为root,su
表示环境变量为旧用户。
例如:如果您使用 root 的主目录,su -
或者如果您使用 .old 用户的主目录su
。
须藤(s上层你塞尔做) 是一个命令行实用程序,允许用户以另一个用户的安全权限运行程序,默认情况下是超级用户,即root
。它使用一个配置文件/etc/sudoers
,其中列出了哪些用户有权执行特定操作
sudo 应该读作/ˈsuːduː/。语法sudo command
即s巫婆你塞尔和做这个命令。
su
相当于sudo -i
并模拟登录 root 帐户。您的工作目录将为/root
,它将读取 root 的目录.profile
等。提示符将从 $ 更改为 #,表明您具有 root 访问权限。sudo -s
以 root 身份启动 shell,但不会更改您的工作目录。sudo bash
bash
运行的命令在 哪里sudo
。该命令bash
以超级用户身份运行。- 使用
sudo
可以记录某人所做的一切。 - 使用
sudo
可以防止用户必须知道 root 密码。 - 使用
sudo
我们可以限制允许运行的命令。