翻译总结自:su(1) - Linux manual page
1、作用
su,switch user,用指定的用户和组执行某个命令。
su指令允许我们用指定的用户和组来执行某个命令,当没有指定任何用户时,su默认用root身份以交互式shell脚本的方式来执行命令。而当指定了用户,还可以额外指定一些参数来传入shell脚本中。
为了保证后台兼容性,su在默认情况下不会改变当前目录,并且只会使用HOME和SHELL下的环境变量(当使用了某个具体用户时,环境变量还会加上USER和LOGNAME)。文档推荐使用--login选项(而非它的简写 - )来避免由于环境混淆所引发的一些异常情况。
2、用法(在[ ]之内的项代表可选项)
su [选项] [-] [用户]
3、选项
选项 |
全拼 |
说明 |
-c | --command=command | 以用户视角,要执行的命令(会导致环境变量,创建文件权限的变化) |
-f | --fast | |
-g | --group=group | 指定组,只对root用户有效 |
-G | --supp-group=group | 指定附加组,只对root用户有效 |
-或-l | --login |
以一个近乎真实登录的用户视角来执行shell: 1、清空除了TERM和--whitelist-environment之外的环境变量; 2、初始化环境变量HOME、SHELL、USER、LOGNAME、PATH 3、改变目标用户的home目录; 4、设置shell的0号参数argv[0]为-,来使这个shell成为一个登录shell 简而言之,使用-l可以保证shell脚本的执行主体从root变为另一个用户 |
-m或-p | --preserve-environment |
保护整个运行环境,例如不修改HOME、SHELL、USER、LOGNAME。 该项在参数--login生效时不起作用。 |
-P | --pty | |
-s | --shell=shell |
运行指定的shell而非默认shell,一般情况下默认shell为/bin/bash,可运行的shell通过cat /etc/shells查看,默认shell通过echo $SHELL查看。 将会被运行的shell通过以下规则加以确认,这些规则依次是: 1、通过--shell参数指定的shell; 2、如果使用了选项--preserve-environment,那么选择在环境变量SHELL中指定的shell 3、在目标用户的passwd条目中列出的shell; 4、/bin/sh 如果目标用户使用了一个受限的shell(例如没有在/etc/shells中列出来的shell),那么选项--shell和环境变量SHELL将被忽略,除非这个用户是root |
--session-command=command | 跟-c类似,但是不创建新session,过时 | |
-w | --whitelist-environment=list |
list中用逗号分隔一系列环境变量,这样在使用选项--login时,这些环境变量将不会被重置。 该选项对于环境变量HOME、SHELL、USER、LOGNAME、PATH会失效 |
-h | --help | 帮助 |
-V | --version | 版本 |
4、例子
1)写一个shell脚本,用root执行,以实现切换用户创建文件的目的
脚本执行完毕后,test目录的用户和组都是root(期望的是miduser)
原因,没加--login,导致环境变量什么的用的都是root的,修改为
用户和组发生变化