Linux 系统是一个多用户多任务的分时操做系统,任何一个要使用系统资源的用户,都必需要拥有一个帐号进入系统。帐号实质上就是一个用户在系统上的标识,系统根据该标识分配不一样的权限和资源。一个帐号包含用户和用户组两部分。shell
用户分类:安全
超级管理员
:具备操做系统的一切权限,UID 为 0 。通常是 "root"用户,不建议一个系统有多个超级用户系统用户(伪用户)
:方便系统管理,用来运行系统和服务的用户,没有密码不能登陆,UID在 1 - 499 之间。好比有些服务不但愿使用 root 的身份去执行,而是但愿使用权限更小的帐号去执行,因此咱们就得要提供这些运做程序的拥有者普通用户
:可登入用户,拥有系统部分权限的用户,UID 从 500 开始。用户组分类:bash
初始组
:用户刚登陆入系统就所在的组,用户的必需要有一个初始组且只能有一个,通常初始组名和用户名相同附加组
:用户除了初始组外加入的其余组,每一个用户能够拥有0或多个附加组用户信息文件:/etc/passwd服务器
root:x:0:0:root:/root:/bin/bash
"第 3 列:用户ID,即 UID网络
0 (超级管理员)
:当 UID 为 0 时,表明该用户是超级管理员。因此当你要让其余的用户名称也具备 root 的权限时,将该用户的 UID 改成 0 便可,也就是说一个系统上超级管理员不见得就是 root,很不建议有多个用户的 UID 是 01 - 499 (系统用户)
:这些 UID 是保留给系统用户的 UID,也就是说 UID 在 1 - 499 范围的用户是不能登陆的,只能用来运行系统或者服务。其中,UID 1 - 99 是系统自动建立帐号时使用的; UID 100 - 499 是用户有建立系统帐号需求时使用的500 - 60000 (普通用户)
:普通用户UID。实际上Linux 2.6.x 内核之后能够支持 2^32-1 这么多了用户密码文件:/etc/shadowui
root:$6$jOouAVJYJ5Ys2U1q$5j..L0vQV8W2ih8M2AK50PFhHJfJRUMIyMLkZuCezV6HOoX4Zls3yH7JdJlAPz6bp3DaKNhVh4ewXzxTivRC9/:18020:0:99999:7:::
!!
" 或者 "*
",表明没有密码不能登陆,系统用户就是 "!!
" 或者 "*
"第 3 列:密码最近一次改动日期。值是以 1970 年 1 月 1 日做为 1 而累加得来得天数加密
date -d "1970-01-01 18020 days"
echo $(($(date --date="2019/05/04" +%s)/86400+1))
用户组文件:/etc/group操作系统
root:x:0:
root:x:0:user1,user2
"用户组密码文件:/etc/gshadow设计
用户家目录日志
用户邮箱
用户模板文件:/etc/skel/
上面介绍了用户和用户组相关的文件,那么用户登陆系统的过程,是如何涉及到这些文件的呢?当你输入用户名和密码后,系统大体作了以下几步处理:
命令格式:useradd [选项] 用户名
选项:
-u 用户ID
:指定用户ID。通常指定 UID 要大于500,若是没有特殊需求尽可能不要指定,由系统自动分配便可-g 初始组名
:指定用户所属初始组。尽可能不要指定,系统会自动建立一个和新增用户名相同的组最为该新增用户的初始组-G 附加组名
:指定用户所属附加组。若是要指定多个附加组,组名用 "," 隔开-c 说明文字
:加上备注文字。备注文字会保存在 "/etc/passwd" 文件的第 5 列-d 家目录
:指定用户家目录-s shell
:指定用户登入后所使用的 shell 程序刚添加成功的用户没有密码(此时该用户的密码是 "!!
" ),还不能用于登陆系统,须要经过 "passwd
" 命令设置密码后才能登陆。固然,"passwd
" 命令也能用来修改已存在的用户密码,以及管理用户密码有效时间等。
命令格式:passwd [选项] [用户名]
选项:
-l
或 --lock
:临时锁住密码使密码失效。即把 "/etc/shadow" 第二列密文密码前面多加个 "!!"-u
或 --unlock
:解开已锁住的用户密码。相对于 -l
的反向操做-d
或 --delete
:删除现有用户的密码-n 天数
:两次密码修改时间间隔。对应"/etc/shadow" 第 4 列-x 天数
:密码有效期。对应"/etc/shadow" 第 5 列。-w 天数
:密码到期前的警告天数。对应"/etc/shadow" 第 6 列-i 天数
:密码到期后的宽限天数。对应"/etc/shadow" 第 7 列-S
或 --status
:显示用户密码状态--stdin
:从标准输入读取令牌。主要用在经过脚本批量添加用户,不须要交互的场景
echo "123456" | passwd --stdin user1
。尽可能不要在shell里这样操做,history
会记录执行过的历史命令,设置的密码可能不被泄露用户名
:用户名省略,默认修改当前登陆用户的密码。通常用户修改本身的密码直接执行 "passwd
" 便可注意:只有管理者才能修改其余用户的密码,普通用户只能修改本身的密码
命令格式:usermod [选项] 用户名
选项:
-u 用户ID
:修改用户ID-d 家目录
:修改用户家目录-c 用户说明
:修改用户说明-g 初始组名
:修改用户初始组-G 附加组名
:修改用户附加组-s shell
:修改用户登入后所使用的 shell 程序-e 日期
:修改帐号失效日期,格式是 "YYYY-MM-DD"。即修改 /etc/shadow 第 8 列数据-l 新用户名
:修改用户名-L
:临时锁定帐号。与 "passwd -l 用户名
" 做用同样-U
:解锁帐号命令格式:userdel [选项] 用户名
选项:
-r
:同时删除用户家目录和用户邮件命令格式:groupadd [选项] 组名
选项:
-g 组ID
:指定组ID-r
:建立系统用户组,系统用户组的组ID小于500。与 /etc/login.defs 内的 GID_MIN 有关命令格式:groupmod [选项] 组名
选项:
-g 组ID
:修改组ID-n 新组名
:修改组名命令格式:groupdel 组名
注意:若是用户组是某个用户的初始组,必须先删除这个用户或者修改该用户的GID后,才能删除该用户组
若是用户 user1 有个多个用户组(初始组:user1,附加组:group1,group2),则登陆后默认的有效组是该用户的初始组user1,此时该用户建立的文件所属组就是 user1,若是让该用户建立的文件所属组为 group1,就须要使用 "newgrp
" 命令切换有效组为 group1
命令格式:newgrp 组名
若是管理员太忙了,能够为某个用户组设置一个管理员来帮忙管理该组成员用户。 通常组密码和组管理员功能其实不多使用了,彻底能够由 "sudo
" 取代。
命令格式:gpasswd [选项] 组名
选项:
-a 用户名
:添加用户到该组-d 用户名
:从组中删除某个用户-A 用户1,用户2,...
:添加组管理员列表-M 用户1,用户2,...
:添加组成员列表。注意,-a
是追加,-M
是会覆盖原有值-r
:删除组密码-R
:使组密码失效gpasswd 组名
:设置用户组密码
注意:若是某个用户组设置了组密码,就表明容许非该组内的用户能够经过 "
newgrp
" 命令(会提示输入密码),切换有效组为该组。至关于把非该组内的用户临时添加到了该组,只是临时生效,并无修改 "/etc/group" 和 "/etc/gshadow" 文件
命令格式:id [选项] [用户名]
选项:通常使用不加任何选项,
-g
:仅显示该用户当前有效的用户组ID-G
:显示该用户全部用户组ID-u
:仅显示该用户ID-Z
:仅显示当前用户的安全环境该命令使用通常不加任何选项,基本能输出全部要查询的信息。例如直接执行 "id
" 或 "id root
"
命令格式:groups [用户1] [用户2] ...
groups
",表明查询当前进程用户查询出来的第一个组是当前有效组
命令格式:whoami
w
和 who
命令做用类似都是显示系统中正在登陆的用户信息,这两个命令查询信息都来源于日志文件 "/var/run/utmp"。
w 命令格式:w [选项] [用户名]
选项:
-h
:不打印头信息-u
:当显示当前进程和cpu时间时忽略用户名-s
:使用短输出格式-f
:显示用户从哪登陆-i
:登陆来源展现ip地址而不是主机名示例:
[root@localhost ~]# w 18:31:08 up 1 day, 16 min, 3 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 - Sat18 49:23 0.07s 0.07s -bash root pts/0 192.168.199.119 18:22 8:17 0.02s 0.02s -bash root pts/1 192.168.199.119 18:22 0.00s 0.03s 0.00s w
输出内容说明:
第一行内容:
第二行内容:
who 命令格式:who [选项] [查询文件]
选项:
-H
:显示各栏位的标题信息列-q
:只显示登入系统的账号名称和总人数-w
:显示用户的信息状态栏-u
:显示闲置时间,若该用户在前一分钟以内有进行任何动做,将标示成"."号,若是该用户已超过24小时没有任何动做,则标示出"old"字符串命令格式:chsh [选项] [用户名]
选项:
-l
:列出目前系统全部可用shell。其实就是输出 "/etc/shells" 文件内容-s 新shell程序
:指定要设定的shell。其实就是修改上面说到的 "/etc/passwd" 文件的第 7 列数据useradd
命令添加用户时,有些选项若是不指定的话都会有默认值,好比家目录。添加用户时默认值的参考文件主要有两个,分别是 "/etc/default/useradd" 和 "/etc/login.defs",下面对文件内容一一进行说明
/etc/default/useradd 文件,内容以下:
[root@localhost ~]# cat /etc/default/useradd # useradd defaults file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes
GROUP=100
:默认初始组ID,就是说新添用户时的默认初始组是 users 组(users组的GID就是100),可是你看到的现象可能并非这样,而是建立了一个和用户名同样的用户组做为该新用户的初始组。这是由于针对用户组有两种不一样的机制,这两种机制分别是:
HOME=/home
:用户家目录位置。即每一个新建用户会在该目录下新建一个和用户名同样的目录来存放该用户的文件INACTIVE=-1
:密码过时后的宽限天数。即对应 "/etc/shadow" 文件的第 7 列。这里的值是天数,若是是 0 表明密码过时马上失效;若是是 -1 则是表明密码永远不会失效;若是是其余数字如 30 ,则表明密码过时后 30 天后才失效EXPIRE=
:默认失效的日期。即对应 "/etc/shadow" 文件的第 7 列。默认值是空,表明永久有效SHELL=/bin/bash
:使用的 shell 程序。即对应 "/etc/passwd" 文件的第 7 列SKEL=/etc/skel
:新建用户家目录的模板文件。该目录下的文件会所有原封不动的复制到新用户的家目录下CREATE_MAIL_SPOOL=yes
:是否给新用户创建邮箱。这里默认建立,就是说新建用户会建立一个和用户名同样的文件放在 "/var/spool/mail/" 目录(该目录由 "/etc/login.defs" 文件指定的) 下/etc/login.defs 文件,内容以下:
[root@localhost ~]# cat /etc/login.defs ...(注释内容省略)... MAIL_DIR /var/spool/mail PASS_MAX_DAYS 99999 PASS_MIN_DAYS 0 PASS_MIN_LEN 5 PASS_WARN_AGE 7 UID_MIN 500 UID_MAX 60000 GID_MIN 500 GID_MAX 60000 CREATE_HOME yes UMASK 077 USERGROUPS_ENAB yes ENCRYPT_METHOD SHA512
MAIL_DIR /var/spool/mail
:默认邮箱目录PASS_MAX_DAYS 99999
:密码有效期。对应 "/etc/shadow" 文件的第 5 列PASS_MIN_DAYS 0
:两次密码修改时间隔。对应 "/etc/shadow" 文件的第 4 列PASS_MIN_LEN 5
:密码最小长度。已被 PAM 模块取代,这里再也不生效PASS_WARN_AGE 7
:密码到期前的警告天数。对应 "/etc/shadow" 文件的第 6 列UID_MIN 500
:最小UIDUID_MAX 60000
:最大UIDGID_MIN 500
:最小GIDGID_MAX 60000
:最大GIDCREATE_HOME yes
:建立用户时是否为其建立家目录。默认建立UMASK 077
:新建用户家目录的默认权限。这里值为 077,那么新建用户家目录的权限是 700,即 "drwx------"USERGROUPS_ENAB yes
:使用 userdel
命令删除用户时,若是所属的初始组已经没有其余用户隶属于该组了,是否删除该用户的初始组。默认是删除ENCRYPT_METHOD SHA512
:密码加密方式。加密方式有:SHA5十二、DES、MD5当用普通帐号登陆系统,须要执行某些操做可是权限不足,这时就须要切换到更高权限的用户身份去执行啦。这里就涉及到两个命令的使用 su 和 sudo
su 是最简单的用户身份切换命令,能够进行任何身份的切换。除了 root 用户切换到其余用户不须要输入密码外,其余状况使用 "su" 命令切换用户时都必须输入要切换用户的登陆密码
命令格式:su [选项] [用户名]
选项:
-
或 -l
或 --login
:使用 login-shell 的变量文件读取方式来登陆系统。即切换身份时同时切换环境变量,若是不加该选项的话,用户切换后环境变量仍是旧的,建议每次切换都带上该选项-c 命令
:只是以某个用户执行一次指令,而不切换用户身份用户名
:要切换的用户。若是省略则表明切换到 root 用户示例:
# 1. 从 user1 切换至 root 用户,提示输入密码 [user1@localhost ~]$ su - 密码: # 2. 查看 /root/aaa.txt 文件权限、全部者和所属组 [root@localhost ~]# ls -l aaa.txt -rw-r--r--. 1 root root 17 4月 18 19:15 aaa.txt # 3. 从 root 用户切换至 user2 用户,不须要输入密码直接切换成功 [root@localhost ~]# su - user2 # 4. 查看 user2 用户所属组。不在 root 组,即不能查看/root/aaa.txt内容 [user2@localhost ~]$ id user2 uid=502(user2) gid=502(user2) 组=502(user2),501(user1) # 5. 使用 root 身份执行一次查看指令,而不切换身份 [user2@localhost ~]$ su -c "cat /root/aaa.txt" root 密码: aaaaaaaaaaaaaaaa [user2@localhost ~]$
虽然 su 很方便了,可是若是有不少人都须要切换 root 身份来执行某些指令,就必须知道 root 密码,这样容易致使密码流出,很不妥。相对于 su 必须知道要切换的用户密码,而使用 sudo 来切换身份只须要知道用户本身的密码便可。并非全部用户都能使用 sudo 切换身份,前提必须是由管理员审核后,给用户开放了 sudo 权限才能使用,能使用 sudo 其实就已经表明是受信任的用户了,这也是使用 sudo不要须要知道切换用户密码的缘由。
命令格式:sudo [选项] 原始命令
选项:
-u 用户名
:要使用的用户身份,省略此选项默认是 root 身份-b
:在后台执行指令示例,
# 1. 使用 user1 用户身份建立文件 /tmp/aaa.txt [root@localhost ~]# sudo -u user1 touch /tmp/aaa.txt # 2. 查看 /tmp/aaa.txt,发现文件所属者和所属组都是 user1,而不是 root [root@localhost ~]# ls -l /tmp/aaa.txt -rw-r--r--. 1 user1 user1 0 4月 18 21:32 /tmp/aaa.txt [root@localhost ~]#
sudo 预设只有 root 用户可以使用,那么普通用户如何才能使用 sudo 来获取其余用户身份呢?这就涉及到 "/etc/sudoers" 文件的配置,由于 sudo 的执行流程是这样的:
因此用户可否使用 sudo,只须要编辑 /etc/sudoers 文件就能够了。由于该文件有必定的规范性,直接使用 vi 去编辑不是太好,所以系统提供了一个命令 visudo
专门来编辑这个文件,并在编辑完成退出编辑界面时去进行校验该文件的语法。下面对该文件内容进行介绍:
[root@localhost ~]# visudo ...省略... # 使用者 来源主机=(可切换的身份) 可执行的命令 root ALL=(ALL) ALL
用户名
" 或者 "%组名
" ,指给哪一个用户或者用户组下的全部用户授予 sudo 权限。注意若是是用户组,前面要加 "%
"ALL
" 表明全部主机ALL
" 表明任意身份。这个字段能够省略,默承认切换 root 身份。ALL
" 表明所有指令。前面若是加了 "NOPASSWD:
",则使用 sudo 时能够免密码(使用者本身的密码)输入示例,
# 1. 受权user1能够切换root身份重启服务器。可切换身份省略默认就是root身份 user1 ALL= /sbin/shutdown -r now # 等同于上面一条 user1 ALL=(root) /sbin/shutdown -r now # 2. 受权user1能够修改其余用户密码,可是不能修改root密码。! 是不可执行的意思 user1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root # 3. 受权wheel用户组全部身份权限,而且免密码输入 %wheel ALL=(ALL) NOPASSWD: ALL # 4. 设置别名。User_Alias(设置用户别名)、Cmnd_Alias(设置命令别名)、Host_Alias(设置来源主机名别名) # 注意别名必定要用大写字母,入下面的 ADMPW、ADMPWCOM User_Alias ADMPW = user1, user2, user3 Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root ADMPW ALL=(root) ADMPWCOM
若是两次执行 sudo 的间隔在五分钟内,那么再次执行 sudo 时就不须要再次输入密码了。这是由于系统相信你在五分钟内不会离开你的做业,因此执行 sudo 的是同一我的