文件、用户、用户组管理

linux的目录结构

linux中,所有的文件和目录都被组织成一个一根节点/开始的倒置的树状结构
文件系统的最顶层是由根目录开始的,再0往下既可以是目录也可以是文件,而每一个目录中又可以包含(子目录)或文件,如此反复即为目录
注意:目录和文件名是区分大小写的
Linux采用文件系统层次标准(FHS标准),规定了什么目录下应该放什么文件,可以在Linux文件目录结构一览表中查看

linux的用户和用户组管理

1. 用户和用户组的信息存储

1.1. 用户的基本信息文件/etc/passwd

通过 cat /etc/passwd命令来查看/etc/passwd配置文件的信息如下:

/etc/passwd文件中每行纪录一个用户,其中很多是系统或服务正常运行所必需的用户,称为系统用户或伪用户,系统用户无法用来登录,但是也不能删除,删除了之后,依赖这些用户运行的服务或程序就不能正常执行,会导致系统问题
以root用户信息为例,共7个字段,并以:进行了分割

root:x:0:0:root:/root:/bin/bash
用户名:密码位:UID(用户ID):GID(组ID):注释性描述:宿主目录:默认shell

1.1.1. 用户名

用户登录系统是使用的用户名,一串代表身份字符串

1.1.2. 密码

x代表此用户设有密码,但不是真的密码,真的在/etc/shandow文件中,早期的 UNIX 中,这里就是真正的加密密码串,但由于所有程序都能读取此文件,非常容易造成用户数据被窃取,虽然密码是加密的,但是采用暴力破解的方式也是能够进行破解的,因此,现在 Linux 系统把真正的加密密码串放置在 /etc/shadow 文件中,此文件只有 root 用户可以浏览和操作,注意不可以删除x,删了就会认为是无密码的

1.1.3. UID

用户ID,是一个0~65535之间的数值,不同范围代表不同的用户

表 1 UID代表不同身份的用户
UID 范围 用户身份
0 超级用户。UID 为 0 就代表这个账号是管理员账号。在 Linux 中,如何把普通用户升级成管理员呢?只需把其他用户的 UID 修改为 0 就可以了,这一点和 Windows 是不同的。不过不建议建立多个管理员账号。
1~499 系统用户(伪用户)。也就是说,此范围的 UID 保留给系统使用。其中,1~99 用于系统自行创建的账号;100~499 分配给有系统账号需求的用户。

其实,除了 0 之外,其他的 UID 并无不同,这里只是默认 500 以下的数字给系统作为保留账户,只是一个公认的习惯而已。
500~65535 普通用户。通常这些 UID 已经足够用户使用了。但不够用也没关系,2.6.x 内核之后的 Linux 系统已经可以支持 232 个 UID 了。

1.1.4. GID

全称”Group ID”,简称组ID,用户初始组的组ID号
初始组: 指用户登陆时就拥有这个用户组的相关权限。每个用户的初始组只能有一个,通常就是将和此用户的用户名相同的组名作为该用户的初始组
附加组: 指用户可以加入多个其他的用户组,并拥有这些组的权限。每个用户只能有一个初始组,除初始组外,用户再加入其他的用户组,这些用户组就是这个用户的附加组。附加组可以有多个,而且用户可以有这些附加组的权限
附加组和初始组是可以更改的,在 /etc/passwd 文件的第四个字段中看到的 ID 是这个用户的初始组

1.1.5. 注释性描述

例如存放用户名全名等信息

1.1.6. 宿主目录

用户登录之后有操作权限的访问目录,也叫用户的主目录

1.1.7. 默认shell

Linux的命令解释器

1.2. 用户的密码信息文件/etc/shadow

该文件仅root用户拥有权限如果发生了改变,需要注意是否有了恶意攻击

查看一下这个文件的内容

和passwd文件一样,不同的是被分为了9个字段

root:$6$ZFZ38JaA$r48EyIT9/4XcybjzAlNcudL/GslvyTpozzXUbHl1xC2DWEz9bdEy4utgSp5RR7ujMm4GtNn8NP96eQLXBqAiW1:19462:0:99999:7:::
用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段

1.2.1. 用户名

和passwd文件一样

1.2.2. 加密密码

这里存的是真正的加密的密码,使用的sha512散列加密算法,原本采用的是md5或des加密

这个加密不能手工修改,如果修改,那么系统将无法识别密码,导致密码是失效,可以通过在这个密码串前面加上! * x使密码暂时失效

所有的伪用户的密码都是" !! "或" * " 代表没有密码是不能登录的,新创建的用户如果没有设定密码,它的密码项也是" !! "代表这个用户没有密码,不能登录

1.2.3. 最后一次修改时间

如果root显示的是19462是因为什么
因为,Linux计算日期的时间是以1970年1月1日作为1不断累加得到的时间,到1970年1月1日,则为366天。这里显示19462天,也就是说,此root账号在1970年1月1日之后的第19462天修改的root用户密码

可以使用如下命名查看1942代表那一天

1.2.4. 最小修改时间间隔

该字段规定了从第3字段(最后一次修改密码的日期)起,多长时间之内不能修改密码

  • 0:随时都可以修改
  • 10:代表10天内不能修改

1.2.5. 密码有效期

这个字段可以指定距离第 3 字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段,强制用户更改密码,默认为99999,也就是273年

1.2.6. 密码需要变更前的警告天数

与第5字段 相比较,当账户有效期快到时 ,系统会发出警告信息给此账户,默认字段为7

1.2.7. 密码过期后的宽限天数

密码过期之后在此时间内还可以登录,超过之后不会提示而是完全禁用

1.2.8. 账号失效时间

同第3个字段一样,使用字1970年1月1日以来的总天数作为账户的失效时间,表示在此字段固定的时间之外,无论密码是否过期,都无法使用

1.2.9. 保留

1.2.10. 忘记密码怎么办

  • 普通用户:利用root用户更改
  • root用户:如果 root 账号的密码遗失,则需要重新启动进入单用户模式,系统会提供 root 权限的 bash 接口,此时可以用 passwd 命令修改账户密码;也可以通过挂载根目录,修改 /etc/shadow,将账户的 root 密码清空的方法,此方式可使用 root 无法密码即可登陆,建议登陆后使用 passwd 命令配置 root 密码

1.3. 组信息文件/etc/group

是用户的用户组配置文件,即用户组的所有信息都存在此文件中,记录着组ID(GID)和组名相对应的文件,查看该文件

用户组中还是以" : "作为字段之间的分隔符,分为四段

组名:密码:GID:该用户组中的用户列表

1.3.1. 组名

也就是用户组的名称,以字母或数字构成,不能重复、

1.3.2. 组密码

与passwd文件一样

不过,用户设置密码是为了验证用户的身份,那用户组设置密码是用来做什么的呢?
用户组密码主要是用来指定组管理员的,由于系统中的账号可能会非常多,root 用户可能没有时间进行用户的组调整,这时可以给用户组指定组管理员,如果有用户需要加入或退出某用户组,可以由该组的组管理员替代 root 进行管理。但是这项功能目前很少使用,我们也很少设置组密码
如果需要赋予某用户调整某个用户组的权限,则可以使用 sudo 命令代替。

1.3.3. 组ID(GID)

就是群组的ID号,Linux通过GID来区分用户组的,同用户名一样,这里的组 GID 与/etc/passwd文件中第 4 个字段的 GID 相对应,实际上,/etc/passwd 文件中使用 GID 对应的群组名,就是通过此文件对应得到的

1.3.4. 组中的用户

此字段列出每个群组包含的所有用户,注意,如果该用户组是这个用户的初始组,则该用户不会写入这个字段,也可以说,该字段显示的用户都是这个用户组的附加用户
每个用户都可以加入多个附加组,但是只能属于一个初始组,一般情况下,用户的初始组就是在建立用户的同时建立的和用户名相同的组

passwd、shadow、group之间的关系可以这样理解,即先在 /etc/group 文件中查询用户组的 GID 和组名;然后在 /etc/passwd 文件中查找该 GID 是哪个用户的初始组,同时提取这个用户的用户名和 UID;最后通过 UID 到 /etc/shadow 文件中提取和这个用户相匹配的密码

1.4. /etc/gshadow文件

查看该文件

文件中每行代表一个组用户的密码信息

组名:加密密码:组管理员:组附加用户列表

1.4.1. 组名

/etc/group文件中相对应

1.4.2. 组密码

通常不设置密码。因此字段为空,但有时为!指的是该群没有组密码也没有群组管理员

1.4.3. 组管理员

该文件的最大功能就是创建群组管理员,由于目前sudo之类的工具,群组管理员很少用了

1.4.4. 组中的附加用户

/etc/group文件的附加组一样

1.5. 创建用户的默认设置文件/etc/login.defs

该文件在创建用户时,对用户的一些基本属性做默认设置,该文件对root用户无效,当此文件中的配置与 /etc/passwd/etc/shadow 文件中的用户信息有冲突时,系统会以/etc/passwd /etc/shadow 为准

/etc/login.defs文件内容
设置项 含义
MAIL_DIR /var/spool/mail  创建用户时,系统会在目录 /var/spool/mail 中创建一个用户邮箱,比如 lamp 用户的邮箱是 /var/spool/mail/lamp。
PASS_MAX_DAYS 99999 密码有效期,99999 是自 1970 年 1 月 1 日起密码有效的天数,相当于 273 年,可理解为密码始终有效。
PASS_MIN_DAYS 0 表示自上次修改密码以来,最少隔多少天后用户才能再次修改密码,默认值是 0。
PASS_MIN_LEN 5 指定密码的最小长度,默认不小于 5 位,但是现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效。
PASS_WARN_AGE 7 指定在密码到期前多少天,系统就开始通过用户密码即将到期,默认为 7 天。
UID_MIN 500  指定最小 UID 为 500,也就是说,添加用户时,默认 UID 从 500 开始。注意,如果手工指定了一个用户的 UID 是 550,那么下一个创建的用户的 UID 就会从 551 开始,哪怕 500~549 之间的 UID 没有使用。
UID_MAX 60000 指定用户最大的 UID 为 60000。
GID_MIN 500 指定最小 GID 为 500,也就是在添加组时,组的 GID 从 500 开始。
GID_MAX 60000 用户 GID 最大为 60000。
CREATE_HOME yes 指定在创建用户时,是否同时创建用户主目录,yes 表示创建,no 则不创建,默认是 yes。
UMASK 077 用户主目录的权限默认设置为 077。
USERGROUPS_ENAB yes 指定删除用户的时候是否同时删除用户组,准备地说,这里指的是删除用户的初始组,此项的默认值为 yes。
ENCRYPT_METHOD SHA512 指定用户密码采用的加密规则,默认采用 SHA512,这是新的密码加密模式,原先的 Linux 只能用 DES 或 MD5 加密。

1.6. 添加新系统用户:useradd

名称
       useradd - 创建一个新用户或更新默认新用户信息
大纲
       useradd [选项] 登录
       useradd -D
       useradd -D [选项]
描述
       When invoked without the -D option, the useradd command creates a new user
       account using the values specified on the command line plus the default
       values from the system. Depending on command line options, the useradd
       command will update system files and may also create the new user''s home
       directory and copy initial files.
       By default, a group will also be created for the new user (see -g, -N, -U,
       and USERGROUPS_ENAB).

命令常用选项

useradd命令常用选项
选项 含义
-u UID 手工指定用户的 UID,注意 UID 的范围(不要小于 500)。
-d 主目录 手工指定用户的主目录。主目录必须写绝对路径,而且如果需要手工指定主目录,则一定要注意权限;
-c 用户说明 手工指定/etc/passwd文件中各用户信息中第 5 个字段的描述性内容,可随意配置;
-g 组名 手工指定用户的初始组。一般以和用户名相同的组作为用户的初始组,在创建用户时会默认建立初始组。一旦手动指定,则系统将不会在创建此默认的初始组目录。
-G 组名 指定用户的附加组。我们把用户加入其他组,一般都使用附加组;
-s shell 手工指定用户的登录 Shell,默认是 /bin/bash;
-e 曰期 指定用户的失效曰期,格式为 "YYYY-MM-DD"。也就是 /etc/shadow 文件的第八个字段;
-o 允许创建的用户的 UID 相同。例如,执行 "useradd -u 0 -o usertest" 命令建立用户 usertest,它的 UID 和 root 用户的 UID 相同,都是 0;
-m 建立用户时强制建立用户的家目录。在建立系统用户时,该选项是默认的;
-r 创建系统用户,也就是 UID 在 1~499 之间,供系统程序使用的用户。由于系统用户主要用于运行系统所需服务的权限配置,因此系统用户的创建默认不会创建主目录。
系统已经帮我们规定了非常多的默认值,没有特殊情况下,无需使用任何选项即可创建成功

这个命令帮助完成了以下操作

  1. /etc/passwd中创建一行与用户相关的数据
  2. /etc/shadow文件中新增了一行与用户相关的数据
  3. /etc/group 文件中创建一行与用户名一模一样的群组
  4. /etc/gshadow文件中新增一行与新增群组相关的密码信息
  5. 默认创建用户的主目录和邮箱
  6. /etc/skel目录中的配置文件复制到新用户的主目录中
[root@192 ~]# grep "oxo" /etc/passwd
oxo:x:1000:1000::/home/oxo:/bin/bash
[root@192 ~]# grep "oxo" /etc/shadow
oxo:!!:19463:0:99999:7:::
[root@192 ~]# grep "oxo" /etc/group
oxo:x:1000:
[root@192 ~]# grep "oxo" /etc/gshadow
oxo:!::
[root@192 ~]# ll /var/spool/mail/oxo 
-rw-rw----. 1 oxo mail 0 4月  16 09:10 /var/spool/mail/oxo
[root@192 ~]# ll -d /home/oxo/
drwx------. 2 oxo oxo 62 4月  16 09:10 /home/oxo/

还可以用useradd的各种选项亲自定制要创建的用户,这些默认值也是可以手动更改的,useradd 命令在添加用户时参考的默认值文件主要有两个,分别是 /etc/default/useradd/etc/login.defs

1.6.1. /etc/default/useradd文件

[root@192 ~]# cat /etc/default/useradd 
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@192 ~]# useradd -D      ## -D 选项指的就是查看新建用户的默认值
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
/etc/default/useradd 文件内容
参数 含义
GR0UP=100 这个选项用于建立用户的默认组,也就是说,在添加每个用户时,用户的初始组就是 GID 为 100 的这个用户组。但 CentOS 并不是这样的,而是在添加用户时会自动建立和用户名相同的组作为此用户的初始组。也就是说这个选项并不会生效。

Linux 中默认用户组有两种机制:一种是私有用户组机制,系统会创建一个和用户名相同的用户组作为用户的初始组;另一种是公共用户组机制,系统用 GID 是 100 的用户组作为所有新建用户的初始组。目前我们采用的是私有用户组机制。
HOME=/home 指的是用户主目录的默认位置,所有新建用户的主目录默认都在 /home/下,刚刚新建的 lamp1 用户的主目录就为 /home/lamp1/。
INACTIVE=-1 指的是密码过期后的宽限天数,也就是 /etc/shadow 文件的第七个字段。这里默认值是 -1,代表所有新建立的用户密码永远不会失效。
EXPIRE= 表示密码失效时间,也就是 /etc/shadow 文件的第八个字段。默认值是空,代表所有新建用户没有失效时间,永久有效。
SHELL=/bin/bash 表示所有新建立的用户默认 Shell 都是 /bin/bash。
SKEL=/etc/skel 在创建一个新用户后,你会发现,该用户主目录并不是空目录,而是有 .bash_profile、.bashrc 等文件,这些文件都是从 /etc/skel 目录中自动复制过来的。因此,更改 /etc/skel 目录下的内容就可以改变新建用户默认主目录中的配置文件信息。
CREATE_MAIL_SPOOL=yes 指的是给新建用户建立邮箱,默认是创建。也就是说,对于所有的新建用户,系统都会新建一个邮箱,放在 /var/spool/mail/ 目录下,和用户名相同。例如,lamp1 的邮箱位于 /var/spool/mail/lamp1。
useradd -D 命令可用选项
选项+参数含义
-b HOME设置所创建的主目录所在的默认目录,只需用目录名替换 HOME 即可,例如 useradd -D -b /gargae。
-e EXPIRE设置密码失效时间,EXPIRE 参数应使用 YYYY-MM-DD 格式,例如 useradd -D -e 2019-10-17。
-f INACTIVE设置密码过期的宽限天数,例如 useradd -D -f 7。
-g GROUP设置新用户所在的初始组,例如 useradd -D -g bear。
-s SHELL设置新用户的默认 shell,SHELL 必须是完整路径,例如 useradd -D -s /usr/bin/csh。

通过 /etc/default/useradd文件,仅能修改有关新用户的部分默认值,有一些内容并没有在这个文件中,例如修改用户默认的 UID、GID,以及对用户密码的默认设置,对这些默认值的修改就需要在 /etc/login.defs文件中进行
useradd 命令创建用户的过程是这样的

  • 系统首先读取 /etc/login.defs 和 /etc/default/useradd,根据这两个配置文件中定义的规则添加用户,也就是向/etc/passwd、/etc/group、/etc/shadow、/etc/gshadow文件中添加用户数据
  • 接着系统会自动在 /etc/default/useradd 文件设定的目录下建立用户主目录
  • 最后复制 /etc/skel目录中的所有文件到此主目录中
  • 由此,一个新的用户就创建完成了

1.7. 修改用户密码:passwd命令

NAME
       passwd - update user''s authentication tokens
SYNOPSIS
       passwd  [-k]  [-l]  [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warn?
       days] [-i inactivedays] [-S] [--stdin] [username]
DESCRIPTION
       The passwd utility is used to update user''s authentication token(s).
       This task is achieved through calls  to  the  Linux-PAM  and  Libuser  API.
       Essentially, it initializes itself as a "passwd" service with Linux-PAM and
       utilizes configured password modules to  authenticate  and  then  update  a
       user''s password.
       A  simple entry in the global Linux-PAM configuration file for this service
       would be:
        #
        # passwd service entry that does strength checking of
        # a proposed password before updating it.
        #
        passwd password requisite pam_cracklib.so retry=3
        passwd password required pam_unix.so use_authtok
        #
       Note, other module types are not required for this application to  function
       correctly.

passwd 命令可用选项
选项+参数含义
-S查询用户密码的状态,也就是 /etc/shadow 文件中此用户密码的内容。仅 root 用户可用
-l暂时锁定用户,该选项会在 /etc/shadow 文件中指定用户的加密密码串前添加 "!",使密码失效。仅 root 用户可用
-u解锁用户,和 -l 选项相对应,也是只能 root 用户使用
--stdin可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用
-n  天数设置该用户修改密码后,多长时间不能再次修改密码,也就是修改 /etc/shadow 文件中各行密码的第 4 个字段
-x   天数设置该用户的密码有效期,对应 /etc/shadow 文件中各行密码的第 5 个字段
-w  天数设置用户密码过期前的警告天数,对于 /etc/shadow 文件中各行密码的第 6 个字段
-i   日期设置用户密码失效日期,对应 /etc/shadow 文件中各行密码的第 7 个字段

很多Linux 发行版为了系统安装,都使用了 PAM 模块进行密码的检验,设置密码太短、与用户名相同、是常见字符串等,都会被 PAM 模块检查出来,从而禁止用户使用此类密码,root不受影响

1.8. 修改用户信息:usermod

名称
       usermod - 修改一个用户账户
大纲
       usermod [选项] 登录
描述
       The usermod command modifies the system account files to reflect the
       changes that are specified on the command line.

利用 useradd 命令添加用户,但如果不小心添错用户信息, 一个是使用 Vim 文本编辑器手动修改涉及用户信息的相关文件(/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow),另一个方法就是使用 usermod 命令,该命令专门用于修改用户信息

usermod 命令可用选项
选项+参数含义
-c用户说明修改用户的说明信息,即修改 /etc/passwd 文件目标用户信息的第 5 个字段
-d 主目录修改用户的主目录,即修改 /etc/passwd 文件中目标用户信息的第 6 个字段,需要注意的是,主目录必须写绝对路径
-e 日期修改用户的失效曰期,格式为 "YYYY-MM-DD",即修改 /etc/shadow 文件目标用户密码信息的第 8 个字段
-g 组名修改用户的初始组,即修改 /etc/passwd 文件目标用户信息的第 4 个字段(GID)
-u UID修改用户的UID,即修改 /etc/passwd 文件目标用户信息的第 3 个字段(UID)
-G 组名修改用户的附加组,其实就是把用户加入其他用户组,即修改 /etc/group 文件
-l 用户名修改用户名称
-L临时锁定用户(Lock)
-U:解锁用户(Unlock)和 -L 对应
-s shell修改用户的登录 Shell,默认是 /bin/bash

相比 useradd 命令,usermod 命令还多出了几个选项,即 -L 和 -U,作用分别与 passwd 命令的 -l 和-u 相同,并不是所有的 Linux 发行版都包含这个命令,因此,使用前可以使用 man usermod 命令确定系统是否支持,此命令对用户的临时锁定,同 passwd 命令一样,都是在 /etc/passwd 文件目标用户的加密密码字段前添加 "!",使密码失效;反之,解锁用户就是将添加的 "!" 去掉

1.9. 修改用户密码状态:chage

除了使用passwd -S命令查看用户的密码信息外,还可以使用chage命令,它可以显示更加详细的用户密码信息,和passwd一样提供了修改用户密码信息的功能

名称
       chage - 更改用户密码过期信息
大纲
       chage [选项] 登录
描述
       The chage command changes the number of days between password changes and
       the date of the last password change. This information is used by the
       system to determine when a user must change their password.
chage 命令可用选项
选项+参数含义
-l列出用户的详细密码状态
-d 日期修改 /etc/shadow 文件中指定用户密码信息的第 3 个字段,也就是最后一次修改密码的日期,格式为 YYYY-MM-DD
-m 天数修改密码最短保留的天数,也就是 /etc/shadow 文件中的第 4 个字段
-M 天数修改密码的有效期,也就是 /etc/shadow 文件中的第 5 个字段
-W 天数修改密码到期前的警告天数,也就是 /etc/shadow 文件中的第 6 个字段
-i 天数修改密码过期后的宽限天数,也就是 /etc/shadow 文件中的第 7 个字段
-E 日期修改账号失效日期,格式为 YYYY-MM-DD,也就是 /etc/shadow 文件中的第 8 个字段

chage 命令除了修改密码信息的功能外,还可以强制用户在第一次登录后,必须先修改密码,并利用新密码重新登陆系统,此用户才能正常使用,chage 的这个功能常和 passwd 批量初始化用户密码功能合用

1.10. 删除用户:userdel

名称
       userdel - 删除用户账户和相关文件
大纲
       userdel [选项] 登录
描述
       The userdel command modifies the system account files, deleting all entries
       that refer to the user name LOGIN. The named user must exist.
选项
       -r, --remove
           用户主目录中的文件将随用户主目录和用户邮箱一起删除。在其它文件系统中的文件
必须手动搜索并删除。
		## 在删除用户的同时如果不删除用户的家目录,那么家目录就会变成没有属主和属组的目录,也就是垃圾文件

用户的相关数据包含如下几项

  • 用户基本信息:存储在 /etc/passwd 文件中
  • 用户密码信息:存储在 /etc/shadow 文件中
  • 用户群组基本信息:存储在 /etc/group 文件中
  • 用户群组信息信息:存储在 /etc/gshadow 文件中
  • 用户个人文件:主目录默认位于 /home/用户名,邮箱位于 /var/spool/mail/用户名

userdel 命令的作用就是从以上文件中,删除与指定用户有关的数据信息,如果我们想要从系统中彻底的删除某个用户,最好在使用 userdel 命令之前,先通过 find -user 用户名 命令查出系统中属于该用户的文件,然后在加以删除

1.11. 查看用户的UID和GID

id命令可以查询用户的UID和GID以及附加组的信息

NAME
       id - print real and effective user and group IDs
SYNOPSIS
       id [OPTION]... [USER]

1.12. linux用户间的切换su和su -

su 是最简单的用户切换命令,通过该命令可以实现任何身份的切换,包括从普通用户切换为 root 用户、从 root 用户切换为普通用户以及普通用户之间的切换,普通用户之间切换以及普通用户切换至 root 用户,都需要知晓对方的密码,只有正确输入密码,才能实现切换;从 root 用户切换至其他用户,无需知晓对方密码,直接可切换成功

NAME
       su - run a command with substitute user and group ID
SYNOPSIS
       su [options...] [-] [user [args...]]
DESCRIPTION
       su allows to run commands with substitute user and group ID.
       When  called  without arguments su defaults to running an interactive shell
       as root.
       For backward compatibility su defaults to not change the current  directory
       and  to  only  set  the environment variables HOME and SHELL (plus USER and
       LOGNAME if the target user is not root).  It is recommended to  always  use
       the  --login  option (instead it''s shortcut -) to avoid side effects caused
       by mixing environments.
       This version of su uses PAM for authentication, account and session manage‐
       ment.  Some configuration options found in other su implementations such as
       e.g. support of a wheel group have to be configured via PAM.

su 命令可用选项
选项+参数含义
-当前用户不仅切换为指定用户的身份,同时所用的工作环境也切换为此用户的环境(包括 PATH 变量、MAIL 变量等),使用 - 选项可省略用户名,默认会切换为 root 用户
-l同 - 的使用类似,也就是在切换用户身份的同时,完整切换工作环境,但后面需要添加欲切换的使用者账号
-p表示切换为指定用户的身份,但不改变当前的工作环境(不使用切换用户的配置文件)
-m和 -p 一样
-c 命令仅切换用户执行一次命令,执行后自动切换回来,该选项后通常会带有要执行的命令

1.12.1. su和su -的区别

注意,使用su命令时,有-和没有-是完全不同的,-选项表示在切换用户身份的同时,连当前使用的环境变量也切换成指定用户的,环境变量是用来定义操作系统环境的,因此如果系统环境没有随用户身份切换,很多命令无法正确执行

普通用户通过su切换root用户
  • 系统中的 $PATH环境变量依然是 lamp 的(而不是 root 的)
  • 当前工作环境中,并不包含/sbin、/usr/sbin等超级用户命令的保存路径,这就导致很多管理员命令根本无法使用
  • 当 root 用户接受邮件时,会发现收到的是 lamp 用户的邮件,因为环境变量 $MAIL也没有切换

1.13. whoami和who am i

whoami 命令和 who am i 命令是不同的 2 个命令,前者用来打印当前执行操作的用户名,后者则用来打印登陆当前 Linux 系统的用户名

[oxo@192 ~]$ whoami
oxo
[oxo@192 ~]$ who am i
oxo      pts/0        2023-04-17 01:39 (192.168.88.1)
[oxo@192 ~]$ su root
密码:
[root@192 oxo]# whoami
root
[root@192 oxo]# who am i
oxo      pts/0        2023-04-17 01:39 (192.168.88.1)

在未切换用户身份之前,whoami 和 who am i 命令的输出是一样的

使用 su 命令切换用户身份后
  • 使用 whoami 命令打印的是切换后的用户名
  • 而 who am i 命令打印的仍旧是登陆系统时所用的用户名
  • 执行 whoami 命令,等同于执行 id -un 命令
  • 执行 who am i 命令,等同于执行 who -m 命令
    使用 su 或者 sudo 命令切换用户身份,骗得过 whoami,但骗不过 who am i
背后的运行机制,是实际用户(UID)和有效用户(EUID,即 Effective UID
  • 实际用户指的是登陆 Linux 系统时所使用的用户,因此在整个登陆会话过程中,实际用户是不会发生变化的
  • 有效用户,指的是当前执行操作的用户,也就是说真正决定权限高低的用户,这个是能够利用 su 或者 sudo 命令进行任意切换的
    一般情况下,实际用户和有效用户是相同的,如果出现用户身份切换的情况,它们会出现差异。需要注意的是,实际用户和有效用户出现差异,切换用户并不是唯一的触发机制
whoami 和 who am i通常应用在哪些场景中
  • 对那些经常需要切换用户的系统管理员来说,经常需要明确当前使用的是什么身份
  • 另外,对于某些 shell 脚本,或者需要特别的用户才能执行,这时就需要利用 whoami 命令来搞清楚执行它的用户是谁
  • 还有一些 shell 脚本,一定要某个特别用户才能执行,即便使用 su 或者 sudo 命令切换到此身份都不行,此时就需要利用 who am i 来确认

1.14. 添加用户组:groupadd

名称
       groupadd - 创建一个新组
大纲
       groupadd [选项] group
描述
       The groupadd command creates a new group account using the values specified
       on the command line plus the default values from the system. The new group
       will be entered into the system files as needed.
选项
		-r, --system
           创建一个系统组。
	    -g, --gid GID
           The numerical value of the group''s ID. This value must be unique,
           unless the -o option is used. The value must be non-negative. The
           default is to use the smallest ID value greater than or equal to
           GID_MIN and greater than every other group.

1.15. 修改用户组:groupmod

名称
       groupmod - modify a group definition on the system
大纲
       groupmod [选项] GROUP
描述
       The groupmod command modifies the definition of the specified GROUP by
       modifying the appropriate entry in the group database.
选项
		-g, --gid GID
           The group ID of the given GROUP will be changed to GID.
           The value of GID must be a non-negative decimal integer. This value
           must be unique, unless the -o option is used.
           Users who use the group as primary group will be updated to keep the
           group as their primary group.
           Any files that have the old group ID and must continue to belong to
           GROUP, must have their group ID changed manually.
           No checks will be performed with regard to the GID_MIN, GID_MAX,
           SYS_GID_MIN, or SYS_GID_MAX from /etc/login.defs.
       -n, --new-name NEW_GROUP
           The name of the group will be changed from GROUP to NEW_GROUP name.

用户名不要随意修改,组名和 GID 也不要随意修改,因为非常容易导致管理员逻辑混乱
如果非要修改用户名或组名,则建议大家先删除旧的,再建立新的

1.16. 删除用户组:groupdel

名称
       groupdel - 删除一个组
大纲
       groupdel [选项] GROUP
描述
       The groupdel command modifies the system account files, deleting all
       entries that refer to GROUP. The named group must exist.

注意,不能使用 groupdel 命令随意删除群组

  • 此命令仅适用于删除那些 "不是任何用户初始组" 的群组
  • 如果有群组还是某用户的初始群组,则无法使用 groupdel 命令成功删除

1.17. 把用户添加进组或从组中删除:gpasswd

名称
       gpasswd - administer /etc/group and /etc/gshadow
大纲
       gpasswd [选项] group
描述
       The gpasswd command is used to administer /etc/group, and /etc/gshadow.
       Every group can have administrators, members and a password.
       System administrators can use the -A option to define group
       administrator(s) and the -M option to define members. They have all rights
       of group administrators and members.
       gpasswd called by a group administrator with a group name only prompts for
       the new password of the group.
       If a password is set the members can still use newgrp(1) without a
       password, and non-members must supply the password.
   请注意组密码
       Group passwords are an inherent security problem since more than one person
       is permitted to know the password. However, groups are a useful tool for
       permitting co-operation between different users.
gpasswd命令各选项及其功能
选项功能
 选项为空时,表示给群组设置密码,仅 root 用户可用。
-A user1,... 将群组的控制权交给 user1,... 等用户管理,也就是说,设置 user1,... 等用户为群组的管理员,仅 root 用户可用。
-M user1,... 将 user1,... 加入到此群组中,仅 root 用户可用。
-r 移除群组的密码,仅 root 用户可用。
-R 让群组的密码失效,仅 root 用户可用。
-a user 将 user 用户加入到群组中。
-d user 将 user 用户从群组中移除。

除 root 可以管理群组外,可设置多个普通用户作为群组的管理员,但也只能做“将用户加入群组”和“将用户移出群组”的操作
使用 usermod -G 命令也可以将用户加入群组,使用此命令将用户加入到新的群组后,该用户之前加入的那些群组都将被清空,将用户加入或移出群组,最好使用 gpasswd 命令

1.18. 切换用户的有效组:newgrp

每个用户可以属于一个初始组(用户是这个组的初始用户),也可以属于多个附加组(用户是这个组的附加用户)

1.18.1. 用户可以属于这么多用户组,那么用户在创建文件后

  • 初始用户组的组身份生效,因为初始组是用户一旦登陆就获得的组身份
  • 用户的有效组默认是初始组,因此所创建文件的属组是用户的初始组
    那么用户属于多个用户组,如果想要改变用户的初始组,使用命令 newgrp 就可以从用户的附加组中选择一个群组,作为用户新的初始组
名称
       newgrp - 登录到一个新组
大纲
       newgrp [-] [group]
描述
       The newgrp command is used to change the current group ID during a login
       session. If the optional - flag is given, the user''s environment will be
       reinitialized as though the user had logged in, otherwise the current
       environment, including current working directory, remains unchanged.
       newgrp changes the current real group ID to the named group, or to the
       default group listed in /etc/passwd if no group name is given.  newgrp also
       tries to add the group to the user groupset. If not root, the user will be
       prompted for a password if she does not have a password (in /etc/shadow if
       this user has an entry in the shadowed password file, or in /etc/passwd
       otherwise) and the group does, or if the user is not listed as a member and
       the group has a password. The user will be denied access if the group
       password is empty and the user is not listed as a member.
       If there is an entry for this group in /etc/gshadow, then the list of
       members and the password of this group will be taken from this file,
       otherwise, the entry in /etc/group is considered.
配置文件
       The following configuration variables in /etc/login.defs change the
       behavior of this tool:
       SYSLOG_SG_ENAB (boolean)
           Enable "syslog" logging of sg activity.
文件
       /etc/passwd
           用户账户信息。
       /etc/shadow
           安全用户账户信息。
       /etc/group
           组账户信息。
       /etc/gshadow
           安全组账户信息。
参见
       id(1), login(1), su(1), sg(1), gpasswd(1), group(5), gshadow(5).

热门相关:地球第一剑   豪门闪婚:帝少的神秘冷妻   寂静王冠   网游之逆天飞扬   天启预报