1.Linux系统中的账户
Linux系统中的账户可以分为两大类:系统账户和普通账户。
系统账户是给计算机中各种不同的功能创建的特殊账户,系统上运行的程序通过这些特殊账户来使用计算的各种资源和服务。早期的程序是通过管理员账户(root)来获得计算机的各种服务,为了增加系统的安全性,现在计算机上各种服务都分别创建有相应的系统账户。Linux系统预留了500以下的UID给这些系统账户,普通用户创建账户时,UID的值一般会从500开始,将第一个可用UID分配给这个新创建的账户。
在Linux系统中,文件的属性和权限是和账户ID(UID)相一致的,但我们经常用到的是账户名称。不过没关系,在Linux系统中有一个/etc/passwd文件,该文件记录着账户名、账户ID(UID)和账户的一些其它信息,可以通过访问该文件获取账户的信息。
/etc/passwd
从图中可以看出,文件中每一行记录的是系统中的一个账户。每条记录有7段信息,它们之间用分隔符:断开。每一段信息的含义如下表所示:
记录段 | 记录段含义 |
---|---|
① | 账户名称 |
② | 账户密码,因为/etc/passwd文件经常会被程序访问,为了提高账户的安全性,密码以x代替。账户的密码以加密的形式存储在/etc/passwd文件中 |
③ | 账户的UID(数字形式) |
④ | 账户的初始群组ID(数字形式) |
⑤ | 账户的信息说明栏 |
⑥ | 账户的HOME目录的位置,当登入系统时,账户会根据该信息进入到账户家目录 |
⑦ | 账户的默认shell |
/etc/shadow
为了提高系统的安全性,Linux系统将账户的密码都保存在了另外一个文件/etc/shadow中。只有管理员帐户(root),才能查看这个文件;只有特定的程序(如登陆程序),才能访问该文件。
从图中可以看出,/etc/shadow文件中每一行记录的是系统中的一个账户和对应的密码。每条记录有9个字段信息,它们之间用分隔符:断开。每一段信息的含义如下表所示:
记录段 | 记录段含义 |
---|---|
① | 账户名称 |
② | 账户密码,这是经过加密的账户密码,与账户名相对应 |
③ | 最近更动密码的日期,显示的是自1970.01.01开始,到密码被更动日期的总天数 |
④ | 密码不可被更动的天数,密码更改之后的一段时间内不可再更改密码 |
⑤ | 密码需要重新变更的天数,在不可变更的天数之后,在规定的时间内要重新更改密码 |
⑥ | 密码需要变更期限前的警告期限,在密码到达变更期限前的一段时间内,提醒账户修改密码 |
⑦ | 密码到达变更期限后的恕限时间,在到达变更期限时密码仍然没有被修改,此时账户就要失效。但仍留有恕限期限,在该期限内仍然可以登录账户并修改密码。如果仍不更改的话,账户就要失效了,无法再登录!!! |
⑧ | 账号失效日期,无论对密码有何种设置,到达这个日期时,账号就会失效,无法再登录。显示的是自1970.01.01开始,到密码失效日期的总天数 |
⑨ | 保留,预留给以后的功能使用 |
2.Linux系统中的群组介绍
Linux中记录账户信息的档案是/etc/passwd和/etc/shadow,那么Linux系统中的群组是否也有相应的记录档案呢?没错,当然存在。/etc/group和/etc/gshadow两个文件保存着Linux系统的群组信息。
/etc/group
/etc/group文件记录系统中的群组以及群组对应的GID等信息。每一行就是一条记录,每条记录分为四段,各段之间使用:间隔。各段的含义如下表所示:
记录段 | 记录段含义 |
---|---|
① | 群组名称,初始群组与账户的名称相同 |
② | 群组密码,通常不需要设定。同样,这里的密码被使用字符x代替了,真正的密码在文件/etc/gshadow中 |
③ | 群组的ID(GID值) |
④ | 该群组的组成员列表 |
仔细观察第四个字段,我们可以发现:一个账号可以同时属于多个群组。那么从账号的角度看,这些群组有什么不同呢?还有我们在创建文件时,文件属组是哪一个群组呢?即文件上的属组是怎么确定的呢?
有效群组与初始群组
在图片中我们可以看到,/etc/passwd中有一条Bitter账户的记录。在该记录中,账户Bitter的属组GID为500,对应的群组名称与账户名称相同,都是Bitter,该群组就是账户Bitter的初始群组。而且可以看到,账户Bitter不在群组的成员列表中。
groups命令可以看到当前账户所支持的群组,例如,当前是以root(管理员)账户登陆的系统,该账户是群组root和users的成员。对于属组为root和users的文件,账户root就拥有该文件属组对应的读/写/执行权限。但是,如果一个账户属于多个群组的话,我们创建的文件属组那一栏信息会是哪一个群组呢?答案是,我们新创建文件的属组是账户的有效群组。有效群组就是groups命令列出的第一个群组。
使用newgrp命令可以改变账号的有效群组。newgrp命令会开启一个子shell,在子shell中会以指定的群组作为账户的有效群组,并且在子shell中创建的文件会以指定的群组作为属组。当创建完成后,可以使用exit命令退出子shell,如上图所示。另外,在指定有效群组时,被指定群组需要满足两个要求:
①被指定群组在/etc/gshadow中的密码栏合法(不是以!开头);
②本账户必须要在被指定群组的成员列表中。
/etc/gshadow
/etc/gshadow文件记录系统中的群组以及群组对应的密码等信息。每一行就是一条记录,每条记录分为四段,各段之间使用:间隔。各段的含义如下表所示:
记录段 | 记录段含义 |
---|---|
① | 群组名称 |
② | 加密后的群组密码,开头为!则表示无法登入。但大多数的群组不设置密码,即密码栏为空 |
③ | 群组的管理员账户列表 |
④ | 该群组的组成员列表 |
群组密码栏的主要作用在于,使用newgrp命令,将不属于群组中的成员临时的加入到该群组中,从而使用该群组的功能。
3.Linux系统中账户的创建、修改和删除
管理员(root)账户登陆Linux系统时,可以使用文本编辑器直接对/etc/passwd文件和/etc/shadow文件进行编辑,达到管理账户的目的。但这两个文件很重要,一不留神搞了一些小破话就会使得系统无法读取它的内容,造成用户无法正常登陆的严重后果。因此,对于这两个文件,一般都是使用专门的工具进行修改。
添加新用户:useradd命令
①以useradd带选项方式添加账户
SYNOPSIS:
useradd [-u UID] [-g initial_group] [-G other_group] -[Mm] [-c 说明栏] [-d home] [-s shell] username
OPTIONS:
选项 | 含义 |
---|---|
-u | 给该账号指定一个特定的UID |
-g | 给该账号指定特定的初始群组(initial group) |
-G | 指定该账号可以支持的群组 |
-M | 强制!不给该账号建立使用者家目录;有些Linux发行版在创建账户时会预设创建家目录,可以用该参数取消创建。 |
-m | 强制!给该账号建立使用者家目录;有些Linux发行版在创建账户时预设不创建账户家目录,可以使用该参数强制建立家目录 |
-c | 设定账号的说明内容,保存在账户记录的第五段中 |
-d | 给账号指定家目录 |
-r | 建立系统账号 |
-s | 给账户指定默认的shell |
使用useradd带选项方式创建账户,示例如图所示
②以useradd默认方式添加账户
SYNOPSIS
useradd username
使用useradd默认选项创建账户,示例如图所示
我们以默认方式创建账户时,没有提供任何的参数,这时useradd命令会根据相关档案: /etc/default/useradd、 /etc/login.dfs和/etc/skel/*,来设置账户的基本信息。
/etc/default/useradd
/etc/login.defs
/etc/skel/*
在创建账户时,账户家目录中预存的内容就是/etc/skel目录下的内容,也就是创建用户时,默认创建的账户家目录中的内容是从/etc/skel中复制过来的。所以,当我们对该目录下的内容做一些改动时,这些变动就会被应用到新创建的所有账户中。/etc/skel/下的内容如图所示:
使用passwd命令管理账户密码
我们可以看到,刚刚创建的两个账户BitTest和Bit_Test1,它们在文件/etc/shadow中对应的密码栏为!,表示该账号目前是被封锁的。如果想要能够使用账户,还需要使用passwd命令该账户设置密码。
root账户具有管理员权限,可以修改其他用户的密码,并且对密码格式的要求也非常低,可以不遵守系统中的密码格式要求。但对于普通账户来说,它只能修改自己的密码,并且还需要旧密码的验证。在密码格式上除了需要满足/etc/login.defs中规定的最少字符数的要求,还要通过/etc/pam.d/passwd这个PAM模块的检验。总的来说,普通用户的密码格式最好满足以下要求:
(1)密码不能与账户名相同;
(2)密码尽量不要选择字典中会出现的字符串;
(3)密码需要超过/etc/login.defs设定的最少字符数,通常设置超过8个字符。
另外,passwd命令除了可以设置新创建账户的密码外,也可以结合具体的选项,对账户密码进行管理。
SYNOPSIS:
passwd [-liunxwedfkS–stdin] username
OPTIONS:
选项 | 含义 |
---|---|
-n | 设定密码不可变更天数,/etc/shadow中记录的第四栏信息 |
-x | 密码需要重新变更的天数,/etc/shadow中记录的第五栏信息 |
-w | 设置密码需要变更期限前的警告期限,在密码到达变更期限前一段时间内,提醒账户修改密码,/etc/shadow中记录的第六栏信息 |
-i | 设置密码过期的恕限时间,密码过了需要变更期限而没有重新更改密码,密码已经失效了,但在恕限期限内仍可以使用该账户。如果过了恕限时间,仍然没有更改密码,则密码就会失效,该账户就无法再登录。-1表示超出密码需要重新变更的天数后,账户仍然可以一直使用,/etc/shadow记录中的第七栏信息 |
-e | 强制账户在下次登录时修改密码 |
-l | (L的小写形式)将账号的密码锁住,该账户无法再登录,/etc/shadow中记录的第二栏信息 |
-u | 将账号的密码解锁,/etc/shadow中记录的第二栏信息 |
-d | 将账户的密码删除,账户可用空密码登录系统 |
-f | 强制操作 |
-k | 表示只变更失效密码,如果密码没有失效,则密码不变 |
-S | 查看账户的密码状态,以及密码所采用的加密算法等 |
--stdin | 通过标准输入给账户重新设置密码 |
使用passwd命令管理账户密码,示例如图所示:
使用chage管理账户密码
SYNOPSIS:
chage [dEmMWIl] username
OPTIONS:
选项 | 含义 |
---|---|
-d | 设置最后一次变更密码的日期,可以使用距1970.01.01的总天数指定日期,也可以使用”YY-MM-DD”的形式指定日期。设置为0,则代表下次登录强制修改密码,/etc/shadow记录的第三字段信息 |
-E | 以”YY-MM-DD”的形式指定账户的失效日期,0表示立即失效,-1表示账户永远不失效,/etc/shadow记录的第八字段信息 |
-m | 设定密码不可变更天数,0地表任何时候都可以更改密码,/etc/shadow记录的第四字段信息 |
-M | 密码需要重新变更的天数,需要在规定的时间内变更密码,不然密码会失效。将天数设置为99999的话,差不多会有270多年,基本上代表密码不会失效,/etc/shadow记录中第五字段信息 |
-W | 设置密码需要变更期限前的警告期限,在密码到期前规定的天数内给账户发出警告,/etc/shadow记录中的第六字段信息 |
-I | (i的大写形式)设置密码过期的恕限时间,账户过了需要更改期限没有重新更改密码,密码就会失效,但在恕限期限内仍可以使用该账户。如果过了恕限时间,仍然没有更改密码,则密码就失效,账户无法再登录。-1表示密码失效后,账户仍然可以一直使用,/etc/shadow记录中的第七字段数据 |
-l | (L的小写形式)查看帐户的密码状态 |
使用chage命令管理账户密码,示例如图所示:
修改账户:usermod命令
如果需要对系统中的账户信息进行修改,有两种方式:在root权限下使用文本编辑器直接对/etc/passwd、 /etc/shadow 等文件进行修改;或者使用usermod命令对文件进行修改。为了避免因一些失误对系统造成不可挽回的损失,建议使用第二种方法对账户信息进行修改。
使用usermod命令对账户进行修改
SYNOPSIS:
usermod [-cdegGlsuLU] username
OPTIONS:
选项 | 含义 |
---|---|
-c | 修改账户说明栏信息 |
-d | 修改账户的家目录 |
-e | 以”YY-MM-DD”的格式修改账户的有效日期(/etc/shadow中第八个字段的内容) |
-g | 修改账户的初始属组(/etc/passwd中账户记录的第四个字段的内容) |
-G | 修改该账户所属的群组 |
-l | (L的小写形式)修改账号的名称 |
-s | 修改账户的默认shell |
-u | 修改账户的UID |
-L | 暂时将账户的密码锁住 |
-U | 将账户解锁 |
使用usermod命令修改账户,示例如图所示:
删除账户,userdel指令
SYNOPSIS:
userdel [-r] username
OPTIONS:
-r:将账户的家目录一同删除;
使用userdel命令删除账户,示例如图所示:
以普通账户身份进行账户管理
上面介绍的账户管理命令:useradd、usermod和userdel等,只有管理员(root)账户才能够使用。普通账户可以使用的命令有chsh、chfn、finger等。
使用chsh命令改变账户的默认shell
SYNOPSIS:
chsh –l username:查看系统可用shell(/etc/shells中的内容,且参数为L的小写形式)
chsh –s shell的绝对路径 username:修改账户username的默认shell
使用chsh命令改变账户的默认shell,示例如图所示:
使用chfn命令添加账户基本说明信息,并使用finger查看
SYNOPSIS:
chfn [-foph] username
OPTIONS:
-f:所希望的账户名信息Name
-o:办公室住址Office
-p:办公室电话号
-h:家中的电话号
使用chfn命令添加账户基本说明信息,示例如图所示:
4.系统中组的创建、删除和修改
添加群组:groupadd命令
SYNOPSIS:
groupadd [-g gid][-r] groupname
OPTIONS:
选项 | 含义 |
---|---|
-g | 给群组指定GID |
-r | 建立系统群组 |
使用groupadd命令添加群组,如图所示:
修改群组:groupmod命令
SYNOPSIS:
groupmod [-g gid] [-n groupname] groupname
OPTIONS:
选项 | 含义 |
---|---|
-g | 修改群组的GID |
-n | 修改群组名称 |
使用groupmod命令修改群组,如图所示:
使用gpasswd命令设置群组密码、添加群组管理员账户
SYNOPSIS1:
gpasswd groupname :给groupname群组设置密码;
SYNOPSIS2:
gpasswd [-rR] groupname
OPTIONS:
选项 | 含义 |
---|---|
-r | 将groupname 密码移除,可以无密码登入 |
-R | 使groupname密码失效 |
SYNOPSIS3:
gpasswd [-A user1,user2,…] [-M user3,user4,…] groupname
OPTIONS:
选项 | 含义 |
---|---|
-A | 给群组设置管理员 |
-M | 给群组添加账户成员 |
使用gpasswd命令设置群组密码、添加群组管理员账户,如图所示:
5.改变文件属性(改变文件属主、属组)
知道了Linux系统中的账户和群组的概念,文件的属主和属组的概念也就不难理解了。在使用Linux系统的时候,还经常遇到一个问题:文件属主和属组的变更问题。比如说,我们从别的用户那儿拷贝了一份很重要的文件,但由于文件的属主是别的用户,所以我们可能无法拥有这个文件的所有权限。这时,我们就需要变更文件的属主,以获得该文件的所有权限。
变更文件所属群组:chgrp命令
SYNOPSIS:
chgrp [-R] groupname dirname/username
OPTIONS:
-R:进行递归的持续变更,会将目录、目录下的所有文件包括次目录和次目录下所有文件的属组都更改为指定的群组。
使用chgrp命令改变文件或目录的属组,如下图所示:
变更文件的属主:chown命令
SYNOPSIS:
chown [-R] username dirname/filename
chown [-R] username[:groupname] dirname/filename
chown [-R] username[.groupname] dirname/filename
使用chown命令改变文件或目录属主,如下图所示: