目录
一、管理用户和组账号
1.1 用户和组账号概述
1.1.1 Linux基于用户身份对资源访问进行控制
在Linux系统中,每个文件和目录都与一个用户账号和一个组账号相关联。系统使用用户ID(UID)和组ID(GID)来管理访问权限。用户权限分为三类:所有者权限、组权限和其他用户权限。
1.1.2 用户账号
-
超级用户(Root用户):超级用户是系统中拥有最高权限的用户,具有对系统的完全控制权。可以访问和修改系统中的所有文件和设置,执行任何命令。在需要进行系统级别的操作(如安装软件、修改系统配置等)时使用。由于其权限极高,建议避免长期使用,使用时要小心,以防止意外更改或安全问题。
-
普通用户(一般用户):普通用户是系统中常规用户,权限受限于自己的文件和目录。只能访问和修改自己拥有的文件和目录,不能修改系统文件或进行系统级别的操作。适用于日常操作,如文档编辑、运行应用程序等。由于权限有限,相对安全,但仍需注意账户安全,避免恶意软件或不安全的操作。
-
程序用户(系统用户):程序用户是系统为了运行某些服务或应用程序而创建的用户账户。通常具有运行特定程序所需的最低权限,不允许进行其他系统操作。用来隔离服务和程序,以提高安全性和管理便利性。程序用户的权限非常有限,有助于保护系统不受程序漏洞的影响。
1.1.3 组账号
- 基本组(私有组)
- 附加组(公共组)
1.1.4 UID和GID
- UID(User IDentity,用户标识号)
- GID(Group IDentify,组标识号)
root用户的UID的固定值为0、root组帐号的GID号为固定值0 1~499的UID、GID默认保留给程序用户使用,普通用户/组使用的UID、GID号在500~60000之间
1.2 用户账号文件
1.2.1 用户账号文件 /etc/passwd
# 查看前两行文件内容
[root@master ~]# head -2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
# 查看最后一行文件内容
[root@master ~]# tail -1 /etc/passwd
test:x:1001:100::/home/test:/bin/bash
/etc/passwd 文件是Linux系统中用于存储用户账户信息的关键文件。每一行代表一个用户账户的详细信息,文件的格式和字段定义如下:
1.2.1.1 /etc/passwd 文件结构
/etc/passwd 文件的每一行包含以下字段,用冒号(:)分隔
1.2.1.2 /etc/passwd 字段解释
- 字段1-用户名(username):这是用户的登录名称。它是系统中唯一的标识符,用于登录和识别用户。
- 字段2-密码(password):这是用户账户的加密密码。在早期版本的Linux中,这里存储的是加密密码,但现在通常会显示为一个占位符(如
x
或*
),实际密码信息存储在/etc/shadow
文件中,以增强安全性。 - 字段3-用户ID(UID):这是一个唯一的数字标识符,用于系统区分不同的用户。UID为0的用户是超级用户(root),其他UID为普通用户。
- 字段4-组ID(GID):这是用户所属的主要用户组的唯一标识符。每个用户都可以属于一个主要组,GID对应于
/etc/group
文件中的组条目。 - 字段5-用户信息(GECOS):这一字段通常用于存储用户的详细信息,如全名、电话号码、办公室位置等。这一字段的内容可以是任何文本,但通常用于提供用户的描述性信息。
- 字段6-主目录(home_directory):这是用户登录时默认的工作目录。用户的个人文件和配置通常存储在这个目录下。
- 字段7-默认Shell(shell):这是用户登录时默认启动的命令行解释器或Shell。它指定了用户登录后的默认环境。
1.2.2 用户账号文件/etc/shadow
[root@master ~]# head -2 /etc/shadow
root:$6$hIoNX7dERAxlj0ft$PI8rn6iEnHJWlLoooU5KVXUXLNqxwS6I5uqDLU1ueQrMt0vF9gmf7DQVprn/SDehA8w8EiBvJ1GnRNsdxI4HQ/::0:99999:7:::bin:*:18353:0:99999:7:::
[root@master ~]# tail -1 /etc/shadow
test:!!:19976:0:99999:7:::
/etc/shadow 文件是Linux系统中用于存储用户密码信息的文件,它主要用于增强系统的安全性。与 /etc/passwd 文件不同,/etc/shadow 文件专门用于存储加密后的密码和与密码相关的其他信息。这个文件通常只有 root 用户可以访问,以防止普通用户查看密码信息。
1.2.2.1 /etc/shadow 文件结构
/etc/shadow 文件的每一行包含以下字段,用冒号(:)分隔
1.2.2.2 /etc/shadow 字段解释
- 字段1-用户名(username):用户的登录名称,与
/etc/passwd
文件中的用户名字段对应。 - 字段2-加密密码(encrypted_password):用户密码的加密值。如果该字段为空(
*
或!
),则表示账户被锁定或者禁用。 - 字段3-上次密码更改时间(last_change):自1970年1月1日以来的天数,表示用户最后一次更改密码的日期。这个字段用于控制密码的更改周期。
- 字段4-最小密码年龄(min_age):密码在更改后必须保持有效的最小天数。用户在这段时间内不能更改密码。
- 字段5-最大密码年龄(max_age):密码的最大有效天数,超过这个期限后,用户必须更改密码。这个字段用于强制定期更改密码。
- 字段6-密码过期警告期(warn_period):在密码过期之前,系统会警告用户的天数。用户在这个警告期内可以更改密码,而不会被立即锁定。
- 字段7-账户失效期(inactive_period):在密码过期之后,账户将被禁用的天数。超过这个期限,账户将被锁定,用户无法再登录。
- 字段8-账户过期日期(expire_date):自1970年1月1日以来的天数,表示用户账户的过期日期。过了这个日期,账户将被禁用。
- 字段9-保留字段(未使用)
1.3 用户账号管理
1.3.1 添加用户账号(useradd)
useradd命令:用于Linux中创建的新的系统用户。useradd 可用来建立用户帐号。帐号建好之后,再用 passwd 设定帐号的密码.而可用 userdel 删除帐号。使用 useradd 指令所建立的帐号,实际上是保存在 /etc/passwd 文本文件中。
命令格式:useradd [选项] 用户名
常用命令选项:
- -u:指定 UID 标记号
- -d:指定宿主目录,缺省为 /home/ 用户名
- -e:指定帐号失效时间
- -g:指定用户的基本组名(或UID号)
- -G:指定用户的附加组名(或GID号)
- -M:不为用户建立并初始化宿主目录
- -s:指定用户的登录 Shell
# 添加一个 zw01 用户
[root@master ~]# useradd zw01
# 查看用户账号文件中用户是否添加成功
[root@master ~]# tail -1 /etc/passwd
zw01:x:1002:1002::/home/zw01:/bin/bash
# 添加用户的同时,会创建用户目录
[root@master home]# ls
test zw01
创建一个考试测试用的帐号exam01,指定属于users组,该帐号于2009-07-30失效
[root@master ~]# useradd -g users -e 2009-07-30 exam01
[root@master ~]# tail -1 /etc/passwd
exam01:x:1003:100::/home/exam01:/bin/bash
1.3.2 设置/更改用户口令(passwd)
passwd命令:用于设置用户的认证信息,包括用户密码、密码过期时间等。系统管理者则能用它管理系统用户的密码。只有管理者可以指定用户名称,一般用户只能变更自己的密码。
命令格式:passwd [选项] 用户名
常用命令选项:
- passwd(不带选项):更改当前用户的密码
- passwd 用户名:更改指定用户的密码(需要root权限)
- -d:删除用户的密码,使用户只能通过其他认证方式(如SSH密钥)登录
- -l:锁定用户的密码(用户不能使用密码登录,但其他认证方式仍然有效)
- -S:查看用户帐号的状态(是否被锁定)
- -u:解锁被锁定的用户密码
-e
: 使用户的密码立即过期,迫使用户在下次登录时更改密码-i
: 设置密码过期的宽限期(即在密码过期后用户能再登录多少天)
# 先从用户账号文件中,检索一下 zw01 用户的密码信息,发现 zw01 的密码为空
[root@master ~]# grep ^zw01 /etc/shadow
zw01::19977:0:99999:7:::
# 为 zw01 用户设置一个密码
[root@master ~]# passwd zw01
Changing password for user zw01.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
# 再次检索 zw01 用户的密码信息,发现密码已经被创建了
[root@master ~]# grep ^zw01 /etc/shadow
zw01:$6$RjS8uYSa$EJB6qV1gJSsYh5d2B2VkOdBNk2GPYz6B/mIympOQEeER5aDsrmgxWOoVli2P5kBqCQzIJVLdXtnbqYnwKBC43.:19977:0:99999:7:::
# 清空用户 zw01 的密码
[root@master ~]# passwd -d zw01
Removing password for user zw01.
passwd: Success
# 再次检索 zw01 用户的密码信息,发现密码已经被清空了
[root@master ~]# grep ^zw01 /etc/shadow
zw01::19977:0:99999:7:::
1.3.3 修改用户账号的属性(usermod)
usermod命令:用于修改用户的基本信息。usermod 命令不允许你改变正在线上的使用者帐号名称。当 usermod 命令用来改变 user id,必须确认这名 user 没在电脑上执行任何程序。你需手动更改使用者的 crontab 档。也需手动更改使用者的 at 工作档。采用 NIS server 须在server上更动相关的 NIS 设定。
命令格式:usermod [选项] 用户名
常用命令选项:
- -l:更改用户名(需要使用
-d
选项更改用户的家目录以匹配新的用户名) - -L:锁定用户账户(将用户的密码锁定,用户无法通过密码登录)
- -U:解锁用户账户(解除锁定用户密码)
- 以下选项与useradd命令中的含义相同:-u、-d、-e、-g、-G、-s
# 将 zw01 用户名改为 zw02,注:usermod -l 新用户名 旧用户名
[root@master ~]# usermod -l zw02 zw01
# 查看用户账号文件中,账号名已修改
[root@master ~]# tail -1 /etc/passwd
zw02:x:1002:1002::/home/zw01:/bin/bash
1.3.4 删除用户账号(userdel)
userdel命令:用于删除给定的用户,以及与用户相关的文件。若不加选项,则仅删除用户帐号,而不删除相关文件。
命令格式:userdel [-r] 用户名
常用命令选项:
- -r:使用 userdel 命令需要指定帐号名称作为参数,添加 “-r” 选项时可以将该用户的宿主目录一并删除。
# 添加一个新用户
[root@master ~]# useradd stu01
# 查看家目录下的用户目录,是存在的
[root@master ~]# ls -ld /home/stu01/
drwx------. 3 stu01 stu01 78 Sep 11 18:58 /home/stu01/
# 添加 -r 选项,会将该用户的宿主目录一并删除
[root@master ~]# userdel -r stu01
# 再次查看用户目录,发现已经不存在了
[root@master ~]# ls -ld /home/stu01/
ls: cannot access /home/stu01/: No such file or directory
1.3.5 用户账号的初始配置文件
1.3.5.1 文件来源
用户首次登录时,会使用 /etc/skel 目录中的文件创建初始配置文件。
主要的用户初始配置文件
- ~/.bash_profile:当用户登录时,该文件仅仅执行一次!每个用户都可使用该文件输入专用于自己使用的shell信息,默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
- ~/.bashrc:当登录时以及每次打开新的shell时,该该文件被读取.该文件包含专用于你的bash shell的bash信息,
- ~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件.
- /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.
- /etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.
~/.bash_profile 是交互式、login 方式进入 bash 运行的,~/.bashrc 是交互式 non-login 方式进入 bash 运行的,通常二者设置大致相同,所以通常前者会调用后者。
1.4 组账号文件
1.4.1 组账号文件 /etc/group
# 查看文件前两行内容
[root@master ~]# head -2 /etc/group
root:x:0:
bin:x:1:
# 查看文件最后一行内容
[root@master ~]# tail -1 /etc/group
zw01:x:1004:
/etc/group 文件是Linux系统中用于存储系统中所有用户组的信息。
1.4.1.1 /etc/group 文件结构
/etc/group 每一行代表一个用户组,字段之间用冒号(:
)分隔。
1.4.1.2 字段解释
- 字段1-组名 (Group Name):用户组的名称,例如
developers
。 - 字段2-组密码占位符 (Group Password Placeholder):通常为空或为
x
,表示系统不使用组密码。组密码通常不常用。 - 字段3-组ID (GID):唯一标识用户组的数字ID,例如
1002
。系统中每个组都有一个唯一的GID。 - 字段4-组成员 (Group Members):属于该组的用户列表,用户用逗号分隔。例如
john,alice
表示john
和alice
是该组的成员。
1.4.2 组账号文件 /etc/gshadow
# 查看文件前两行内容
[root@master ~]# head -2 /etc/gshadow
root:::
bin:::
# 查看文件最后一行内容
[root@master ~]# tail -1 /etc/gshadow
zw01:!::
/etc/gshadow 文件是Linux系统中用于存储有关组的敏感信息,如组密码和组成员。
1.4.2.1 /etc/gshadow 文件结构
/etc/gshadow 每一行包含一个用户组的密码信息,字段之间用冒号(:
)分隔。
1.4.2.2 字段解释
- 字段1-组名 (Group Name):用户组的名称,例如
developers
。 - 字段2-组密码 (Group Password):组密码的加密形式,通常为空。组密码不常用,但如果设置,组密码会在此显示。
- 字段3-组管理员 (Group Administrators):具有管理员权限的用户列表,用逗号分隔。管理员可以管理该组的成员。
- 字段4-组成员 (Group Members):属于该组的普通成员,用逗号分隔。例如
john,alice
。
1.5 组账号管理
1.5.1 添加组账号(groupadd)
groupadd命令:用于创建一个新的工作组,新工作组的信息将被添加到系统文件中。
命令格式:groupadd [-g GID] 组账号名
常用命令:
- -g:指定组名或组ID (GID)。
# 添加一个新组账号 market ,并指定 GID 为 10012
[root@master ~]# groupadd -g 10012 market
# 查看刚刚添加的组账号信息
[root@master ~]# tail -1 /etc/group
market:x:10012:
1.5.2 添加删除组成员(gpasswd)
gpasswd命令:是Linux下工作组文件/etc/group
和/etc/gshadow
管理工具。
命令格式:gpasswd [选项] 用户名 组账号名
常用命令选项:
- -a:向组内添加一个用户
- -d:从组内删除一个用户成员
- -M:定义组成员列表,以逗号分隔
# 向 market 组中添加 root 用户
[root@master ~]# gpasswd -a root market
Adding user root to group market
# 查看 market 组信息,发现 root 用户已经添加进去了
[root@master ~]# grep market /etc/group
market:x:10012:root
# 移除 market 组中的 root 用户
[root@master ~]# gpasswd -d root market
Removing user root from group market
# 再次查看 market 组信息,发现 root 用户已经被移除了
[root@master ~]# grep market /etc/group
market:x:10012:
1.5.3 删除组账号(groupdel)
groupdel命令:用于删除指定的工作组,本命令要修改的系统文件包括 /ect/group 和 /ect/gshadow。若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。
命令格式:groupdel 组账号名
# 删除 market 组账号
[root@master ~]# groupdel market
# 查看组账号文件,发现 market 组账号已经不存在了
[root@master ~]# grep market /etc/group
1.6 查询账号信息
1.6.1 查询用户身份标识(id)
id命令:打印真实以及有效的用户和所在组的信息
命令格式:id [用户名]
# 默认查看当前用户身份信息
[root@master ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
# 查看指定用户身份信息
[root@master ~]# id exam01
uid=1003(exam01) gid=100(users) groups=100(users)
1.6.2 查询用户所属的组(groups)
groups命令:打印指定用户所在组的名称。
命令格式:groups [用户名]
# 默认查看当前用户所属的组
[root@master ~]# groups
root
# 查看指定用户所属的组
[root@master ~]# groups exam01
exam01 : users
1.6.3 查询用户账号的详细信息(finger)
finger命令:用于查找并显示用户信息。包括本地与远端主机的用户皆可,帐号名称没有大小写的差别。单独执行finger指令,它会显示本地主机现在所有的用户的登陆信息,包括帐号名称,真实姓名,登入终端机,闲置时间,登入时间以及地址和电话。
命令格式:finger [用户名]
# 需要注意,在 CentOS 系统中,默认是没有安装 finger 命令的,
# 下面是使用 kali 系统查看的
┌──(root㉿piloteer-101)-[~]
└─# finger
Login Name Tty Idle Login Time Office Office Phone
root root tty7 Sep 11 21:58 (:0)
┌──(root㉿piloteer-101)-[~]
└─# finger root
Login: root Name: root
Directory: /root Shell: /usr/bin/zsh
On since Wed Sep 11 21:58 (CST) on tty7 from :0
51 seconds idle
No mail.
No Plan.
1.6.4 查询已登录到主机的用户信息(users、w、who)
users 命令:打印当前主机所有登陆用户的名称。
命令格式:users
[root@master ~]# users
root root
w 命令:显示目前登入系统的用户信息。
命令格式:w
[root@master ~]# w
21:55:32 up 9:03, 4 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root :0 :0 09:09 ?xdm? 7:49 0.83s /usr/libexec/gnome-ses
root pts/2 :0 14:10 4.00s 0.88s 0.03s w
who 命令:显示当前所有登陆用户的信息。
命令格式:who
[root@master ~]# who
root :0 2024-09-11 09:09 (:0)
root pts/2 2024-09-11 14:10 (:0)
二、管理目录和文件的属性
2.1 文件/目录的权限和归属
2.1.1 访问权限
每种用户类别都有三种权限:
- 读(Read, r):允许用户查看文件内容或列出目录中的文件。
- 写(Write, w):允许用户修改文件内容或向目录中添加/删除文件。
- 执行(Execute, x):允许用户执行文件或进入目录
2.1.2 归属(所有权)
Linux系统中的每个文件和目录都有三种类型的访问权限,分别对应三种用户类别:
- 文件所有者(Owner):文件的创建者,默认拥有该文件。
- 文件所属组(Group):文件的所属用户组。
- 其他用户(Others):系统中除了文件所有者和所属组成员之外的所有用户。
2.2 查看目录或文件的属性
2.2.1 权限表示
文件和目录的权限通常以三组字符的形式表示,每组代表一种用户类别的权限。例如,对于一个文件,权限 -rw-r--r-- 表示:
- 所有者有读(r)、写(w)和执行(x)权限。
- 所属组有读(r)和执行(x)权限,但没有写(w)权限。
- 其他用户只有读(r)和执行(x)权限。
2.2.2 权限数字表示
权限也可以用数字来表示,每组权限对应一个数字,每个权限的值如下:
- 读(r):4
- 写(w):2
- 执行(x):1
这些数字可以相加来表示一组权限。例如,du)
这些数字可以相加来表示一组权限。例如,rwx(读、写、执行)的权限可以用数字7
表示(4+2+1),r-x(读、执行)可以用数字5
表示(4+1),---
(无权限)可以用数字0
表示。
# ls -l 查看文件/目录详细信息
[root@master ~]# ls -l work.log
-rw-r--r--. 1 root root 0 Sep 11 23:07 work.log
2.3 设置目录或文件的权限(chmod)
chmod 命令:用来变更文件或目录的权限
命令格式:
- chmod [ugoa] [+-=] [rwx] 文件/目录
- u、g、o、a 分别表示 属主、属组、其他用户、所有用户
- +、-、= 分别表示 增加、去除、设置权限
- chmod nnn 文件/目录
- nnn:3位八进制数
常用命令选项:
- -R:递归修改指定目录下所有子项的权限
# 给属组添加写权限
[root@master ~]# chmod g+w work.log
# 查看详细列表
[root@master ~]# ls -l work.log
-rw-rw-r--. 1 root root 0 Sep 11 23:07 work.log
# 将 work.log 文件,所有用户的权限都添加上
[root@master ~]# chmod 777 work.log
# 查看详细列表
[root@master ~]# ls -l work.log
-rwxrwxrwx. 1 root root 0 Sep 11 23:07 work.log
# 将 data 目录下的所有文件权限设置为744
[root@master ~]# chmod 744 -R data
# 遍历查看 data 目录列表
[root@master ~]# ls -Rl data
data:
total 0
-rwxr--r--. 1 root root 0 Sep 11 23:13 1.txt
-rwxr--r--. 1 root root 0 Sep 11 23:13 2.txt
2.4 设置目录或文件的归属(chown)
chown命令:改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户D,用户组可以是组名或组id。文件名可以使由空格分开的文件列表,在文件名中可以包含通配符。
命令格式:chown 属主:属组 文件/目录
常用命令选项:
- -R:递归修改指定目录下所有文件、子目录的归属
# 查看 work.log 文件的详细信息,发现属主为 root 属组为 root
[root@master ~]# ls -l work.log
-rw-r--r--. 1 root root 0 Sep 12 09:22 work.log
# 更改属主为 exam01
[root@master ~]# chown exam01 work.log
# 查看 work.log 文件的详细信息,发现属主更改为 exam01
[root@master ~]# ls -l work.log
-rw-r--r--. 1 exam01 root 0 Sep 12 09:22 work.log
# 更改属组为 zw01
[root@master ~]# chown :zw01 work.log
# 查看 work.log 文件的详细信息,发现属组更改为 zw01
[root@master ~]# ls -l work.log
-rw-r--r--. 1 exam01 zw01 0 Sep 12 09:22 work.log
# 更改属主和属组分别为 root:root
[root@master ~]# chown root:root work.log
# 查看 work.log 文件的详细信息,发现属主更改为 root 属组更改为 root
[root@master ~]# ls -l work.log
-rw-r--r--. 1 root root 0 Sep 12 09:22 work.log
三、总结
3.1 知识梳理
- 用户账号管理(useradd、passwd、usermod、userdel)
- 组账号管理(groupadd、gpasswd、groupdel)
- 用户账号文件与组账号文件 查询账号相关信息的命令(groups、id、finger、w)
- 设置目录与文件权限(chmod)
- 设置目录与文件归属(chown)