linux-运维进阶-10 用户权限与文件权限
用户权限
uid(user id)和gid(group id)
root用户的uid和gid都是0
系统用户uid为1-999
普通用户的uid从1000开始:由管理员创建的日常使用的用户
(UID和GID不需要一一对应)
将普通用户的UID设置为0 ,那这个用户也就是root用户了
用户操作
1 | useradd [username] |
新建一个用户zhangsan
新建一个用户lisi,指定其家目录为/home/userlisi,指定他的登录shell为zsh
从passwd文件中查看出上述两个用户的uid、git、家目录、登录shell信息
用id命令可以查看用户的基本信息
使用usermod命令修改已有用户的信息(其参数和useradd几乎一样),例如将李四的登录shell改为bash
1 | [root@localhost ~]# useradd zhangsan |
参数
useradd 参数 | 作用 |
---|---|
-d | 指定用户的家目录(默认为/home/username) |
-e | 账户的到期时间,格式为YYYY-MM-DD. |
-u | 指定该用户的默认UID |
-g | 指定一个初始的用户基本组(必须已存在) |
-G | 指定一个或多个扩展用户组 |
-N | 不创建与用户同名的基本用户组 |
-s | 指定该用户的默认Shell解释器 |
查看用户id、uid、主组和附属组
1 | id 用户名 |
目录
/目录 、/home目录 、~目录的区别
/ :根目录
/home :家目录(可以理解为用户列表目录),你创建的所有用户的家目录默认会在/home目录下
~ :当前用户的家目录
查看这台虚拟机有哪些用户,到家目录/home下即可
1 | [root@localhost ~]# cd /home |
或者使用上面的命令查看某一用户是否存在,查看用户id、uid、主组和附属组,若用户不存在那肯定是报错的。
1 | id 用户名 |
删除用户
注意:不要小看删除用户,很多时候咱们都会忘了敲参数-r,以导致该用户的其他信息未能被一起彻底删除,于是再次添加该用户的时候就无法添加上去了,所以两种删用户的方式都要掌握!
完全删除用户账号(也就是删除所有与该用户相关的文件)
注意:判断你删除是否彻底是否成功的标准是,如果你删除了还能给它加回来那就是成功的,加不回来的话那你的删除就是失败的或者说不彻底的!
方式一:
1 | userdel -r 用户名 |
以用户zzz为例:
1 | [root@localhost ~]# cd /home/ |
方式二:
1 | userdel 用户名 #删除账户和组的信息,但是/home下还能看到该用户的家目录 |
接着上面的命令继续以用户zzz为例:
1 | [root@localhost home]# userdel zzz |
失败案例(删除不彻底导致删除后无法再加回来)
接着上面的命令以用户qqq为例:
1 | [root@localhost home]# useradd qqq |
用户组
主组
创建用户的时候系统会同时创建一个和这个用户名同名的组,这个组就是主组,不可以把用户从主组中删除。
当然,在创建用户的时候如果你使用使用了-g参数,该用户就可加入和用户不同名的用户组作为该用户的主组。
也可以创建用户之后,再使用usermod -g来改变用户的主组,然鹅这样和用户同名的组依然会存在,并不会被删除。
附属组
除了主组之外,用户所在的其他组,都是附属组。用户是可以从附属组中被删除的。
用户的从属组,并不会影响主组,useradd时用-G参数来加入,同时用户主组默认是那个和用户同名的组。
创建用户之后,可以用usermod -G加入其他的附属组,而且之前加入的组不会退掉。
主组与附属组的区别与联系
一个用户可以属于多个附属组。但是一个用户只能有一个主组。
创建一个用户组feng,在/etc/group下可看到该组,然后把它删除掉,然后再加回来。可以看到删组可以不用加参数。
1 | [root@localhost ~]# groupadd feng |
创建用户组afeng,bfeng,cfeng
1 | [root@localhost ~]# groupadd afeng |
创建用户aaa,并且其主组设置为afeng
1 | [root@localhost ~]# useradd aaa -g afeng |
创建用户bbb,本来默认其主组是bbb,修改其主组为bfeng
1 | [root@localhost ~]# cat /etc/group | grep feng #先看看各个附属组的GID |
创建用户ccc,其主组设置为cfeng,其附属组有:afeng、bfeng
1 | [root@localhost ~]# useradd ccc -g cfeng -G afeng,bfeng |
用户的主组在/etc/passwd文件中的gid字段体现,并不会在/etc/group文件中体现出来
用户的附属组在/etc/group文件中体现,并不会在/etc/passwd文件中体现
设置用户密码
1 | passwd 用户名 |
为用户aaa设置密码
1 | [root@localhost ~]# passwd aaa |
上述密码设置已经成功,至于BAD PASSWORD:忽略掉即可,想要了解可以浏览我博客的另一篇文章:linux-基础学习-02 Linux系统介绍和安装,这篇文章详细讲解了设置密码时遇到的N种情况。
锁定用户密码
1 | [root@localhost ~]# passwd -l aaa |
使用非交互式(系统标准输入)设置用户密码(不安全)
1 | [root@localhost ~]# echo "123456" | passwd --stdin aaa |
文件权限
文件的分类
Linux系统使用了不同的字符来加以区分,常见的字符如下所示。
- -:普通文件。
- d:目录文件。
- l:链接文件。
- b:块设备文件。
- c:字符设备文件。
- p:管道文件。
权限分配 | 文件所有者 | 文件所有者 | 文件所有者 | 文件所属组 | 文件所属组 | 文件所属组 | 其他用户 | 其他用户 | 其他用户 |
---|---|---|---|---|---|---|---|---|---|
权限项 | 读 | 执行 | 写 | 读 | 写 | 执行 | 读 | 写 | 执行 |
字符表示 | r | x | w | r | w | x | r | w | x |
数字表示 | 4 | 1 | 2 | 4 | 2 | 1 | 4 | 2 | 1 |
chmod
修改文件权限的命令
用法
1 | chmod [user]+[ r | w| x ] file |
注意: 如果不加user的话,那么所有的用户的执行权限都会被加上,其他权限只对当前用户生效
例如:
1 | chmod 755 file |
更改一个文件的归属权
1 | chown [user] file |
例如:
1 | [root@localhost ~]# ll |
文件特殊权限
SUID
让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)
1 | [root@localhost ~]# ll hello.sh |
SGID和SUID同理
SBID
当对某个目录设置了SBIT粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作。
当目录被设置SBIT特殊权限位后,文件的其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T。
1 | [root@localhost ~]# mkdir test |
文件的隐藏属性
chattr
chattr命令用于设置文件的隐藏权限,格式为
1 | chattr [参数] 文件 |
参数 | 作用 |
---|---|
i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件 |
a | 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only) |
S | 文件内容在变更后立即同步到硬盘(sync) |
s | 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域) |
b | 不再修改文件或目录的存取时间 |
D | 检查压缩文件中的错误 |
d | 使用dump命令备份时忽略本文件/目录 |
c | 默认将文件或目录进行压缩 |
u | 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 |
t | 让文件系统支持尾部合并(tail-merging) |
X | 可以直接访问压缩文件中的内容 |
lsattr
1 | [root@localhost test]# chattr +a hello.sh |
文件权限扩展权限设置
setfacl
题目:
创建文件/root/testfacl,其文件所属者和组都是root
系统中有aaa,bbb和ccc三个用户,
root用户对testfacl有最高权限
aaa用户对testfacl有可读可写可执行权限
bbb用户对testfacl有可读可写权限
ccc用户对testfacl有可读权限
用户组中的用户对testfacl文件有可读可执行权限
用户组cfeng对testfacl有可读权限
其他用户对testfacl没有任何权限
命令:
1 | [root@localhost ~]# touch testfacl |
getfacl
查看文件扩展属性
1 | [root@localhost ~]# getfacl testfacl |
切换用户
su
su命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户。su命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强烈建议在切换用户身份时添加这个减号(-)。
1 | [root@localhost ~]# su aaa |
尴尬的是,root和aaa恰好环境变量信息是一样的,唉算了就这样吧,加个减号也不费事
sudo
sudo命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务,格式为
1 | sudo [参数] 命令名称 |
sudo命令具有如下功能:
- 限制用户执行指定的命令:
- 记录用户执行的每一条命令;
- 配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
- 验证密码的后5分钟内(默认值)无须再让用户再次验证密码。
参数 | 作用 |
---|---|
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u用户名或UID值 | 以指定的用户身份执行命令 |
-k | 清空密码的有效时间,下次执行sudo时需要再次进行密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提示语 |
visudo
举例:使用visudo命令配置sudo命令的配置文件
[root@localhost ~]# visudo
98 ## Allows people in group wheel to run all commands
99 %wheel ALL=(ALL) ALL
100 root ALL=(ALL) ALL