linux-运维进阶-10 用户权限与文件权限
用户权限
uid(user id)和gid(group id)
root用户的uid和gid都是0
系统用户uid为1-999
普通用户的uid从1000开始:由管理员创建的日常使用的用户
(UID和GID不需要一一对应)
将普通用户的UID设置为0 ,那这个用户也就是root用户了
用户操作
useradd [username]
新建一个用户zhangsan
新建一个用户lisi,指定其家目录为/home/userlisi,指定他的登录shell为zsh
从passwd文件中查看出上述两个用户的uid、git、家目录、登录shell信息
用id命令可以查看用户的基本信息
使用usermod命令修改已有用户的信息(其参数和useradd几乎一样),例如将李四的登录shell改为bash
[root@localhost ~]# useradd zhangsan
[root@localhost ~]# grep zhangsan /etc/passwd
zhangsan:x1009:1009::/home/zhangsan:/bin/bash
[root@localhost ~]# useradd lisi -d /home/userlisi -s /bin/zsh
[root@localhost ~]# grep lisi /etc/passwd
lisi:x1010:1010::/home/userlisi:/bin/zsh
[root@localhost ~]# id zhangsan
uid=1009(zhangsan) gid=1009(zhangsan) groups=1009(zhangsan)
[root@localhost ~]# id lisi
uid=1010(lisi) gid=1010(lisi) groups=1010(lisi)
[root@localhost ~]# usermod lisi -d /home/userlisi -s /bin/bash
[root@localhost ~]# grep lisi /etc/passwd
lisi:x:1010:1010::/home/userlisi:/bin/bash
[root@localhost ~]#
参数
useradd 参数 | 作用 |
---|---|
-d | 指定用户的家目录(默认为/home/username) |
-e | 账户的到期时间,格式为YYYY-MM-DD. |
-u | 指定该用户的默认UID |
-g | 指定一个初始的用户基本组(必须已存在) |
-G | 指定一个或多个扩展用户组 |
-N | 不创建与用户同名的基本用户组 |
-s | 指定该用户的默认Shell解释器 |
查看用户id、uid、主组和附属组
id 用户名
例如
[root@node2 ~]# id feng
uid=1024(feng) gid=0(root) 组=0(root)
目录
/目录 、/home目录 、~目录的区别
/ :根目录
- /home :家目录(可以理解为用户列表目录),你创建的所有用户的家目录默认会在/home目录下
- :当前用户的家目录
查看这台虚拟机有哪些用户,到家目录/home下即可
[root@localhost ~]# cd /home
[root@localhost home]# ls
aaa aaawww bbb bbbwww ccc cccwww ddd dddwww testuser userlisi zhangsan
[root@localhost home]#
删除用户
注意:不要小看删除用户,很多时候咱们都会忘了敲参数-r,以导致该用户的其他信息未能被一起彻底删除,于是再次添加该用户的时候就无法添加上去了,所以两种删用户的方式都要掌握!
完全删除用户账号(也就是删除所有与该用户相关的文件)
注意:判断你删除是否彻底是否成功的标准是,如果你删除了还能给它加回来那就是成功的,加不回来的话那你的删除就是失败的或者说不彻底的!
方式一:
userdel -r 用户名
以用户zzz为例:
[root@localhost ~]# cd /home/
[root@localhost home]# ls
[root@localhost home]# useradd zzz
[root@localhost home]# ls
zzz
[root@localhost home]# userdel -r zzz
[root@localhost home]# ls
[root@localhost home]# useradd zzz
[root@localhost home]# ls
zzz
你看,删掉了用户zzz,还能加回来,这次删除就是成功的!
方式二:
userdel 用户名 #删除账户和组的信息,但是/home下还能看到该用户的家目录
find / -name "*用户名*" | xargs rm -rf #彻底删除用户其他信息
接着上面的命令继续以用户zzz为例:
[root@localhost home]# userdel zzz
[root@localhost home]# ls
zzz
[root@localhost home]# find / -name "*zzz*" | xargs rm -rf
[root@localhost home]# ls
[root@localhost home]# useradd zzz
[root@localhost home]# ls
zzz
[root@localhost home]#
你看,删掉了用户zzz,还能加回来,这次删除就是成功的!
失败案例(删除不彻底导致删除后无法再加回来)
接着上面的命令以用户qqq为例:
[root@localhost home]# useradd qqq
[root@localhost home]# userdel qqq
[root@localhost home]# useradd qqq
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
Creating mailbox file: File exists
[root@localhost home]# find / -name "*qqq*" | xargs rm -rf
[root@localhost home]# ls
zzz
[root@localhost home]# useradd qqq
useradd: user 'qqq' already exists
注意:失败了之后,那你可以参考下述命令补救,然后彻底将该用户删除。
[root@localhost home]# userdel qqq
[root@localhost home]# find / -name "*qqq*" | xargs rm -rf
[root@localhost home]# useradd qqq
[root@localhost home]# ls
qqq zzz
[root@localhost home]#
补救成功!
用户组
主组
创建用户的时候系统会同时创建一个和这个用户名同名的组,这个组就是主组,不可以把用户从主组中删除。
当然,在创建用户的时候如果你使用使用了-g参数,该用户就可加入和用户不同名的用户组作为该用户的主组。
也可以创建用户之后,再使用usermod -g来改变用户的主组,然鹅这样和用户同名的组依然会存在,并不会被删除。
附属组
除了主组之外,用户所在的其他组,都是附属组。用户是可以从附属组中被删除的。
用户的从属组,并不会影响主组,useradd时用-G参数来加入,同时用户主组默认是那个和用户同名的组。
创建用户之后,可以用usermod -G加入其他的附属组,而且之前加入的组不会退掉。
主组与附属组的区别与联系
一个用户可以属于多个附属组。但是一个用户只能有一个主组。
创建一个用户组feng,在/etc/group下可看到该组,然后把它删除掉,然后再加回来。可以看到删组可以不用加参数。
[root@localhost ~]# groupadd feng
[root@localhost ~]# grep feng /etc/group
feng:x:1000:
[root@localhost ~]# groupdel feng
[root@localhost ~]# grep feng /etc/group
[root@localhost ~]# groupadd feng
[root@localhost ~]# grep feng /etc/group
feng:x:1000:
[root@localhost ~]#
grep feng /etc/group
feng:x:1000:
[root@localhost ~]#
创建用户组afeng,bfeng,cfeng
[root@localhost ~]# groupadd afeng
[root@localhost ~]# groupadd bfeng
[root@localhost ~]# groupadd cfeng
创建用户aaa,并且其主组设置为afeng
[root@localhost ~]# useradd aaa -g afeng
[root@localhost ~]# cat /etc/passwd | grep aaa
aaa:x:1000:1001::/home/aaa:/bin/bash #可以看到aaa的GID为1001,对应的组为afeng
[root@localhost ~]# cat /etc/group | grep feng
feng:x:1000:
afeng:x:1001:
bfeng:x:1002:
cfeng:x:1003:
创建用户bbb,本来默认其主组是bbb,修改其主组为bfeng
[root@localhost ~]# cat /etc/group | grep feng #先看看各个附属组的GID
feng:x:1000:
afeng:x:1001:
bfeng:x:1002:
cfeng:x:1003:
[root@localhost ~]# useradd bbb
[root@localhost ~]# cat /etc/passwd | grep bbb
bbb:x:1001:1004::/home/bbb:/bin/bash #可以看到本来bbb的GID是1004,对应的组是bbb
[root@localhost ~]# cat /etc/group | grep bbb
bbb:x:1004:
[root@localhost ~]# usermod bbb -g bfeng
[root@localhost ~]# cat /etc/passwd | grep bbb
bbb:x:1001:1002::/home/bbb:/bin/bash #现在bbb的GID是1002,对应的组也就是bfeng
[root@localhost ~]#
创建用户ccc,其主组设置为cfeng,其附属组有:afeng、bfeng
[root@localhost ~]# useradd ccc -g cfeng -G afeng,bfeng
[root@localhost ~]# cat /etc/group | grep feng
feng:x:1000:
afeng:x:1001:ccc #可以看到afeng、bfeng下附属有ccc
bfeng:x:1002:ccc
cfeng:x:1003:
[root@localhost ~]# cat /etc/passwd | grep ccc
ccc:x:1002:1003::/home/ccc:/bin/bash #可以看到ccc的GID为1003,对应的组为cfeng
[root@localhost ~]#
用户的主组在/etc/passwd文件中的gid字段体现,并不会在/etc/group文件中体现出来
用户的附属组在/etc/group文件中体现,并不会在/etc/passwd文件中体现
设置用户密码
passwd 用户名
交互式输入密码
为用户aaa设置密码
[root@localhost ~]# passwd aaa
Changing password for user aaa.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@localhost ~]#
上述密码设置已经成功,至于BAD PASSWORD:忽略掉即可,想要了解可以浏览我博客的另一篇文章:linux-基础学习-02 Linux系统介绍和安装,这篇文章详细讲解了设置密码时遇到的N种情况。
锁定用户密码
[root@localhost ~]# passwd -l aaa
Locking password for user aaa.
passwd: Success
[root@localhost ~]# passwd -S aaa #查看密码状态
aaa LK 2019-01-18 0 99999 7 -1 (Password locked.)
[root@localhost ~]# passwd -u aaa #解锁密码
Unlocking password for user aaa.
passwd: Success
[root@localhost ~]# passwd -S aaa
aaa PS 2019-01-18 0 99999 7 -1 (Password set, SHA512 crypt.)
[root@localhost ~]#
使用非交互式(系统标准输入)设置用户密码(不安全)
[root@localhost ~]# echo "123456" | passwd --stdin aaa
Changing password for user aaa.
passwd: all authentication tokens updated successfully.
[root@localhost ~]# history 5 #用history查看最近输入该的5条命令
81 passwd -S aaa
82 echo "123456" | passwd aaa
83 echo "123456" | passwd --stdin aaa #完了,密码露馅了
84 history -5
85 history 5
[root@localhost ~]#
文件权限
文件的分类
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
修改文件权限的命令
用法
chmod [user]+[ r | w| x ] file
chmod [user] -[ r | w| x ] file
注意: 如果不加user的话,那么所有的用户的执行权限都会被加上,其他权限只对当前用户生效
例如:
chmod 755 file
chmod 750 file
更改一个文件的归属权
chown [user] file
例如:
[root@localhost ~]# ll
#一开始,hello.sh是root组下的root用户的文件
-rw-r--r--. 1 root root 0 Jan 23 04:14 hello.sh
[root@localhost ~]# chown aaa hello.sh
[root@localhost ~]# ll
#改成aaa用户的文件
-rw-r--r--. 1 aaa root 0 Jan 23 04:14 hello.sh
[root@localhost ~]# chown bbb:bfeng hello.sh
[root@localhost ~]# ll
#改成bfeng组下的bbb用户的文件
-rw-r--r--. 1 bbb bfeng 0 Jan 23 04:14 hello.sh
[root@localhost ~]# chgrp afeng hello.sh
[root@localhost ~]# ll
#改成归属afeng组的文件
-rw-r--r--. 1 bbb afeng 0 Jan 23 04:14 hello.sh
[root@localhost ~]#
文件特殊权限
SUID
让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)
[root@localhost ~]# ll hello.sh
-rw-r--r--. 1 bbb afeng 0 Jan 23 04:14 hello.sh
[root@localhost ~]# chmod u+s hello.sh
[root@localhost ~]# ll hello.sh
-rwSr--r--. 1 bbb afeng 0 Jan 23 04:14 hello.sh
[root@localhost ~]#
SGID和SUID同理
SBID
当对某个目录设置了SBIT粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作。
当目录被设置SBIT特殊权限位后,文件的其他*限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T。
[root@localhost ~]# mkdir test
[root@localhost ~]# cd test
[root@localhost test]# touch hello.sh
[root@localhost test]# ll
total 0
-rw-r--r--. 1 root root 0 Jan 23 04:33 hello.sh
[root@localhost test]# chmod -R o+t hello.sh
[root@localhost test]# ll
total 0
-rw-r--r-T. 1 root root 0 Jan 23 04:33 hello.sh
[root@localhost test]# su aaa
[aaa@localhost test]$ rm -f hello.sh
rm: cannot remove ‘hello.sh’: Permission denied
文件的隐藏属性
chattr
chattr命令用于设置文件的隐藏权限,格式为
chattr [参数] 文件
参数 | 作用 |
---|---|
i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件 |
a | 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only) |
S | 文件内容在变更后立即同步到硬盘(sync) |
s | 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域) |
b | 不再修改文件或目录的存取时间 |
D | 检查压缩文件中的错误 |
d | 使用dump命令备份时忽略本文件/目录 |
c | 默认将文件或目录进行压缩 |
u | 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 |
t | 让文件系统支持尾部合并(tail-merging) |
X | 可以直接访问压缩文件中的内容 |
lsattr
[root@localhost test]# chattr +a hello.sh
[root@localhost test]# lsattr hello.sh
-----a---------- hello.sh
[root@localhost test]# chattr -a hello.sh
[root@localhost test]# lsattr hello.sh
---------------- hello.sh
[root@localhost test]#
文件权限扩展权限设置
setfacl
题目:
创建文件/root/testfacl,其文件所属者和组都是root
系统中有aaa,bbb和ccc三个用户,
root用户对testfacl有最高权限
aaa用户对testfacl有可读可写可执行权限
bbb用户对testfacl有可读可写权限
ccc用户对testfacl有可读权限
用户组中的用户对testfacl文件有可读可执行权限
用户组cfeng对testfacl有可读权限
其他用户对testfacl没有任何权限
命令:
[root@localhost ~]# touch testfacl
[root@localhost ~]# ll testfacl
-rw-r--r--. 1 root root 0 Jan 23 04:49 testfacl
[root@localhost ~]# setfacl -m u:root:rwx,u:aaa:rwx,u:bbb:rw-,u:ccc:r--,g::r-x,g:cfeng:r--,o::--- testfacl
[root@localhost ~]# ll testfacl
-rw-rwx---+ 1 root root 0 Jan 23 04:49 testfacl
[root@localhost ~]#
getfacl
查看文件扩展属性
[root@localhost ~]# getfacl testfacl
# file: testfacl
# owner: root
# group: root
user::rw-
user:root:rwx
user:aaa:rwx
user:bbb:rw-
user:ccc:r--
group::r-x
group:cfeng:r--
mask::rwx
other::---
[root@localhost ~]#
切换用户
su
su命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户。su命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强烈建议在切换用户身份时添加这个减号(-)。
[root@localhost ~]# su aaa
[aaa@localhost root]$ id
uid=1000(aaa) gid=1001(afeng) groups=1001(afeng) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[aaa@localhost root]$ su root
Password:
[root@localhost ~]# su - aaa
Last login: Wed Jan 23 04:56:46 EST 2019 on pts/0
[aaa@localhost ~]$ id
uid=1000(aaa) gid=1001(afeng) groups=1001(afeng) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[aaa@localhost ~]$
尴尬的是,root和aaa恰好环境变量信息是一样的,唉算了就这样吧,加个减号也不费事
sudo
sudo命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务,格式为
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