linux-su_sudo-各用户环境空间 Nov 19, 2021 · linux · 分享到: Linux中su,su -,sudo各用户环境空间 su与su - sudo的环境变量问题 为什么有sudo su 有些命令明明安装了但是却"command not found" 我们在需要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命令看一下su和su -以后的环境变量有何不同。以此类推,要从当前用户切换到其它用户也一样,应该使用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中即可直接运行命令。