“ su”,“ sudo -s”,“ sudo -i”和“ sudo su”之间有什么区别?


148

我已经从手册中阅读了,但看不到区别。

su -更改用户ID或成为超级用户

sudo -s [command]

-s(壳)的选择,因为在passwd中所指定运行,或者如果它被设置由SHELL环境变量指定的壳的壳(5)。如果指定了命令,则将其传递到外壳程序以执行。否则,将执行交互式外壳程序。

sudo -i 消失手册中的描述


7
另外,请勿使用su user从不受信任的Shell登录su - user。见unix.stackexchange.com/q/7013/8250
Lekensteyn

@Lekensteyn哇,很好的例子。THX的LOL :)
törzsmókus

1
永远记住旧的诫命:不要白白索取根的名字!
törzsmókus

不好说sudo -i,但您肯定可以使用它
做些

Answers:


118

这些命令之间的主要区别在于它们限制对功能的访问。

su (这意味着“替代用户”或“切换用户”) -正是这样做的,它使用目标用户的特权启动了另一个shell实例。为了确保您有权执行此操作,它会要求您输入目标用户的密码。因此,要成为root用户,您需要知道root密码。如果您的计算机上有多个用户需要以root用户身份运行命令,那么他们都需要知道root密码-请注意,该密码将是相同的密码。如果您需要撤消其中一位用户的管理员权限,则需要更改root密码,然后仅将其告知需要保持访问权限的人员-混乱。

sudo (嗯……助记符是什么?超级用户DO?)是完全不同的。它使用一个配置文件(/ etc / sudoers),该文件列出了哪些用户有权执行特定操作(以root用户身份运行命令等)。调用该文件时,它会询问启动它的用户的密码 -以确保该用户在终端的确与列出的终端相同/etc/sudoers。要撤消某人的管理员特权,您只需要编辑配置文件(或从该配置中列出的组中删除该用户)。这样可以更清晰地管理特权。

因此,在许多基于Debian的系统中,root用户没有设置密码-即无法直接以root用户身份登录。

此外,/etc/sudoers允许指定一些其他选项-即用户X仅能够运行程序Y等。

常用的sudo su组合如下:首先sudo询问您密码,然后,如果允许您输入密码,则以su超级用户身份调用下一个命令()。因为su是由调用的root,所以不需要您输入目标用户的密码。因此,sudo su如果/etc/sudoers文件允许超级用户访问,则允许您以其他用户(包括root)的身份打开外壳。


2
我从未见过su“切换用户”,但总是超级用户。没有其他用户名的默认行为(尽管这是有道理的)。来自维基百科:“ su命令,早在1974年也被称为超级用户[1],也被称为”替代用户”,”欺骗用户”或”设置用户”,因为它允许更改与当前帐户关联的帐户。终端(窗口)。”
jimbob博士2011年

5
@dr jimbob:您是对的,但我发现“切换用户”有点能更好地描述其功能-尽管从历史上讲,它代表“超级用户”。我也很高兴发现维基百科的文章与我的回答非常相似-我之前从未看过这篇文章:)
Sergey

11
“ su”的正式含义是“替代用户”。请参阅:“ man su”。
Angel O'Sphere 2013年

1
@ AngelO'Sphere:有趣的是,Ubuntu的联机帮助页根本没有提到“替代”。gnu.org上的手册页(gnu.org/software/coreutils/manual/html_node/su-invocation.html)确实的确是说“ su:使用替代用户和组ID运行命令”。我认为gnu.org是规范来源:)
谢尔盖(Sergey)

1
sudo su
卡兹·沃尔夫

59

sudo使您可以以root用户特权在自己的用户帐户中运行命令。su让您切换用户,以便您实际上以root用户身份登录。

sudo -s使用root特权运行shell。sudo -i还获取root用户的环境。

要看到的区别susudo -s,做cd ~pwd后他们每个人。在第一种情况下,您将位于root的主目录中,因为您是root。在第二种情况下,您将位于自己的主目录中,因为您自己具有root特权。

有这个确切的问题进行更多的讨论在这里


20
“您自己具有root特权”实际上并不是在发生:)实际上,不可能是“您自己具有root特权”-您是root还是您自己。在两种情况下都尝试输入whoamicd ~结果不同的事实是sudo -s未设置$ HOME环境变量的结果。
谢尔盖

1
@Sergey,它说的是“ root”用户,因为您正在运行“ whoami” cmd,就好像您对它进行了sudo一样,因此暂时(在该命令期间)您似乎是root用户,但您可能仍然没有完整权限根据sudoers文件进行root访问。
章鱼

1
@Octopus:我想说的是在Unix中,一个进程只能有一个UID,而该UID决定了该进程的权限。您不能“自己具有root特权”,程序要么以您的UID运行,要么以root的UID(0)运行。
谢尔盖(Sergey)2015年

5
关于“根据sudoers文件,您可能仍然没有完全的root用户访问权限”:该sudoers文件控制谁可以另一个用户身份运行哪个命令,但这是在命令执行之前发生的。但是,一旦允许您以root用户身份启动进程-运行的进程具有root用户的UID并具有对系统的完全访问权限,则sudo无法限制它。同样,您总是自己或生根,没有“一半一半”。因此,如果sudoers文件允许您以root用户身份运行shell,则该shell中的权限将与“普通” root shell没有区别。
谢尔盖(Sergey)2015年

36

这个答案是我对这个问题的重复的重复,放在规范的答案上,以便人们可以找到它!

sudo -i和之间的主要区别sudo -s是:

  • sudo -i给您根环境,即您~/.bashrc被忽略。
  • sudo -s为您提供用户的环境,因此您~/.bashrc受到尊重。

这是一个示例,您可以看到lsl我的~/.bin/目录中有一个应用程序,可以通过进行访问,sudo -s但不能通过进行访问sudo -i。另请注意,Bash提示会随改变,sudo -i但不会改变sudo -s

dotancohen@melancholy:~$ ls .bin
lsl

dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl

dotancohen@melancholy:~$ sudo -i

root@melancholy:~# which lsl

root@melancholy:~# exit
logout

dotancohen@melancholy:~$ sudo -s
Sourced .bashrc

dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl

dotancohen@melancholy:~$ exit
exit

尽管sudo -s可以方便地为您提供熟悉的环境,但是出于两个原因,我还是建议您使用sudo -i

  1. 视觉提醒您正在“ root”会话中。
  2. 根环境极不可能被恶意软件所毒害,例如中的恶意行.bashrc

我注意到sudo -s似乎不处理/ etc / profile,或者我在/etc/profile.d/中的任何内容。
meffect '17

@dotancohen- sudo -s提供用户熟悉的环境是什么意思?
启发

@dotancohen-命令sudo -s已经提供了视觉提示,因此我对为什么sudo -i是更好的选择感到好奇。
启发

9

su 询问用户“ root”的密码。

sudo询问您自己的密码(并且还检查是否允许您以root用户身份运行命令,该命令是通过/etc/sudoers-默认情况下配置的,属于“ admin”或“ sudo”组的所有用户帐户都可以使用sudo)。

sudo -s以root身份启动外壳程序,但不更改您的工作目录。 sudo -i模拟登录到root帐户:您的工作目录将是/root,并且root的名称.profile等将作为登录时的来源。


1
使答案更完整:sudo -s几乎等于su($ HOME是不同的)并且sudo -i等于su -
DJCrashdummy17 2007年

@DJCrashdummy-为什么说几乎等于?有什么不同吗?
启发

2

在Ubuntu或相关系统中,su在传统的超级用户意义上,我找不到太多用处。sudo处理这种情况要好得多。但是,su这对于在一次性配置sudoer会很愚蠢的情况下成为另一个用户非常有用。

例如,如果要通过实时CD / USB修复系统,则经常将硬盘驱动器和其他必要的东西安装chroot到系统中。在这种情况下,我的第一个命令通常是:

su - myuser  # Note the '-'. It means to act as if that user had just logged in.

这样,我不是以root用户身份,而是以我的普通用户身份进行操作,然后sudo在适当时使用它。


0
  • su 询问root密码,成为root,打开一个交互式非登录Shell。
  • su - 询问root密码,成为root,打开一个交互式登录shell。

  • sudo -s 询问您的密码,成为root用户,打开一个交互式非登录外壳。
  • sudo -i 询问您的密码,成为root用户,打开一个交互式登录Shell。

最佳实践是使用这两个。


  • sudo su询问您的密码,成为root用户一秒钟,然后以root用户身份运行su
  • sudo su -询问您的密码,成为root用户一秒钟,然后su -以root用户身份运行。

因此,在这种情况下,您正在su使用,sudo而不必知道root的实际密码。结果与su和相同su -


login和non login shell有什么区别?
Pilot6

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.