使用者身份切换

  • 让一般使用者转变身份成为 root 呢?主要有两种方式: 以『 su - 』直接将身份变成 root 即可,但是这个命令却需要 root 的口令,也就是说,如果你要以 su 变成 root 的话,你的一般使用者就必须要有 root 的口令才行;

  • 以『 sudo 命令 』运行 root 的命令串,由于 sudo 需要事先配置妥当,且 sudo 需要输入用户自己的口令, 因此多人共管同一部主机时, sudo 要比 su 来的好喔!至少 root 口令不会流出去!

su

[root@www ~]# su [-lm] [-c 命令] [username]
选项与参数:
-   :单纯使用 - 如『 su - 』代表使用 login-shell 的变量文件读取方式来登陆系统;
      若使用者名称没有加上去,则代表切换为 root 的身份。
-l  :与 - 类似,但后面需要加欲切换的使用者账号!也是 login-shell 的方式。
-m  :-m 与 -p 是一样的,表示『使用目前的环境配置,而不读取新使用者的配置文件』
-c  :仅进行一次命令,所以 -c 后面可以加上命令喔!
范例一:假设你原本是 vbird1 的身份,想要使用 non-login shell 的方式变成 root
[vbird1@www ~]$ su       <==注意提示字符,是 vbird1 的身份喔!
Password:                <==这里输入 root 的口令喔!
[root@www vbird1]# id    <==提示字符的目录是 vbird1 喔!
uid=0(root) gid=0(root) groups=0(root),1(bin),...   <==确实是 root 的身份!
[root@www vbird1]# env | grep 'vbird1'
USER=vbird1
PATH=/usr/local/bin:/bin:/usr/bin:/home/vbird1/bin  <==这个影响最大!
MAIL=/var/spool/mail/vbird1                         <==收到的 mailbox 是 vbird1
PWD=/home/vbird1                                    <==并非 root 的家目录
LOGNAME=vbird1
# 虽然你的 UID 已经是具有 root 的身份,但是看到上面的输出信息吗?
# 还是有一堆变量为原本 vbird1 的身份,所以很多数据还是无法直接利用。
[root@www vbird1]# exit   <==这样可以离开 su 的环境!
范例二:使用 login shell 的方式切换为 root 的身份并观察变量
[vbird1@www ~]$ su -
Password:   <==这里输入 root 的口令喔!
[root@www ~]# env | grep root
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/root
LOGNAME=root
# 了解差异了吧?下次变换成为 root 时,记得最好使用 su - 喔!
[root@www ~]# exit   <==这样可以离开 su 的环境!
范例三:vbird1 想要运行『 head -n 3 /etc/shadow 』一次,且已知 root 口令
[vbird1@www ~]$ head -n 3 /etc/shadow 
head: cannot open `/etc/shadow' for reading: Permission denied
[vbird1@www ~]$ su - -c "head -n 3 /etc/shadow"
Password: <==这里输入 root 的口令喔!
root:$1$/30QpEWEBEZXRD0bh6rAABCEQD.BAH0:14126:0:99999:7:::
bin:*:14126:0:99999:7:::
daemon:*:14126:0:99999:7:::
[vbird1@www ~]$ <==注意看,身份还是 vbird1 喔!继续使用旧的身份进行系统操作!

总结su的用法:

  • 若要完整的切换到新使用者的环境,必须要使用『 su - username 』或『 su -l username 』, 才会连同 PATH/USER/MAIL 等变量都转成新用户的环境;

  • 如果仅想要运行一次 root 的命令,可以利用『 su - -c "命令串" 』的方式来处理;

  • 使用 root 切换成为任何使用者时,并不需要输入新用户的口令;

sudo

[root@www ~]# sudo [-b] [-u 新使用者账号] 
选项与参数:
-b  :将后续的命令放到背景中让系统自行运行,而不与目前的 shell 产生影响
-u  :后面可以接欲切换的使用者,若无此项则代表切换身份为 root 。

范例一:你想要以 sshd 的身份在 /tmp 底下创建一个名为 mysshd 的文件
[root@www ~]# sudo -u sshd touch /tmp/mysshd
[root@www ~]# ll /tmp/mysshd
-rw-r--r-- 1 sshd sshd 0 Feb 28 17:42 /tmp/mysshd
# 特别留意,这个文件的权限是由 sshd 所创建的情况喔!

范例二:你想要以 vbird1 的身份创建 ~vbird1/www 并于其中创建 index.html 文件
[root@www ~]# sudo -u vbird1 sh -c "mkdir ~vbird1/www; cd ~vbird1/www; \
>  echo 'This is index.html file' > index.html"
[root@www ~]# ll -a ~vbird1/www
drwxr-xr-x 2 vbird1 vbird1 4096 Feb 28 17:51 .
drwx------ 5 vbird1 vbird1 4096 Feb 28 17:51 ..
-rw-r--r-- 1 vbird1 vbird1   24 Feb 28 17:51 index.html
# 要注意,创建者的身份是 vbird1 ,且我们使用 sh -c "一串命令" 来运行的!

sudo 默认仅有 root 能使用,因为 sudo 的运行是这样的流程:

  1. 当用户运行 sudo 时,系统于 /etc/sudoers 文件中搜寻该使用者是否有运行 sudo 的权限;
  2. 若使用者具有可运行 sudo 的权限后,便让使用者『输入用户自己的口令』来确认;
  3. 若口令输入成功,便开始进行 sudo 后续接的命令(但 root 运行 sudo 时,不需要输入口令);
  4. 若欲切换的身份与运行者身份相同,那也不需要输入口令。

sudo 运行的重点是:『能否使用 sudo 必须要看 /etc/sudoers 的配置值, 而可使用 sudo 者是透过输入用户自己的口令来运行后续的命令串』!

visudo 与 /etc/sudoers

visudo 的配置方式有以下几种简单的方法:

  1. 单一用户可进行 root 所有命令,与 sudoers 文件语法:
    //假如我们要让 vbird1 这个账号可以使用 root 的任何命令,那么可以简单的这样进行修改即可: 
    [root@www ~]# visudo
    ....(前面省略)....
    root    ALL=(ALL)       ALL  <==找到这一行,大约在 76 行左右
    vbird1  ALL=(ALL)       ALL  <==这一行是你要新增的!
    ....(前面省略)....
    
  2. 利用群组以及免口令的功能处理 visudo

     //任何加入 wheel 这个群组的使用者,就能够使用 sudo 切换任何身份来操作任何命令 
     [root@www ~]# visudo  <==同样的,请使用 root 先配置
     ....(前面省略)....
     %wheel     ALL=(ALL)    ALL <==大约在 84 行左右,请将这行的 # 拿掉!
     # 在最左边加上 % ,代表后面接的是一个『群组』之意!改完请储存后离开
    
     [root@www ~]# usermod -a -G wheel pro1 <==将 pro1 加入 wheel 的支持
    
  3. 有限制的命令操作:
    //如果我想要让用户仅能够进行部分系统任务, 比方说,系统上面的 myuser1 仅能够帮 root 修改其他用户的口令时,亦即『当使用者仅能使用 passwd 这个命令帮忙 root 修改其他用户的口令』时 
    [root@www ~]# visudo  <==注意是 root 身份
    myuser1    ALL=(root)  !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, \
                     !/usr/bin/passwd root
    
  4. 透过别名建置 visudo:
    //假设我的 pro1, pro2, pro3 与 myuser1, myuser2 要加入上述的口令管理员的 sudo 列表中, 那我可以创立一个帐户别名称为 ADMPW 的名称,然后将这个名称处理一下即可
    [root@www ~]# visudo  <==注意是 root 身份
    User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2
    Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, \
                       !/usr/bin/passwd root
    ADMPW   ALL=(root)  ADMPWCOM
    
  5. sudo 的时间间隔问题:
    两次运行 sudo 的间隔在五分钟内,那么再次运行 sudo 时就不需要再次输入口令了, 这是因为系统相信你在五分钟内不会离开你的作业,所以运行 sudo 的是同一个人
  6. sudo 搭配 su 的使用方式:
    //创建一个 ADMINS 帐户别名,然后这样做:
    [root@www ~]# visudo
    User_Alias  ADMINS = pro1, pro2, pro3, myuser1
    ADMINS ALL=(root)  /bin/su -
    //接下来,上述的 pro1, pro2, pro3, myuser1 这四个人,只要输入『 sudo su - 』并且输入『自己的口令』后, 立刻变成 root 的身份!不但 root 口令不会外流,用户的管理也变的非常方便