多用户多任务管理
Linux 操作系统是多用户的操作系统,它允许多个用户同时登录到系统上,使用系统资源。
账户实质上就是一个用户在系统上的标识,系统依据账户 ID 来区分每个用户的文件、进程、任务,给每个用户提供特定的工作环境(如用户的工作目录、Shell 版本以及 X Window 环境的配置等),使每个用户的工作都能独立不受干扰地进行。
Linux 系统下普通用户账户和超级用户账户(或管理员账户)这两种账户类型。管理员账户对系统具有绝对的控制权,能够对系统进行一切操作。
Linux 下还存在组账户(简称组)。组是用户的集合。在 RHEL/CentOS 中组有两种类型:私有组和标准组。当创建一个新用户时,若没有指定其所属的组,RHEL/CentOS 就建立一个和该用户同名的私有组,此私有组中只包含这个用户自己。标准组可以包含多个用户,若使用标准组,在创建一个新的用户时就应该指定其所属的组。
Linux 环境下的账户系统文件
Linux 下的账户系统文件主要有 /etc/passwd 、/etc/shadow、/etc/group 和 /etc/gshadow 4 个文件。
/etc/passwd文件中每行定义一个用户账号,一行中又划分为多个字段定义用户账号的不同属性,各字段间用“:”分隔。bashkorruz@2a6000:~$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologinkorruz@2a6000:~$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin
/etc/shadow文件只对 root 用户可读且提供了一些口令时效字段。bashkorruz@2a6000:~$ sudo cat /etc/shadow [sudo] korruz 的密码: root:!:19594:0:99999:7::: daemon:*:19101:0:99999:7::: bin:*:19101:0:99999:7::: sys:*:19101:0:99999:7::: sync:*:19101:0:99999:7::: games:*:19101:0:99999:7::: ps:$y$j9T$2Mv6q1INVnEiicy0xFcHP.$Ng9iGcQGN5brHUX3cieYCxXbBYqofPAJqNna3000000:19655:0:99999:7:::korruz@2a6000:~$ sudo cat /etc/shadow [sudo] korruz 的密码: root:!:19594:0:99999:7::: daemon:*:19101:0:99999:7::: bin:*:19101:0:99999:7::: sys:*:19101:0:99999:7::: sync:*:19101:0:99999:7::: games:*:19101:0:99999:7::: ps:$y$j9T$2Mv6q1INVnEiicy0xFcHP.$Ng9iGcQGN5brHUX3cieYCxXbBYqofPAJqNna3000000:19655:0:99999:7:::

/etc/group文件记录的是用户所属的主组,也就是登录时所属的主组,而其他组称为附加组。bashkorruz@2a6000:~$ cat /etc/group root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog,ps tty:x:5:korruz@2a6000:~$ cat /etc/group root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog,ps tty:x:5:
/etc/gshadow文件用于定义用户组口令、组管理员等信息,该文件只有 root 用户可以读取。bashkorruz@2a6000:~$ sudo cat /etc/gshadow [sudo] korruz 的密码: root:*:: daemon:*:: bin:*:: sys:*:: adm:*::syslog,pskorruz@2a6000:~$ sudo cat /etc/gshadow [sudo] korruz 的密码: root:*:: daemon:*:: bin:*:: sys:*:: adm:*::syslog,ps
使用命令行工具管理账户


口令管理和口令时效
使用 passwd 命令进行口令管理
bashpasswd [选项] [用户名]passwd [选项] [用户名]
WARNING
在输入口令时,屏幕上不会回显。口令的选取至少用 8 个字符,最好大小写字母和数字及特殊字符搭配使用,尽量不要用英文单词作为口令。
只有管理员账户(root)可以更改其他用户的口令,普通用户只能更改自己的口令,且在更改口令之前,系统会要求用户输入旧的口令。
chage 命令
为安全起见,要求用户定期改变用户口令是明智之举。
在 Linux 系统上,修改口令时效分为:
对于未来要创建的所有用户的口令时效需修改/etc/login.defs 文件的相关参数。
/etc/login.defs中与口令时效相关的参数如下表:
对已存在的用户修改口令时效是通过 chage 命令来管理。
change 命令的语法格式如下:
bashchage [选项] 用户名chage [选项] 用户名
WARNING
chage 命令仅适用于本地系统账户,对 LDAP 账户和数据库账户不起作用。
用户和组状态

权限管理
在 Linux 中,将使用系统资源的人员分为 4 类:超级用户、文件或目录的属主、属主的同组人和世界上的其他人员。
基本的访问权限
下面是文件或目录的 3 种基本的访问权限: 
INFO
- 目录上只有执行权限,表示可以进入或穿越该目录进入更深层次的子目录,但是要访问该目录下的有读权限的文件,必须知道文件名。
- 目录上只有执行权限,不能列出目录列表也不能删除该目录。
- 目录上执行权限和读权限的组合,表示可以进入目录并列出目录列表。
- 目录上执行权限和写权限的组合,表示可以在目录中创建、删除和重命名文件。
查看文件和目录的权限
在 Linux 中通过给 3 类用户分配 3 种基本权限,就产生了文件或目录的 9 个基本权限位可以使用带 l 参数的 ls 命令查看文件或目录的权限。
权限字符串举例: 
更改操作权限
文字设定法
chmod 命令的语法格式如下:
bashchmod [用户][权限操作][分配权限] [文件或目录] chmod [ugoa][+-=][rwxugo] [文件或目录]chmod [用户][权限操作][分配权限] [文件或目录] chmod [ugoa][+-=][rwxugo] [文件或目录]用户 选项说明:

权限操作 选项说明

分配权限 选项说明

数值设定法
chmod 命令的语法格式如下:
bashchmod [权限数字] [文件或目录]chmod [权限数字] [文件或目录]权限字符说明:

更改属主和同组人
chown 命令的语法格式如下:
chown [选项] 属主[:同组人] 文件或目录chown [选项] 属主[:同组人] 文件或目录chown 命令使用举例: 
设置文件和目录的生成掩码
用户可以使用 umask 命令设置文件的默认生成掩码。默认的生成掩码告诉系统当创建一个文件或目录时不应该赋予其哪些权限。如果用户将 umask 命令放在环境文件.bash_profile)中,就可以控制所有新建的文件或目录的访问权限。
umask 命令的语法格式如下:
umask [权限数字]umask [权限数字]umask 命令使用举例: 

WARNING
如果你设置 umask 为 022,那么新创建的文件的默认权限将是 755(即,rwxr-xr-x),新创建的目录的默认权限将是 644(即,rw-r--r--)。这是因为文件的最大默认权限是 666,目录的最大默认权限是 777,umask 的值实际上是从这两个值中减去的。
具体计算方式如下:
- 对于文件:666 - 022 = 644,也就是 -rw-r--r--
- 对于目录:777 - 022 = 755,也就是 -rwxr-xr-x
特殊权限设置
SUID、SGID 和 sticky-bit 3 个特殊权限位是对可执行文件或目录进行的,使用了特殊权限将影响执行者的操作权限。对文件可以设置 SUID 和 SGID 特殊权限;对目录可以设置 SGID 和 sticky-bit 特殊权限。
文件的特殊权限说明:

目录的特殊权限说明

SUID、SGID 和 sticky-bit 的表示方法
SUID 是占用属主的 x 位置来表示的;SGID 是占用组的 x 位置来表示的;sticky-bit 是占用其他人的 x 位置来表示的。

设置特殊权限
设置特殊权限仍旧使用 chmod 命令,并且依然有字符设定法和数值设定法之分。
- 使用 chmod 命令的字符设定法时,可以使用 s 和 t 权限字符。
- 使用 chmod 命令的数值设定法时,要使用 4 位八进制数值,其中第 1 位八进制数用于设置特殊权限,后 3 位八进制数用于设置基本权限。

使用 ACL 权限
传统的 UNIX/Linux 使用 UGO 方式设置权限,具体地说就是通过 user(用户)、group 组)、other(其他人)与 r(读)、w(写)、x(执行)的不同组合来实现的。随着应用的发展,这些权限组合已不能适应现时复杂的文件系统权限控制要求,具有一定的局限性。
常见的局限就是:无法给不属于同一组的用户授予单独访问权限,如果授予了,那么其他组的其他用户也会拥有相同的权限。
ACL 就是访问控制列表(Access Control List),为了与其他的 ACL 相区别,有时也称文件访问控制列表(FACL)。一个文件/目录的访问控制列表,可以针对任意指定的用户/组分配 RWX 权限。
Linux 从 2.6 版内核开始支持 ACL。不是所有类型的文件系统均支持 ACL,但 Linux 2.6 内核配合常用的 ext2/ext3/ext4、jfs、xfs、ReiserFS 等文件系统,都可以支持 ACL。CentOS 7 默认支持 ACL。
有两种类型的 ACL:
- 一种是存取 ACL (access ACLs),针对文件和目录设置访问控制列表。
- 一种是默认 ACL (default ACLs),只能针对目录设置。如果目录中的文件没有设置
使用 setfacl 设置 ACL 权限
bashsetfacl [选项] [文件或目录]setfacl [选项] [文件或目录]setfacl 命令的选项说明:

使用 setfacl 命令设置 ACL 权限的举例:

使用 getfacl 查看 ACL 权限
bashgetfacl [文件或目录]getfacl [文件或目录]使用 getfacl 命令查看 ACL 权限的举例:

WARNING
- 若目录已设置了默认 ACL,则新创建的文件将从其目录继承默认 ACL 设置
- 使用 mv 命令和 cp-p 命令操作文件时将保持 ACL 设置。
进程管理
进程概述
进程(Process)是一个程序在其自身的虚拟地址空间中的一次执行活动。
INFO
进程和程序的概念不同,下面是对这两个概念的比较。
- 程序只是一个静态的指令集合;而进程是一个程序的动态执行过程,具有生命期,是动态地产生和消亡的。
- 进程是资源申请、调度和独立运行的单位,因此使用系统中的运行资源;而程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位,因此不占用系统的运行资源。
- 程序和进程无一一对应的关系。一方面一个程序可以由多个进程所共用,即一个程序在运行过程中可以产生多个进程;另一方面,一个进程在生命期内可以顺序地执行若干个程序。
在 Linux 系统中总是有很多进程同时在运行,每一个进程都有一个识别号,叫作 PID (Process ID),用于与其他进程区别。系统启动后的第一个进程是 systemd,其 PID 是 1。systemd 是唯一一个由系统内核直接运行的进程。新的进程可以用系统调用 fork 来产生,就是从一个已经存在的进程中派生出一个新进程,旧的进程是新产生的进程的父进程,新进程是产生它的进程的子进程。
当系统启动以后,systemd 进程会创建 login 进程等待用户登录系统,login 进程是 systemd 进程的子进程。当用户登录系统后,login 进程就会为用户启动 Shell 进程,Shell 进程就是 login 进程的子进程,而此后用户运行的进程都是由 Shell 衍生出来的。
除了进程识别号 (PID) 外,在进程控制块(PCB)中每个进程还有另外 4 个与用户和组相关的识别号。它们是实际用户识别号(real user ID,RUID)、实际组识别号(real group ID,RGID)、有效用户识别号(effect user ID,EUID)和有效组识别号(effect group ID,EGID)。
RUID 和 RGID 的作用是识别正在运行此进程的用户和组。一个进程的 RUID 和 RGID 就是运行此进程的用户的 UID 和 GID。EUID 和 EGID 的作用是确定一个进程对其访问的文件的权限和优先权。
查看进程
获取进程信息的命令: 
ps 命令的语法格式如下:
ps [选项]ps [选项]ps 命令的选项说明: 
ps 命令输出的重要信息的含义: 
ps 命令的使用举例: 
INFO
- ps 命令的输出结果中,UID 和 PID 是每个进程的必有字段,其他字段都是可选字段。
- ps 命令的输出结果中,UID 是进程的实际用户识别号,PID 是进程的识别号,PPID 是父进程的识别号,C 是进程的 CPU 使用率,STIME 是进程的启动时间,TTY 是进程的终端,TIME 是进程的累计 CPU 使用时间,CMD 是进程的命令。
杀死进程
进程信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。进程信号是最基本的进程间通信方式:可以在进程之间直接发送,而不需要用户界面;可以在 Shell 中通过 kill 命令发送给进程。
发送进程信号的命令: 
例如,要强制杀死一个进程,可以使用 SIGKILL 信号:
kill -9 PIDkill -9 PID