文章目录

  • 1.Linux的账号和用户组
  • 1.1 用户标识符:UID与GID
  • 1.2 用户账号
  • 1.2.1 登录系统流程
  • 1.2.2 /etc/passwd文件结构
  • 1.3 初始与有效用户组
  • 1.3.1 /etc/group文件结构
  • 1.3.2 初始与有效用户组
  • 2.账号管理
  • 2.1 用户增加、删除、修改
  • 2.1.1 useradd
  • 2.1.2 passwd
  • 2.1.3 usermod
  • 2.1.4 userdel
  • 2.2 用户功能
  • 2.3 用户组添加、删除
  • 3.用户身份切换
  • 3.1 su
  • 3.2 sudo
  • 4.特殊的shell---/sbin/nologin


1.Linux的账号和用户组

之前的文章说到了,Linux是一个多用户、多任务的操作系统,为了防止不同用户之间文件的安全问题,Linux系统加入了文件权限管理的功能,那对于这么多用户来说,Linux系统中账号管理也就变得相当重要了。

1.1 用户标识符:UID与GID

在说明如何对账号进行添加、修改之前,我们先来说明一下,Linux系统是如何从众多的账号之中,辨别出你的那个账号。

当我们登录系统时,输入用户名,而对于主机来说,是不会识别用户名的,计算机对数字比较敏感一些,它会拿着用户名去/etc/passwd中查看你的ID,从而判断出你到底是不是你?

每个登录的用户至少都会取得两个ID,一个是用户ID(UID),一个是用户组ID(GID),我们在前面学到文件都具有文件所有者用户组的属性,其实就是因为,每一个文件都具有UIDGID两个ID,当我们要查看文件的属性的时候,系统就会拿着这两个ID去查看/etc/passwd/etc/group,找到ID对应的名称然后显示出来。

以上就是用户的标识符UIDGID的概念

1.2 用户账号

1.2.1 登录系统流程

既然已经了解用户的UIDGID的概念,下面就说明一下,当我们登录shell时,系统都做了什么事情

  • 我们向bash中输入账号和密码
  • 系统拿着账号去查阅/etc/passwd,当账号不存在文件中,则跳出;若存在,则将账号的UIDGID读出,同时获取的还有账号的主文件夹和shell设置。
  • 接下来,系统会进入/etc/shadow找到对应的账号和UID,然后核对前面输入的密码和保存的密码是否一致
  • 如果密码核对成功,则获取shell,进入系统。

从上面的流程我们知道,跟用户账号有关的两个重要文件

  1. /etc/passwd:管理用户UID/GID等参数
  2. /etc/shadow:专门管理密码相关数据
1.2.2 /etc/passwd文件结构

文件中,每一行代表一个账号的相关信息,而每一行的各个字段使用:作为分隔符;同时需要注意的是,文件里面的很多账号本来就是系统正常运行所必须要的,可以叫它系统账号(例如bin、darmon等),这些账号请不要删除噢!

为了记录清楚/etc/shadow文件的结构,我列出了我系统中hadoop这个用户在文件中存储的示范。

[root@wing ~]# grep hadoop /etc/passwd
hadoop : x : 1000 : 0 : : /home/hadoop : /bin/bash
#[1]    [2]   [3]  [4][5]  [6]           [7]
  • [1]:账号名称
  • [2]:密码;这一个字段需要特别的说明一下,早期的密码就放在这个字段上面,然而这个文件的特性是所有文件都能够读取,为了账号密码的安全性,后期将账号的密码放到/etc/shadow中去,此处就用x代替了。
  • [3]:UID
  • [4]:GID
  • [5]:用户信息说明列
  • [6]:主文件夹;当你登录之后,就会进入用户对应的主文件夹中去
  • [7]:Shell;当用户登录系统后就会取得一个Shell来与系统的内核通信以进行用户的操作任务。而登录之后的默认Shell就是由这一个字段决定的。有一个Shell可以用来替代成让账号无法取得Shell环境的登录操作,这就是特殊的 /sbin/nologin,这个我们最后再来简单介绍。

1.3 初始与有效用户组

1.3.1 /etc/group文件结构

在前面介绍了GID这一个属性,然而还没有具体的介绍用户组的配置文件,现在就来说说这一个文件—/etc/group

/etc/group在这个文件中,一行代表一个用户组,同时各行使用作为各个字段的分隔符(共分为4个字段)。

[root@wing ~]# head -n 4 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
  • [1]:用户组名称
  • [2]:用户组密码
  • [3]:GID
  • [4]:此用户组支持的账号名称

这里提出一个问题:一个账号可以属于多个用户组,那么当执行命令的时候,应该以哪一个用户组为准呢?(如创建文件)这就需要提出初始用户组和有效用户组的概念了。

1.3.2 初始与有效用户组
  • 每个用户都有一个GID的属性,这就是用户的初始用户组,当用户登录以后,就自动拥有这个用户组的相关权限,因此,这个用户也就不用再/etc/group的第四列中写入。
  • 非初始用户组就需要在/etc/group中对应的用户组行中,将用户名写入第四列中,这样才能给该用户加入指定用户组的支持。

有一个账号Test,同时属于用户组A和用户组B,当你新建一个文件,这个文件属于哪一个用户组,这就取决于用户此时的有效用户组是哪一个了!

  • group:有效与支持用户组的查看:第一个输出的用户组就是有效用户组
  • newgrp:有效用户组的切换:切换的用户组必须是你已经有支持的用户组,它切换用户组的同时,是使用另外一个shell来登录,这一点需要注意!

2.账号管理

2.1 用户增加、删除、修改

2.1.1 useradd

在Linux系统添加一个用户

[root@wing ~]# useradd [-u UID] [-g 初始用户组] [-G 次要用户组] [-mM] [-c 说明栏] [-d 主文件夹绝对路径] 用户名
# -u :给该用户指定UID
# -g :指定用户组名(即初始用户组)
# -G :后接组名,表示该用户还可以被该用户组支持
# -M :不创建用户主文件夹(系统账号默认值)
# -m :创建用户主文件夹(一般账号默认值)
# -c :/etc/passwd第五列的说明内容
# -d :指定某个目录为主文件夹
# -r :表明创建一个系统账号
# -s :shell设置信息,默认为/bin/bash

[root@wing ~]# useradd test     #完全参考默认值创建一个用户
  • 当我们什么参数都不加时创建一个用户,此时会默认创建一个用户主文件夹,权限为700
  • 同时会创建一个与账号一模一样的用户组名
  • 由于系统账号主要是用来进行运行系统所需服务的权限设置,所以系统账号默认都不会主动创建主文件夹的
2.1.2 passwd
[root@wing ~]# passwd [-l] [-u] [--stdin] [-S] 用户名
# --stdin :可以通过来自前一个管道的数据,作为密码输入!
# -l :表示Lock,会将/etc/shadow第二列前加上“!”,使密码失效
# -u :表示Unlock
# -S :列出密码相关参数

[root@wing ~]# passwd test     #修改用户密码
  • 这里需要特别说明--stdin这个参数,下面这个操作可以直接更新用户的密码而不用再次手动输入!
  • 第三个个命令可以让用户第一次登陆时,强制用户更改他们账号的密码之后才可以使用系统的资源
[root@wing ~]# useradd test                          #添加一个test用户
[root@wing ~]# echo "abc123" | passwd --stdin test   #将test用户的密码设置为“abc123”
[root@wing ~]# chage -d 0 test                       #这一个命令可以让用户第一次登陆时,强制用户更改他们账号的密码之后才可以使用系统的资源!
2.1.3 usermod

我们在创建用户的时候,可能会设置错用户的参数,所以就会需要使用usermod这个命令来修改

[root@wing ~]# usermod [-cdegGlsuLU] 用户名
# -c :/etc/passwd第五列的说明内容
# -d :指定某个目录为主文件夹
# -g :指定用户组名(即初始用户组)
# -G :后接次要用户组,表示该用户还可以被该用户组支持
# -a :与 -G 合用可增加次要用户组的支持而非设置
# -l :后面接账户名称,修改用户名称
# -s :shell设置信息,默认为/bin/bash
# -L :暂时将用户的密码冻结,使其不能登录
# -U :将 /etc/shadow 密码列 !去掉
2.1.4 userdel

删除指定的用户

[root@wing ~]# userdel [-r] username
#-r : 连同用户的主文件夹一起删除

2.2 用户功能

  • id:用来查看用户或自己相关的UID、GID信息
[hadoop@wing ~]$ id
uid=1000(hadoop) gid=0(root) groups=0(root)

2.3 用户组添加、删除

  • groupadd: 添加用户组
  • groupmod:修改用户组信息(-n:后接组名,修改用户组名字)
  • groupdel:删除用户组

3.用户身份切换

3.1 su

1.为了防止用户平时使用系统时发生误操作,所以平时系统操作时,最好使用一般账号
2.为了系统安全,有些时候我们需要使用系统账号来启动一些系统服务(如http服务),防止该服务被攻破时,系统不至于损坏。

  • su:进行身份的切换
  • 单纯使用su切换root身份,读取的变量设置方式为non-login shell的方式,这种方式下很多原本的变量不会被改变。
[root@wing ~]# su [-] [用户名]
# - :单纯使用“-”,如“su -”代表使用login-shell的变量文件读取方式来登录系统,若用户名称没有加上去,则代表切换为root用户

3.2 sudo

使用su命令切换成用户时,需要输如该用户对应的密码,而使用sudo命令时,只需要使用自己的密码就可以切换了。这与/etc/sudoers文件相关

  • 使用户加入sudo权限
  1. visudo:/etc/sudoers这个文件是有特定的格式的,所以需要使用这个命令来进行更改
root    All=(All)   All
hadoop  All=(All)   All #这是新增的支持sudo命令的用户

%test   All=(All)   All #这是新增的支持sudo命令的用户组(%表示用户组)

4.特殊的shell—/sbin/nologin

我们前面说到对系统的各种操作,都是基于用户登录进系统之后的,而有一些服务我们并不希望它能登录系统(如ftp服务),尤其是系统账号,它们使用的shell就是/sbin/nologin
这里的无法登录指的仅是这个用户无法使用bash或者其他的shell来登录系统而已,并不是说这个账号就无法使用其他的系统资源。