Linux User、Group切换

Linux用户切换涉及到两个指令:su 和 sudo

su

su有两种切换的方式:

  • su - username, 以login-shell的方式切换到新的用户,更改了环境变量

  • su username, 以no-login-shell的方式切换到新的用户,环境变量不变
  • 如果想要离开当期的shell,回到切换前的shell,只需要执行exit命令就好。如果只是需要拥有新的用户的权限来执行某条命令,然后就自动回到当前的shell的话,那么可以使用-c参数如
    su - -c "command",就会在执行完命令后回到当前的用户shell。

    root执行此命令时,不需要输入任何的密码!!!

    由于su在切换新用户的时候,需要知道新用户的密码才可以执行,这样的话比较麻烦,所以出现了sudo。

    sudo

    sudo可以获取新用户的权限来执行后面的命令(以no-login-shell方式实现),在执行后回到当前的用户状态,需要输入的只是当前用户的密码,不需要新用户的密码!


    sudo默认只是root可以执行,如果需要加入新的用户,那么需要知道/etc/sudoers文件。该文件存放的是那些用户可以执行sudo,以及可以利用sudo来执行的具体指令。编辑该文件可以直接vim,也可以使用visudo命令,由于该文件是具有语法的,所以还是建议使用visudo来修改,因为该命令在执行的时候会检查文件的新增内容的语法是否正确。


    上面这一行的四个组件意义是:

    1. 系统的哪个账号可以使用 sudo 这个指令的意思,默认为 root 这个账号;
    2. 当这个账号由哪部主机联机到本 Linux 主机,意思是这个账号可能是由哪一部网络主机联机过来的, 这个设定值可以指定客户端计算机(信任用户的意思)。默认值 root 可来自任何一部网络主机
    3. 这个账号可以切换成什么身份来下达后续的指令,默认 root 可以切换成任何人;
    4. 可用该身份下达什么指令?这个指令请务必使用绝对路径撰写。 预设 root 可以切换任何身份与进行任何指令之意。

    利用群组以及免密码功能处理visudo

    上面的设定值会造成『任何加入 wheel 这个群组的使用者,就能够使用 sudo 切换任何身份来操作任何指令』的意思。 你当然可以将 wheel 换成你自己想要的群组名。接下来,请分别切换身份成为 pro1 及 pro2 试看看 sudo 的运作。

    如果你想要让 pro3 也支持这个 sudo 的话,不需要重新使用 visudo ,只要利用 usermod 去修改 pro3 的群组支持,让 wheel 也支持 pro3 的话,那他就能够进行 sudo 啰! 简单吧!不过,既然我们都信任这些 sudo 的用户了,能否提供『不需要密码即可使用 sudo 』呢? 就透过如下的方式:

    有限制的指令操作

    上面两点都会让使用者能够利用 root 的身份进行任何事情!这样总是不太好~如果我想要让用户仅能够进行部分系统任务, 比方说,系统上面的 myuser1 仅能够帮 root 修改其他用户的密码时,亦即『让使用者仅能使用 passwd 这个指令帮忙 root 修改其他用户的密码』时,你该如何撰写呢?可以这样做:

    1
    [root@www ~]# visudo <==注意是 root 身份 myuser1 ALL=(root) /usr/bin/passwd <==最后指令务必用绝对路径

    但是上面有一个很不好的就是,当用户使用如下指令时,会直接的修改root密码:

    1
    2
    [myuser1@www ~]$ sudo passwd
    Changing password for user root. <==见鬼!怎么会去改 root 的密码?

    所以我们要限制用户的指令参数,修改的方法为将上述的那一行修改为

    1
    2
    [root@www ~]# visudo <==注意是 root 身份
    myuser1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

    透过别名设置visuo

    假设我的 pro1, pro2, pro3 和 myuser1, myuser2 要加入上述的密码管理员的 sudo 列表中, 那我可以创立一个帐户删名称为 ADMPW 的名称,然后将这个名称处理一下即可。处理的方式如下:

    1
    2
    3
    4
    [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

    我透过 User_Alias 建立出一个新账号,这个账号名称一定要使用大写字符来处理,包括 Cmnd_Alias(命令别名)、Host_Alias(来源主机名别名) 都需要使用大写字符的!

    sudo的时间间隔

    sudo的默认时间间隔为5分钟,在这5分钟里面,多次执行sudo可以不需要输入当前用户的密码。

    另外需要注意的是,因为使用一般用户是不会用到/sbin, /usr/sbin等目录内的指令,所以$PATH变量不会含有这些目录,因此很多管理指令需要使用绝对路径来下达比较妥当!

    sudo搭配su的使用方式

    利用sudo和su可以在不需要root密码的情况下直接把身份变为root。只需要输入sudo su -,此时只需要输入自己的密码,就可以成功的切换到root身份了。

    Linux中群组的切换

    groups 有效与支持群组的观察

    如果想要查看当前用户所能支持的群组,那么可以使用该命令:

    1
    2
    [dmtsai@www ~]$ groups
    dmtsai users

    在这个输出的信息中,可知道 dmtsai 这个用户同时属于 dmtsai 及 users 这个两个群组,而且, 第一个输出的群组即为有效群组 (effective group) 了。 也就是说,我的有效群组为 dmtsai 啦~此时,如果我以 touch 去建立一个新档,例如: 『 touch test 』,那么这个档案的拥有者为 dmtsai ,而且群组也是 dmtsai 的啦。

    1
    2
    [dmtsai@www ~]$ touch test
    [dmtsai@www ~]$ ll -rw-rw-r-- 1 dmtsai dmtsai 0 Feb 24 17:26 test

    这样是否可以了解什么是有效群组了?通常有效群组的作用是在新建档案啦!那么有效群组是否能够变换?当然可以,这个时候需要用到newgrp命令。

    newgrp: 有效群组的切换

    使用 newgrp 是有限制的,那就是你想要切换的群组必须是你已经有支持的群组。举例来说, dmtsai 可以在 dmtsai/users 这两个群组间切换有效群组,但是 dmtsai 无法切换有效群组成为 sshd 啦!使用的方式如下:

    1
    2
    3
    4
    5
    6
    [dmtsai@www ~]$ newgrp users
    [dmtsai@www ~]$ groups users dmtsai
    [dmtsai@www ~]$ touch test2
    [dmtsai@www ~]$ ll
    -rw-rw-r-- 1 dmtsai dmtsai 0 Feb 24 17:26 test
    -rw-r--r-- 1 dmtsai users 0 Feb 24 17:33 test2

    newgrp这个指令可以变更目前用户的有效群组, 而且是另外以一个 shell 来提供这个功能的,所以,以上面的例子来说, dmtsai 这个使用者目前是以另一个 shell 登入的,而且新的 shell 给予 dmtsai 有效 GID 为 users 就是了。如果以图示来看就是如下所示:

    newgrp运作示意图

    虽然用户的环境设定(例如环境变量等等其他数据)不会有影响,但是使用者的『群组权限』将会重新被计算。 但是需要注意,由于是新取得一个 shell ,因此如果你想要回到原本的环境中,请输入 exit 回到原本的 shell !