1.命令作用
修改生效的用户id和组id为user(Change the effective user id and group id to that of USER.),即切换当前所处的用户;-参数暗带-l参数,如果USER未指定,默认是root(A mere - implies -l. If USER not given, assume root.)
2.命令语法
Usage: su [OPTIONS] [-] [USER [arg]...]
3.参数详解
OPTIONS:
- -m, -p, --preserve-environment,不重置环境变量
- -g, --group <group>,指定主用户组
- -G, --supp-group <group>,指定附加用户组,多个用户组间用逗号分隔
- -, -l, --login,使shell成为登录shell,即变量切换为切换后用户的shell变量
- -c, --command <command>,用-c向shell传递一个命令;创建新会话执行命令,执行后再退出到执行的用户
- --session-command <command>,用-c向shell传递一个命令;不创建新会话,直接在当期会话里面执行命令
- -f, --fast,快速切换用户身份时避免加载冗余配置(对csh或者tcsh有效,bash会忽略该参数)
- -s, --shell <shell>,指定切换用户时使用的shell 解释器,覆盖目标用户在/etc/passwd中配置的默认shell
- -h, --help,显示此帮助并退出
- -V, --version,输出版本信息并退出
4.常用用例
4.1.是否切换用户环境变量
[root@node1 ~]# su user1 # 切换用户,但不切换家目录和环境变量
[user1@node1 root]$ exit
exit
[root@node1 ~]# su - user1 # 切换用户、家目录及环境变量
Last login: Mon Jun 9 18:14:19 CST 2025 on pts/0
[user1@node1 ~]$ exit
logout
[root@node1 ~]# su -p user1 # 切换用户,但不切换家目录和环境变量
bash: /root/.bashrc: Permission denied
bash-4.2$ exit
exit
[root@node1 ~]# su -m user1 # 切换用户,但不切换家目录和环境变量
bash: /root/.bashrc: Permission denied
bash-4.2$ exit
exit
[root@node1 ~]# su -lm user1 # 切换用户、家目录及环境变量
su: ignore --preserve-environment, it's mutually exclusive to --login. # 提示忽略--preserve-environment,他与--login互斥
Last login: Mon Jun 9 18:14:41 CST 2025 on pts/0 # 登录信息
[user1@node1 ~]$
4.2.指定用户组切换用户
[root@node1 ~]# groupadd userg # 添加用户组
[root@node1 ~]# useradd -g userg user1 # 指定用户组添加用户
[root@node1 ~]# getent passwd user1 # 查看用户,用户组ID为1006,用户ID为1001
user1:x:1001:1006::/home/user1:/bin/bash
[root@node1 ~]# su -g userg user1 # 指定用户组切换用户
[user1@node1 root]$ pwd
/root
[user1@node1 root]$ exit
exit
[root@node1 ~]# su -lg userg user1 # 指定用户组切换用户和环境变量
Last login: Mon Jun 9 18:28:40 CST 2025 on pts/0
[user1@node1 ~]$ pwd
/home/user1
[user1@node1 ~]$ exit
logout
[root@node1 ~]#
4.3.指定用户执行命令
[root@node1 ~]# su user1 -c 'whoami' # 实际不切换用户
user1
[root@node1 ~]# su - user1 -c 'whoami' # 创建新会话执行命令,然后退到执行的用户
user1
[root@node1 ~]# su - user1 --session-command 'whoami' # 不创建新会话,在当前会话执行命令
user1
[root@node1 ~]#