用户与组概述
用户作用:
- 登陆操作系统
- 方便做权限的不同设置
- 用户的唯一标识:UID
- LINUX系统默认管理员为root,管理员root的UID为0
组的作用
-
方便管理众多的用户,方便对用户进行分类
-
组的唯一标识:GID
-
组的分类:基本组,附加组(从属组)
- 基本组:Linux自己创建的组,与用户同名,系统自动将用户加入
- 附加组(从属组):管理员自建创建,管理员将用户加入
-
Linux一个用户必须至少属于一个组
- 例如:创建一个用户zhangsan,默认会创建与用户同名的组,并把用户加入到这个组里面,这个组是zhangsan用户的基本组
[root@localhost ~]# useradd zhangsan #创建zhangsan用户
用户账号创建
用户基本信息存放在 /etc/passwd文件,每个用户记录一行,以:分割为7字段,含义如下
用户名:密码占位符:用户UID:基本组GID:描述信息:家目录(宿主目录):解释器
[root@localhost ~]# wc -l /etc/passwd #统计当前系统中的用户数量
[root@localhost ~]# grep zhangsan /etc/passwd #从/etc/passwd文件中过滤zhangsan的信息
查看用户-查
-
使用id命令
-
格式:id 用户名
-
作用:判断该用户是否存在
[root@localhost ~]# id zhangsan #判断用户是否存在
[root@localhost ~]# id dachui #判断用户是否存在
id: “dachui”:无此用户
创建用户-增
-
使用useradd命令
-
格式:useradd [选项] 用户名
-
常用命令选项
- -u 指定用户id
- -d 指定家目录路径
- -s 指定登录解释器
- -G 指定用户附加组
[root@localhost ~]# useradd java01 #创建用户java01
[root@localhost ~]# grep java01 /etc/passwd #查看/etc/passwd是否多出了用户java01
[root@localhost ~]# id java01 #查看用户java01是否存在
[root@localhost ~]# useradd java02 #创建用户java02
[root@localhost ~]# id java02 #查看用户java02是否存在
指定用户UID创建用户
[root@localhost ~]# useradd -u 1100 java03 #创建UID为1100的用户java03
[root@localhost ~]# id java03 #查看验证
uid=1100(java03) gid=1100(java03) 组=1100(java03)
指定用户家目录创建目录
[root@localhost ~]# useradd -d /opt/java04 java04 #创建java04用户,其家目录为/opt/java04
[root@localhost ~]# grep java04 /etc/passwd #查看验证是否多出来了java04用户
java04:x:1101:1101::/opt/java04:/bin/bash
[root@localhost ~]# ls /opt/ #查看java04用户家目录
指定用户解释器
- /sbin/nologin,如果用户的解释器为/sbin/nologin,那么该用户无法登录系统
[root@localhost ~]# useradd -s /sbin/nologin java05 #创建用户java05并指定解释器
[root@localhost ~]# grep java05 /etc/passwd #查看验证
指定用户附加组
- groupadd 组名,可以专门创建一个组
[root@localhost ~]# groupadd tarena #创建组tarena
[root@localhost ~]# useradd -G tarena java06 #创建java06用户并添加到tarena组里面
[root@localhost ~]# id java06 #验证
指定基本组
[root@localhost ~]# useradd -g tarena java07 #创建java07用户指定基本组为tarena
[root@localhost ~]# id java07 #验证
修改用户属性-改
- 使用usermod命令
- 只能操作已存在的用户
- 格式:usermod [选项] 用户
- -u 指定用户id
- -d 指定家目录路径
- -s 指定登录解释器
- -G 指定用户附加组(重置附加组)
[root@localhost ~]# useradd alex #创建用户alex
[root@localhost ~]# usermod -u 1200 alex #修改用户alex的UID为1200
[root@localhost ~]# usermod -s /bin/sh alex #修改用户alex的解释器为/bin/sh
[root@localhost ~]# grep alex /etc/passwd #查看用户alex的信息
[root@localhost ~]# groupadd mygroup #添加mygroup组
[root@localhost ~]# usermod -G tarena alex #将alex附加组设置为tarena
[root@localhost ~]# id alex #查看验证
[root@localhost ~]# usermod -G mygroup alex #将alex附加组设置为mygroup
[root@localhost ~]# id alex #查看验证,-G其实是重置附加组
[root@localhost ~]# grep alex /etc/passwd #查看当前alex的家目录
[root@localhost ~]# usermod -d /opt/alex alex #修改alex用户家目录为/opt/alex
[root@localhost ~]# grep alex /etc/passwd #查看验证,alex用户家目录已经修改为/opt/alex
[root@localhost ~]# ls /opt/ #但是/opt/下没有alex家目录,因为usermod -d不会创建目录
删除用户-删
- 删除用户:userdel
- -r:连同用户家目录、信箱一并删除
[root@localhost ~]# userdel java03 #删除用户java03,家目录、信箱不删除
[root@localhost ~]# userdel -r java04 #删除用户java04,家目录、信箱一并删除
用户密码管理
- 记录用户密码信息的文件:/etc/shadow
- 文件格式如下
用户名:加密密码:从1970年1月1日到最近一次修改密码时间:密码最短有效天数,默认为0:密码最长有效天数,默认99999:密码过期前警告天数,默认是7:密码过期后多少天禁用此账户:账号失效天数,默认是空:保留字段(未使用)
交互式修改密码
- 使用passwd命令修改密码
- 格式:passwd 用户名
- 只有root用户才能指定用户修改密码
- passwd直接回车则代表为当前登录用户修改密码
- 普通用户修改密码需要满足策略,root用户可以忽略密码策略
[root@localhost ~]# passwd lisi #修改lisi用户的密码
更改用户 lisi 的密码。
新的 密码: #为了安全,输入密码不显示
无效的密码: 密码少于 8 个字符
重新输入新的 密码: #为了安全,输入密码不显示
passwd:所有的身份验证令牌已经成功更新。
非交互式修改密码
- 格式:echo 密码 | passwd --stdin 用户名
[root@localhost ~]# echo 123 | passwd --stdin zhangsan #修改用户zhangsan用户密码为123
用户初始配置文件
-
新建用户是,根据/etc/skel模板目录复制内容至用户家目录下
-
主要的初始配置文件
-
~/.bash_profile: 每次登录时执行
-
~/.bashrc: 每次进入新的bash环境时执行
-
~/.bash_logout:每次退出登录时执行
-
全局配置文件:/etc/bashrc、/etc/profile
-
root用户使用~/.bashrc文件永久定义别名
[root@localhost ~]# vim ~/.bashrc
...
alias hn='hostname'
...
基本权限和归属
基本权限的类别
- 读取:允许查看内容-read r
- 写入:允许修改内容-write w
- 可执行:允许运行和切换-execute x
常见报错提示:Permission denied :权限不足
对于文本文件,拥有相应权限能做操作哪些命令(举例):
r 读取权限:cat less head tail
w 写入权限:vim > >>
x 可执行权限: Shell脚本编写时可以赋予
权限适用对象(归属)
- 所有者:拥有此文件/目录的用户-user u
- 所属组:拥有此文件/目录的组-group g
- 其他用户:除所有者、所属组以外的用户-other o
查看权限
- 查看文件权限: ls -l 文件1 文件2
- 查看目录权限: ls -ld 目录1 目录2 ...
以 - 开头: 文本文件
以 d 开头:目录
以 l 开头: 快捷方式
[root@localhost ~]# ls -ld /etc/ #查看/etc/目录权限
[root@localhost ~]# ls -l /etc/rc.local #查看/etc/rc.local权限
[root@localhost ~]# ls -l /etc/passwd #查看/etc/passwd权限
修改权限
设置基本权限
- 使用 chmod 命令
- 命令格式: chmod [-R] 归属关系+-=权限类别 文档...
- -R:递归修改
[root@localhost ~]# mkdir /java01 #创建素材目录
[root@localhost ~]# ls -ld /java01 #查看/java01目录权限
drwxr-xr-x. 2 root root 6 2月 17 12:54 /java01
取消/java01目录所有者的w权限
[root@localhost ~]# chmod u-w /java01 #u-w权限
[root@localhost ~]# ls -ld /java01 #查看权限
/java01目录所有者怎加w权限
[root@localhost ~]# chmod u+w /java01 #u+w权限
[root@localhost ~]# ls -ld /java01 #查看权限
修改/java01目录所属组为只读权限
[root@localhost ~]# chmod g=r /java01 #g=r权限
[root@localhost ~]# ls -ld /java01 #查看权限
修改/java01目录其他人没有任何权限
[root@localhost ~]# chmod o=--- /java01 #其他人取消所有权限
[root@localhost ~]# ls -ld /java01 #查看权限
同时设置权限
[root@localhost ~]# chmod u=rwx,o=rx /java01 #所有者权限为rwx,其他人权限为rx
[root@localhost ~]# ls -ld /java01 #查看权限
[root@localhost ~]# chmod u=rwx,g=rx,o=rx /java01 #所有者权限为rwx,所属组/其他人权限为rx
[root@localhost ~]# chmod ugo=rwx /java01 #所有者/所属组/其他人权限为rwx
[root@localhost ~]# ls -ld /java01 #查看权限
-R递归修改权限
[root@localhost ~]# mkdir -p /opt/aa/bb/cc #递归创建/opt/aa/bb/cc
[root@localhost ~]# ls -lR /opt/ #递归查看属性
查看aa,bb,cc(目录其他人的权限都是rx)
[root@localhost ~]# ls -ld /opt/aa/
[root@localhost ~]# ls -ld /opt/aa/bb/
[root@localhost ~]# ls -ld /opt/aa/bb/cc/
递归修改权限,目录本身包括此目录里面会发生变化
[root@localhost ~]# chmod -R o=--- /opt/aa/ #递归设置/opt/aa其他人没有任何权限
[root@localhost ~]# ls -ld /opt/aa/ #查看验证
[root@localhost ~]# ls -ld /opt/aa/bb/
[root@localhost ~]# ls -ld /opt/aa/bb/cc/
如何判断用户对某目录所具备怎样的权限
[root@localhost ~]# chmod g=rx,o=rx /java01/ #设置权限
[root@localhost ~]# ls -ld /java01/ #查看权限
[root@localhost ~]# useradd zhangsan #创建zhangsan用户
drwxr-xr-x. 2 root root 6 7月 1 03:56 /java01/
[root@localhost ~]# id zhangsan #判断用户归属关系
uid=1004(zhangsan) gid=1004(zhangsan) 组=1004(zhangsan)
实验不同用户写入文件:
[root@localhost ~]# mkdir /java02 #创建/java02目录
[root@localhost ~]# echo 123 > /java02/a.txt #创建/java02/a.txt文件内容为123
zhangsan用户测试
[root@localhost ~]# su - zhangsan #切换用户
[zhangsan@localhost ~]$ cat /java02/a.txt #可以查看
123
[zhangsan@localhost ~]$ echo haha > /java02/a.txt #写入haha失败
-bash: /java02/a.txt: 权限不够
[zhangsan@localhost ~]$ exit #退回到root用户
[root@localhost ~]# chmod o+w /java02/a.txt #赋予w的权限
[root@localhost ~]# su - zhangsan #切换用户zhangsan
[zhangsan@localhost ~]$ echo haha >> /java02/a.txt #写入成功
[zhangsan@localhost ~]$ cat /java02/a.txt #可以验证
123
haha
实验不同用户操作目录:
[root@localhost ~]# ls -ld /java02/ #查看权限
drwxr-xr-x. 2 root root 19 6月 28 13:22 /java02/
[root@localhost ~]# id zhangsan #查看zhangsan用户归属
uid=1004(zhangsan) gid=1004(zhangsan) 组=1004(zhangsan)
zhangsan用户测试
[root@localhost ~]# su - zhangsan #切换用户zhangsan
[zhangsan@localhost ~]$ ls -l /java02/ #可以查看
[zhangsan@localhost ~]$ cd /java02 #可以切换目录
[zhangsan@localhost java02]$ exit
[root@localhost ~]# chmod o-x /java02 #其他人取消x权限
[root@localhost ~]# su - zhangsan #切换zhangsan用户
[zhangsan@localhost ~]$ cd /java02 #切换失败
-bash: cd: /java02: 权限不够
[zhangsan@localhost ~]$ ls /java02 #查看虽然显示,但是也异常
ls: 无法访问/java02/a.txt: 权限不够
a.txt
在目录下写入内容,但是修改的是目录里面的内容,对目录本身没有修改权限:
[root@localhost ~]# chmod o=rwx /java02
[root@localhost ~]# su - zhangsan
[zhangsan@localhost ~]$ cd /java02
[zhangsan@localhost java02]$ touch zs.txt #创建成功
[zhangsan@localhost java02]$ mkdir zs #创建成功
[zhangsan@localhost java02]$ exit
如果想要对目录本身有修改的权限,找此目录的父目录即可:
[zhangsan@localhost java02]$ cd
[zhangsan@localhost ~]$ mv /java02 /stu02 #修改失败
mv: 无法将"/java02" 移动至"/stu02": 权限不够
[root@localhost ~]# su - zhangsan
[root@localhost ~]# chmod o+w / #修改/的权限
[root@localhost ~]# su - zhangsan
[zhangsan@localhost ~]$ mv /java02 /stu02 #修改成功
[zhangsan@localhost ~]$ ls /
数字的形式修改权限:
[root@localhost ~]# mkdir /java03
[root@localhost ~]# ls -ld /java03
[root@localhost ~]# chmod 750 /java03
[root@localhost ~]# ls -ld /java03
[root@localhost ~]# chmod 700 /java03
修改归属
设置归属关系
- 使用 chown 命令,-R递归设置
- chown [-R] 属主 文档...
- chown [-R] :属组 文档...
- chown [-R] 属主:属组 文档...
同时修改所有者(属主)和所属组(属组)
[root@localhost ~]# mkdir /springboot #创建/springboot
[root@localhost ~]# ls -ld /springboot #查看权限
[root@localhost ~]# groupadd stugrp #创建组stugrp
[root@localhost ~]# useradd dc #创建dc用户
[root@localhost ~]# chown dc:stugrp /springboot #修改/springboot目录的所有者为dc,所属组为stugrp
[root@localhost ~]# ls -ld /springboot#查看归属
[root@localhost ~]# chown zhangsan /springboot #仅将/springboot目录的修改所有者为zhangsan
[root@localhost ~]# ls -ld /springboot #查看归属
只修改所属组
[root@localhost ~]# chown :root /springboot/ #仅修改所属组
[root@localhost ~]# ls -ld /springboot #查看归属
递归修改归属关系
[root@localhost ~]# chown -R dc /opt/aa #递归修改/opt/aa的所有者为dc
[root@localhost ~]# ls -ld /opt/aa #验证
[root@localhost ~]# ls -ld /opt/aa/bb/
[root@localhost ~]# ls -ld /opt/aa/bb/cc/
实验
[root@localhost ~]# mkdir /java05
[root@localhost ~]# chmod g=rwx,o=--- /java05 #设置目录权限
[root@localhost ~]# chown zhangsan:stugrp /java05
[root@localhost ~]# ls -ld /java05 #zhangsan用户有读写执行的权限,其他用户没有权限
测试
[root@localhost ~]# su - zhangsan
[zhangsan@localhost ~]$ mkdir /java05/aa
[zhangsan@localhost ~]$ exit
[root@localhost ~]# su - lisi #切换lisi用户
[lisi@localhost ~]$ mkdir /java05/lisi
mkdir: 无法创建目录"/java05/lisi": 权限不够
[lisi@localhost ~]$ exit #退出
可以把lisi加入到组里面,继承组的权限
[root@localhost ~]# usermod -G stugrp lisi #将lisi用户加入到stugrp组
[root@localhost ~]# id lisi
[root@localhost ~]# su - lisi #切换lisi用户
[lisi@localhost ~]$ mkdir /java05/lisi #可以创建目录
去掉所有者的执行权限,zhangsan添加到stugrp组里面,虽然组里面有执行权限,但是依然不能cd
[root@localhost ~]# chmod u-x /java05/ #所有者去掉x权限
[root@localhost ~]# usermod -G stugrp zhangsan #将zhangsan加入stugrp组
[root@localhost ~]# su - zhangsan
[zhangsan@localhost ~]$ cd /java05/
-bash: cd: /java05/: 权限不够
总结: 权限判断步骤
1、判断用户身份(所有者>所属组>其他人 匹配即停止)
2、查看相应身份的权限