linux-su_sudo-各用户环境空间

Linux中su,su -,sudo各用户环境空间

我们在需要root权限时,常用su,su -,sudo三种命令,它们的全称是:

  • sudo = Super user do 超级用户do
  • su = Shift user 切换用户

其中,su命令会直接切换到root,而sudo只是临时使用root身份。同时su命令要求输入的密码是root用户的密码,sudo需要输入当前用户的密码(注意,当你是root用户是,切换到本机的其他任何用户都是不需要输入密码的)。除却表面上的区别,他们深层的环境变量也是不一样的,本文将详细说明。

su与su -

联系:都是切换到root

区别:前者只是切换了root身份,但Shell环境仍然是普通用户的Shell;而后者连用户和Shell环境一起切换成root身份了。只有切换了Shell环境才不会出现PATH环境变量错误。su切换成root用户以后,pwd一下,发现工作目录仍然是普通用户的工作目录;而用su -命令切换以后,工作目录变成root的工作目录了。用echo $PATH命令看一下susu -以后的环境变量有何不同。以此类推,要从当前用户切换到其它用户也一样,应该使用su -命令。

使用su -命令,环境变量发生了变化。补充,如果需要切换到其他用户且环境也跟着切换,则用su - username

 1$ su -
 2# env
 3SHELL=/bin/bash
 4HISTSIZE=3000
 5LANGUAGE=en_US.utf8
 6HISTTIMEFORMAT=%F %T
 7PWD=/root # 这里切换到了/root
 8LOGNAME=root
 9HOME=/root
10LANG=en_US.utf8
11PROMPT_COMMAND=history -a;
12TERM=xterm
13USER=root
14SHLVL=1
15PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # 这里的PATH变成了root的PATH
16MAIL=/var/mail/root
17_=/usr/bin/env
18

使用su命令,环境变量不变。

 1$ su
 2# env
 3SHELL=/bin/bash
 4NVM_INC=/home/lelouch/.nvm/versions/node/v16.13.0/include/node
 5CONDA_EXE=/home/lelouch/anaconda3/bin/conda
 6_CE_M=
 7HISTSIZE=3000
 8LANGUAGE=en_US.utf8
 9HISTTIMEFORMAT=%F %T
10PWD=/home/lelouch # 这里没有变
11LOGNAME=lelouch
12XDG_SESSION_TYPE=tty
13HOME=/root
14LANG=en_US.utf8
15LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
16PROMPT_COMMAND=history -a; history -a;
17SSH_CONNECTION=223.72.75.152 29724 172.17.0.7 5122
18NVM_DIR=/home/lelouch/.nvm
19XDG_SESSION_CLASS=user
20TERM=xterm
21_CE_CONDA=
22USER=lelouch
23CONDA_SHLVL=0
24DISPLAY=localhost:10.0
25SHLVL=2 # SHLVL 是记录多个Bash进程实例嵌套深度的累加器,su实在原有shell下开子shell,而su - 是完全重开
26NVM_CD_FLAGS=
27XDG_SESSION_ID=101
28CONDA_PYTHON_EXE=/home/lelouch/anaconda3/bin/python
29XDG_RUNTIME_DIR=/run/user/1000
30SSH_CLIENT=223.72.75.152 29724 5122
31PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games # 这里的PATH不变,保持lelouch用户的PATH变量
32DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
33MAIL=/var/mail/root
34NVM_BIN=/home/lelouch/.nvm/versions/node/v16.13.0/bin
35SSH_TTY=/dev/pts/0
36_=/usr/bin/env

sudo的环境变量问题

sudo执行命令的流程是当前用户切换到root(或其它指定切换到的用户),然后以root(或其它指定的切换到的用户)身份执行命令,执行完成后,直接退回到当前用户。

由上述流程可发现sudo命令的初衷是让用户临时有root权限,因此只会对环境变量做最小修改。其他皆继承原有用户的环境变量。最典型的就是$PATH变量。如果不在配置文件中做修改,sudo命令下的环境$PATH变量和原来是一样的。可是,有很多命令是在/sbin这类文件夹里的,这些是要通过sudo的配置文件/etc/sudoers来进行授权的,因此为了能让用户使用root的命令,一般会在/etc/sudoers文件中对,环境变量进行适当修改,增加普通用户的权限,比如对$PATH变量的修改就是:

1# sudoers文件中的Defaults选项来修改sudo的默认参数、环境、行为
2Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

总结:sudo的环境是对原用户环境的最小修改,如果需要修改默认环境、动作,则需/etc/sudoers文件进行修改配置。

为什么有sudo su

因为使用su命令或直接以root用户身份登录有风险,所以,一些 Linux发行版(如 Ubuntu)默认禁用 root 用户帐户。鼓励用户在需要root权限时使用sudo命令。

然而,您还是可以成功执行su命令,而不用输入root用户的密码。那就是使用sudo su

由于你使用sudo运行命令,你只需要输入当前用户的密码。所以,一旦完成操作,su命令将会以root用户身份运行,这意味着它不会再要求输入任何密码。

有些命令明明安装了但是却"command not found"

这就是各用户$PATH环境变量不同的问题。典型的就是root用户和非root用户的$PATH环境变量:

1# 非root用户
2$ echo $PATH
3/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
4# root用户
5# echo $PATH
6/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

各个/sbin文件的“s”就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。

我们只要把命令的路径添加到$PATH中即可直接运行命令。