Linux:su指令

发布时间 2023-08-08 11:37:42作者: ShineLe

翻译总结自: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的,修改为

用户和组发生变化