以下命令之间有什么区别:
su
sudo -s
sudo -i
sudo bash
我知道,因为su
我需要知道root密码,并且sudo
必须在sudoers
文件中,但是一旦执行,有什么区别?
我知道su
和之间有区别,sudo -s
因为我的主目录/root
在执行之后su
,但是我的主目录仍然/home/myname
在执行之后sudo -s
。但是我怀疑这只是我所缺少的根本差异的征兆。
以下命令之间有什么区别:
su
sudo -s
sudo -i
sudo bash
我知道,因为su
我需要知道root密码,并且sudo
必须在sudoers
文件中,但是一旦执行,有什么区别?
我知道su
和之间有区别,sudo -s
因为我的主目录/root
在执行之后su
,但是我的主目录仍然/home/myname
在执行之后sudo -s
。但是我怀疑这只是我所缺少的根本差异的征兆。
Answers:
使用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 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
。
运行的shell将sudo -s
继承您当前的用户环境。如果您真正想要的是一个干净的环境(如刚登录后得到的),那么您想要的是sudo -i
相对较新的功能sudo
。粗略地说,sudo -i
是sudo -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
回到原来的地方,虽然。
vi
,键入:sh
并按Enter。现在,您处于子外壳程序中,具有vi
生成该外壳程序的所有特权。如果vi
运行时具有root特权,那么外壳程序也将运行。或者,您可以通过运行Shell以外的其他东西:!cmd
,通过:r !cmd
等将命令的输出读取到编辑缓冲区中。如果所有这些都被锁定,则Makefile
目标是shell脚本,而Vim具有该:make
命令,可以有效地运行任意shell编辑器中的脚本。恶作剧的可能性实在太大,以至于此注释框无法容纳。
/usr/bin/sudo
PATH
不是唯一的问题。
请考虑以下实验:
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部分。
sudo -Hs
当我想要不受设置影响的环境时,我会选择使用,因为我使用zsh和可能要更改为使用bash的所有应用程序帐户。这确实使一定数量的环境变量不受干扰地传递,但是我通常会发现重要的变量被/etc/profile.d/*覆盖。
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
我们可以限制允许运行的命令。
sudo su -
这种方式,您不需要root密码,并且-
可以确保主目录设置正确。