当前位置:   article > 正文

Linux:用户切换指令su

Linux:用户切换指令su

 相关文章

Linux专栏icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12234591.html


        su是一个常用的用户切换命令, 用于在不同的用户身份之间切换,下面是它的用法。

  1. 用法:
  2. su [-] [-lmpVh] [-s shell] [-c command] [-w list] [username]
  3. 选项:
  4. - 以login-shell的方式新建一个shell并切换到指定用户,当用户名未指定时,切换至root用户
  5. -l 与-类似,但此时必须指定用户名
  6. -m、-p 以环境保护即non-login shell的方式新建一个shell并切换到指定用户,当用户名未指定时,切换至root用户,如果指定了-或-l选项,则此选项被忽略
  7. -s shell 指定shell的路径
  8. -c command 将command传递给新建的shell执行
  9. -V 打印版本
  10. -h 打印帮助信息
  11. -w list 指定在以login-shell切换时的环境变量白名单,名单内的环境变量以逗号分隔,名单内的环境变量不会被复位(对HOME、SHELL、USER、LOGNAME、PATH无效)

         当没有指定username时,su命令默认将root当做username。su命令默认不切换工作目录到目标用户的家目录,只继承原进程的全部环境变量并改变环境变量$HOME和$SHELL(如果目标用户不是root,则再加上$USER和$LOGNAME),是一种non-login shell的登录方式,这会导致很多重要的环境变量并未改变,比如$PATH。

  1. zhangchen@zhangchen-virtual-machine:~$ su root
  2. Password: //需要输入密码
  3. root@zhangchen-virtual-machine:/home/zhangchen# id
  4. uid=0(root) gid=0(root) groups=0(root) //确实切换成功
  5. root@zhangchen-virtual-machine:/home/zhangchen# echo $HOME $SHELL $USER $LOGNAME
  6. /root /bin/bash zhangchen zhangchen //$HOME、$SHELL改变了,而$USER、$LOGNAME不改变
  7. root@zhangchen-virtual-machine:/home/zhangchen# su zhangchen //root切换到其他用户无需输入密码
  8. zhangchen@zhangchen-virtual-machine:~$ echo $HOME $SHELL $USER $LOGNAME
  9. /home/zhangchen /bin/bash zhangchen zhangchen //$HOME、$SHELL、$USER、$LOGNAME都改变

        -和-l选项以login-shell的方式新建一个shell并切换到指定用户,会进行以下操作:1、清除所有环境变量,除了$TERM以及-w白名单指定的环境变量。2、初始化环境变量$HOME、$SHELL、$USER、$LOGNAME和$PATH。3、切换当前工作目录至目标用户的家目录。4、设置shell的argv[0]为‘-’使这个shell是login-shell。

        需要注意的是,login-shell不仅仅会初始化这五个环境变量,而且会读取配置文件,从而模拟一次真实的用户登录,比如对于bash shell,会读取.bashrc中的配置。

        -m和-p选项用于以环境保护的non-login shell的形式切换用户,这比默认情况下的行为还要保守,它甚至不会切换$HOME、$SHELL、$USER和$LOGNAME。在指定了-或-l选项后,此选项会被忽略。

  1. root@zhangchen-virtual-machine:~# echo $HOME $SHELL $USER $LOGNAME
  2. /root /bin/bash root root
  3. root@zhangchen-virtual-machine:~# su -m zhangchen
  4. zhangchen@zhangchen-virtual-machine:~$ echo $HOME $SHELL $USER $LOGNAME
  5. /root /bin/bash root root

        -s shell选项用于创建指定的shell而不是使用默认shell,这里要说明的是,一个用户的默认登录shell可以在/etc/passwd中找到。有一种情况是,一个用户的默认登录shell被指定为nologin,这会导致用户无法以此shell登录,这时候可以使用指定的shell登录。

  1. root@zhangchen-virtual-machine:/home/zhang# chsh -s /usr/sbin/nologin zhang
  2. root@zhangchen-virtual-machine:/home/zhang# tail /etc/passwd
  3. ****
  4. zhang:x:1001:1001:,,,:/home/zhang:/usr/sbin/nologin
  5. root@zhangchen-virtual-machine:/home/zhang# su zhang
  6. This account is currently not available.
  7. root@zhangchen-virtual-machine:/home/zhang# su -s /bin/bash zhang
  8. zhang@zhangchen-virtual-machine:~$

        -c command选项用于将一个命令(可含选项)传递给新建的shell,并以目标用户的身份执行,执行完毕后退出目标用户的shell,返回原shell。注意-c选项只能有一个参数,所以如果需要传递有选项的命令,需要使用\转义空格或者将命令与选项使用引号包围。

  1. zhangchen@zhangchen-virtual-machine:~$ su -c "echo 111" zhang \\或者su -c echo\ 111 zhang
  2. Password:
  3. 111
  4. zhangchen@zhangchen-virtual-machine:~$

        -w list选项是配合-l选项使用的,list中的环境变量在使用login-shell的方式时,将不会被清除,但是需要注意的是,这对$HOME、$SHELL、$USER、$LOGNAME和$PATH无效。

  1. zhangchen@zhangchen-virtual-machine:~$ export VARIABLE=test
  2. zhangchen@zhangchen-virtual-machine:~$ echo $VARIABLE
  3. test
  4. zhangchen@zhangchen-virtual-machine:~$ su -l zhangchen
  5. Password:
  6. zhangchen@zhangchen-virtual-machine:~$ echo $VARIABLE
  7. zhangchen@zhangchen-virtual-machine:~$ exit
  8. logout
  9. zhangchen@zhangchen-virtual-machine:~$ echo $VARIABLE
  10. test
  11. zhangchen@zhangchen-virtual-machine:~$ su -l -w VARIABLE zhangchen
  12. Password:
  13. zhangchen@zhangchen-virtual-machine:~$ echo $VARIABLE
  14. test

        从上面的代码中我们还可以知道,使用exit能退出新建的bash并返回之前的bash。 

        


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/77628
推荐阅读
相关标签
  

闽ICP备14008679号