目录
一、Linux安全模型
资源分派:
Authentication:认证,验证用户身份
Authorization:授权,不同的用户设置不同权限
Accouting:审计 ,事后行为
3A认证:又称AAA认证,是一套针对网络设备的网络访问控制策略安全模型。
在Linux系统中,当用户登录成功时,系统会自动分配令牌 token,包括:用户标识和组成员等信息。
#用于审计的登录日志
[root@Rocky130 ~]$cat /var/log/secure
[root@ubuntu huhao]# cat /var/log/auth.log
(1)用户
Linux系统是多用户系统,可以同时存在多个用户,每个用户之间都是互相隔离的。
在Linux系统中,每个用户是通过User Id (UID)来唯一标识的。
(2)用户组
Linux中可以将一个或多个用户加入用户组中,组就是包含0个或多 个用户的集合,用户组是通过Group ID(GID) 来唯一标识的。
(3)用户和组的关系
⚪ 一个用户至少有一个组,也可以有多个组
⚪ 一个组至少有0个用户,也可以有多个用户
⚪ 用户的主要组(primary group):又称私有组,一个用户必须属于且只有一个主组,创建用户时,默认会创建与其同名的组作为主组
⚪ 用户的附加组(supplementary group):又称辅助组,一个用户可以属于0个或多个附加组
⚪ 使用组,可以对用户进行批量管理,比如对一个组授权,则该组下所有的用户能能继承这个组的权限
(4)安全上下文
Linux安全上下文Context
在Linux系统中,运行中的程序(即进程process),都是以进程发起者的身份运行;进程所能够访问的资源权限取决于进程的运行者的身份。
程序
一个程序或一个命令,本质上也是一个可执行的二进制文件或一个可执行的脚本文件;在服务器上有很多文件,只有那些特定的,可以被执行的二进制文件,才能被称为程序。
进程
运行中的程序,就是进程。
程序,进程,用户之间的关系
只有可以被执行的文件,才能叫作程序;对于同一个程序,也不是所有用户都可以运行的,这要取决于当前用户对该程序有没有可执行权限。
用户张三,运行了某个程序,那么,张三就发起了一个进程,该进程的发起者,就是张三,该进程是以张三的身份在运行。
进程的访问资源
一个进程能不能访问某些资源,是由进程发起者决定的(跟进程本身的程序文件无关),比如某进程要读写某个文件,则要看该进程发起者有没有权限读取该文件。
SUM->一切皆文件,用户名or密码等等,当我们提交一个用户名和密码,我们提交到服务器——>认证,对比,要在系统上找(具体的某一个文件)是否存在这一个用户 /etc/passwd,然后如果用户存在,再去校验密码是否正确 /etc/shadow。
二、用户和组的配置文件
(1)用户和组的主要配置文件
/etc/passwd:用户及其属性信息(名称、UID、主组ID等)
/etc/shadow:用户密码及其相关属性
/etc/group:组及其属性信息
/etc/gshadow:组密码及其相关属性
(2)passwd文件格式
[root@ubuntu huhao]# whatis passwd
passwd (1) - change user password
passwd (1ssl) - OpenSSL application commands
passwd (5) - the password file
man 5 passwd
#文件格式
#login name : password : UID : GID : GECOS : directory : shell
login name #登录用户名
password #密码位,x只是表示一个占位符,可为空
UID #用户ID,0 表示超级管理员
GID #所属组ID
GECOS #用户全名或注释,描述信息,可为空
directory #用户家目录,在创建用户时,默认会创建在/home 目录下
shell #用户默认shell,/sbin/nologin 表示不用登录的 shell,一般用 chsh 命令修改 chsh -s /bin/csh huhao
root:x:0:0:root:/root:/bin/bash
huhao:x:1000:1000:huhao:/home/huhao:/bin/bash
#不建议直接修改 /etc/passwd
#修改用户shell
[root@Rocky130 ~]$getent passwd huhao
huhao:x:1000:1000:huhao:/home/huhao:/bin/bash
#专用修改
chsh -s /bin/sh huhao
huhao:x:1000:1000:huhao:/home/huhao:/bin/sh
getent passwd huhao
[root@Rocky130 ~]$getent passwd huhao
huhao:x:1000:1000:huhao:/home/huhao:/bin/sh
(3)shadow文件格式
此文件中存储的是用户密码信息,任何用户都无权限。
[root@ubuntu huhao]# ll /etc/shadow
-rw-r----- 1 root shadow 1091 Jun 11 21:29 /etc/shadow
#ubuntu 有权限
[root@Rocky130 ~]$ll /etc/shadow
---------- 1 root root 1133 Jun 11 21:29 /etc/shadow
[root@ubuntu huhao]# whatis shadow
shadow (5) - shadowed password file
man 5 shadow
#文件格式
#login name : encrypted password : date of last password change : minimum password age : maximum password age : password warning period : password inactivity period : account expiration date : reserved field
login name #登录用户名
encrypted password #加密后的密文,一般用sha512加密,可为空,!表示该用户被锁定,不能登录系统
date of last password change #上次修改密码的时间,自1970年开始,0表示下次登录之后就要改密码,为空表示密码时效功能无效
minimum password age #最小时间间隔,当前密码最少能使用多少天,0表示随时可被变更
maximum password age #最大时间间隔,当前密码最多能使用多少天,99999表示可以一直使用
password warning period #警告时间,密码过期前几天开始提醒用户,默认为7
password inactivity period #不活动时间,密码过期几天后帐号会被锁定,在此期间,用户仍然可以登录,为空表示不使用此规则
account expiration date #失效时间,从1970年1月1日算起,多少天后帐号失效,为空表示永不过期
reserved field #保留字段,无意义
root:$y$j9T$NZJahA2l0fnfGal9MJ5X30$GhB3M7BYJgeJsJZvRr0tLPiplJk6QSTAv96l93/6Z81:20240:0:99999:7:::
huhao:$6$f.fM7ttOiXv/CNlS$kMV2LsMh61dBw2OMC25W2Ua/W3A8oucU27o9CAtdz.KFhUSHy9mRy5L7QEWq6ILc7N.BaHZzdf01hO7Sz3mvf0:20234:0:99999:7:::
所有伪用户的密码都是 " !! " 或 " * ",代表没有密码是不能登录的,新建用户还没设密码时为 !!(Rocky)!(Ubuntu),禁用账号,可以直接在密码字段前加 !。
(4)group文件格式
[root@ubuntu huhao]# whatis group
group (5) - user group file
man 5 group
#文件格式
#group_name : password : GID : user_list
group_name #组名
password #组密码,当用户加组时,需要用此密码验证
GID #组ID
user_list #用户列表,多个用户用,分隔,此处的用户将当前组作为附加组
root:x:0:
huhao:x:1000:
(5)gshadow文件格式
[root@ubuntu huhao]# whatis gshadow
gshadow (5) - shadowed group file
[root@ubuntu huhao]# man 5 gshadow
#文件格式
#group name : encrypted password : administrators : members
group name #组名
encrypted password #组密码,加密后的密文,!表示还没设密码
administrators #组管理员
members #用户列表,多个用户用,分隔, 此处的用户将当前组作为附加组
root:*::
huhao:!::
(6)文件操作
可以直接用编辑工具来修改上述文件,但由于跟用户和权限有关的文件具有敏感性,所以系统提供了专用的工具来修改这几个文件。
① vipw & vigr
#vipw|vigr
#编辑/etc/passwd,/etc/group,/etc/shadow,/etc/gshadow
#vipw 默认编辑 /etc/passwd 文件
#vigr 默认编辑 /etc/group 文件
-g|--group #编辑 group 文件
-p|--passwd #编辑 passwd 文件
-s|--shadow #编辑 /etc/shadow 或 /etc/gshadow 文件
② pwck & grpk
#pwck [options] [passwd [shadow]]
#对用户相关配置文件进行检查,默认检查文件为 /etc/passwd
-q|--quiet #只报告错误,忽略警告
-r|--read-only #显示错误和警告,但不改变文件
-R|--root CHROOT_DIR #chroot 到的目录
-s|--sort #通过 UID 排序项目
③ getent
#根据用户名查看配置项
getent passwd|shadow|group|gshadow [uname]
三、用户管理命令
用户管理命令:useradd、usermod、userdel。
(1)用户创建
useradd 命令可以创建新的Linux用户。
useradd [options] LOGIN
useradd -D
useradd -D [options]
#常见选项
-u|--uid UID #指定UID
-g|--gid GID #指定用户组,-g groupname|--gid GID
-c|--comment COMMENT #新账户的 GECOS 字段
-d|--home-dir HOME_DIR #指定家目录,可以是不存在的,指定家目录,并不代表创建家目录
-s|--shell SHELL #指定 shell,可用shell在/etc/shells 中可以查看
-r|--system #创建系统用户,CentOS 6之前 ID<500,CentOS7 以后ID<1000,不会创建登录用户相关信息
-m|--create-home #创建家目录,一般用于登录用户
-M|--no-create-home #不创建家目录,一般用于不用登录的用户
-p|--password PASSWORD #设置密码,这里的密码是以明文的形式存在于/etc/shadow 文件中
-o|--non-unique #允许使用重复的 UID 创建用户
-G|--groups GROUP1[,GROUP2,...] #为用户指明附加组,组须事先存在
-N|--no-user-group #不创建同名的组,使用users组做主组
-D|--defaults #显示或更改默认的 useradd 配置,默认配置文是/etc/default/useradd
-e|--expiredate EXPIRE_DATE #指定账户的过期日期 YYYY-MM-DD 格式
-f|--inactive INACTIVE #密码过期之后,账户被彻底禁用之前的天数,0 表示密码过期立即禁用,-1表示不使用此功能
-k|--skel SKEL_DIR #指定家目录模板,创建家目录,会生成一些默认文件,如果指定,就从该目录复制文件,默认是/etc/skel/,要配合-m
-K|--key KEY=VALUE #不使用 /etc/login.defs 中的默认值,自己指定,比如-K UID_MIN=100
-l|--no-log-init #不将用户添加到最近登录和登录失败记录,前面讲到的3a认证审计,就在此处lastlog|lastb|cat /var/log/secure
#默认创建
rocky
[root@Rocky130 ~]$useradd king
[root@Rocky130 ~]$id king
uid=1002(king) gid=1002(king) groups=1002(king)
[root@Rocky130 ~]$getent passwd king
king:x:1002:1002::/home/king:/bin/bash
[root@Rocky130 ~]$getent shadow king
king:!!:20249:0:99999:7:::
[root@Rocky130 ~]$getent gshadow king
king:!::
[root@Rocky130 ~]$getent group king
king:x:1002:
[root@Rocky130 ~]$ls /home
coder4 huhao king
ubuntu - 默认不会创建家目录
[root@ubuntu ~]# useradd king
[root@ubuntu ~]# id king
uid=1001(king) gid=1001(king) groups=1001(king)
[root@ubuntu ~]# getent passwd king
king:x:1001:1001::/home/king:/bin/sh
[root@ubuntu ~]# getent shadow king
king:!:20249:0:99999:7:::
[root@ubuntu ~]# getent gshadow king
king:!::
[root@ubuntu ~]# getent group king
king:x:1001:
[root@ubuntu ~]# ls /home
huhao
[root@ubuntu129 ~]# useradd -u 123 -d /home/tiger -m -s /bin/bash tiger 2> /dev/null
[root@ubuntu129 ~]# ls /home
huhao king queen tiger
[root@Rocky130 ~]$useradd -r user1
[root@Rocky130 ~]$id user1
uid=981(user1) gid=980(user1) groups=980(user1)
#范例
[root@Rocky130 ~]$rpm -q --scripts postfix
preinstall scriptlet (using /bin/sh):
# Add user and groups if necessary
/usr/sbin/groupadd -g 90 -r postdrop 2>/dev/null
/usr/sbin/groupadd -g 89 -r postfix 2>/dev/null
/usr/sbin/groupadd -g 12 -r mail 2>/dev/null
/usr/sbin/useradd -d /var/spool/postfix -s /sbin/nologin -g postfix -G mail -M -
r -u 89 postfix 2>/dev/null
#如果我们有多台机器,我们希望相同的服务使用相同的用户运行、
#如果我们不指定用户ID、组ID,那么系统就会自行分配,因此很有可能在一台机器与其他机器创建的ID不同,所以管理也就很不便
#创建用户前先建组,可以确保组ID是己知的
#不可占用己存在的组ID
[root@Rocky130 ~]$groupadd -g 33 ABC
groupadd: GID '33' already exists
#创建系统组
[root@Rocky130 ~]$groupadd -g 336 ABC
#查看
[root@Rocky130 ~]$ getent group ABC
ABC:x:336:
[root@Rocky130 ~]$getent gshadow ABC
ABC:!::
#创建用户
[root@Rocky130 ~]$useradd -u 336 -g ABC -s /sbin/nologin -d /data/ABC -M -r ABC
#查看
[root@Rocky130 ~]$getent passwd ABC
ABC:x:336:336::/data/ABC:/sbin/nologin
[root@Rocky130 ~]$getent shadow ABC
ABC:!!:20249::::::
useradd 命令默认值设定由/etc/default/useradd定义。
[root@Rocky130 ~]$cat /etc/default/useradd
# useradd defaults file
GROUP=100 #useradd不指定组,且/etc/login.defs中的USERGROUPS_ENAB为no或useradd -N时,group 为100
HOME=/home #默认家目录父目录
INACTIVE=-1 #对应/etc/shadow文件第7列,即用户密码过期后的帐号锁定的宽限期,-1表示不锁定
EXPIRE= #对应/etc/shadow文件第8列,即用户帐号的有效期
SHELL=/bin/bash #默认bash
SKEL=/etc/skel #用于生成新建用户家目录的模版文件
CREATE_MAIL_SPOOL=yes# 默认创建收件箱->/var/spool/mail -al
#显示或更改默认设置
#useradd -D
#useradd –D -s SHELL
#useradd –D –b BASE_DIR
#useradd –D –g GROUP
#查看
[root@Rocky130 ~]$useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
#更改默认shell
[root@Rocky130 ~]$useradd -D -s /bin/sh
[root@Rocky130 ~]$useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL
[root@Rocky130 ~]$useradd king2
[root@Rocky130 ~]$getent passwd king2
king2:x:1003:1003::/home/king2:/bin/sh
[root@Rocky130 ~]$ls /var/spool/mail
huhao king
#家目录模板
[root@Rocky130 ~]$ls /etc/skel -a
. .. .bash_logout .bash_profile .bashrc .mozilla
#面试题
#创建用户时,怎么在家目录里自增文件?将文件放入/etc/skel下即可
[root@Rocky130 ~]$useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@Rocky130 ~]$ls /etc/skel -a
. .. .bash_logout .bash_profile .bashrc .mozilla
[root@Rocky130 ~]$echo "test">/etc/skel/test.txt
[root@Rocky130 ~]$ll /etc/skel -a
total 28
drwxr-xr-x. 3 root root 94 Jun 10 18:01 .
drwxr-xr-x. 132 root root 8192 Jun 10 17:55 ..
-rw-r--r--. 1 root root 18 Apr 30 2024 .bash_logout
-rw-r--r--. 1 root root 141 Apr 30 2024 .bash_profile
-rw-r--r--. 1 root root 492 Apr 30 2024 .bashrc
drwxr-xr-x. 4 root root 39 May 26 18:05 .mozilla
-rw-r--r-- 1 root root 5 Jun 10 18:01 test.txt
[root@Rocky130 ~]$useradd -m king2
[root@Rocky130 ~]$ls /home/king2 -a
. .. .bash_logout .bash_profile .bashrc .mozilla test.txt
新建用户的相关文件
/etc/default/useradd - 定义useradd默认配置策略
/etc/skel/* - 模板目录
/etc/login.defs - 定义与用户登录和账户管理相关的全局配置
#批量创建用户
newusers file
[root@ubuntu huhao123]# nano users.txt
#u1:x:1024:1024::/home/u1:/bin/bash
#u2:x:1025:1025::/home/u2:/bin/bash
[root@ubuntu huhao123]# newusers users.txt
[root@ubuntu huhao123]# id u1
uid=1024(u1) gid=1024(u1) groups=1024(u1)
[root@ubuntu huhao123]# id u2
uid=1025(u2) gid=1025(u2) groups=1025(u2)
[root@ubuntu huhao123]# getent passwd u1 u2
u1:x:1024:1024::/home/u1:/bin/bash
u2:x:1025:1025::/home/u2:/bin/bash
[root@ubuntu huhao123]# getent group u1 u2
u1:x:1024:
u2:x:1025:
#批量修改用户口令
chpasswd < file
#范例
[root@ubuntu huhao123]# nano pwd.txt
#u1:1234567
#u2:1234567
#标准输入重定向
[root@ubuntu huhao123]# chpasswd < pwd.txt
#多行重定向
chasspwd <<EOF
>u1:1234567
>u2:1234567
>EOF
#管道重定向
[root@ubuntu huhao]# echo u1:12345678 | chpasswd
(2)用户属性修改
#usermod 命令可以修改用户属性
usermod [options] LOGIN
#常见选项
-c|--comment COMMENT #修改注释
-d|--home HOME_DIR #修改家目录
-e|--expiredate EXPIRE_DATE #修改过期的日期,YYYY-MM-DD 格式
-f|--inactive INACTIVE #密码过期之后,账户被彻底禁用之前的天数,0 表示密码过期立即禁用,-1表示不使用此功能
-g|--gid GROUP #修改组
-G|--groups GROUPS #groupName|GID... 新附加组,原来的附加组将会被覆盖;若保留原有,则要同时使用-a选项
-a|--append GROUP #将用户追加至上边 -G 中提到的附加组中,并不从其它组中删除此用户
-l|--login LOGIN #新的登录名称
-L|--lock #锁定用户帐号,在/etc/shadow 密码栏的增加 !
-m|--move-home #将家目录内容移至新位置,和 -d 一起使用
-o|--non-unique #允许使用重复的(非唯一的) UID
-p|--password PASSWORD #修改密码,这里是明文,如果要在此处修改密码,则要用加密后的字符串
-s|--shell SHELL #修改 shell
-u|--uid UID #修改 UID
-U|--unlock #解锁用户帐号,将 /etc/shadow 密码栏的!拿掉
#修改用户信息
[root@ubuntu huhao]# useradd -m king
[root@ubuntu huhao]# id king
uid=1001(king) gid=1001(king) groups=1001(king)
[root@ubuntu huhao]# getent passwd king
king:x:1001:1001::/home/king:/bin/sh
[root@ubuntu huhao]# usermod -c "king of king" -l king2 king
[root@ubuntu huhao]# getent passwd king
[root@ubuntu huhao]# getent passwd king2
king2:x:1001:1001:king of king:/home/king:/bin/sh
[root@ubuntu huhao]# id king
id: ‘king’: no such user
[root@ubuntu huhao]# id king2
uid=1001(king2) gid=1001(king) groups=1001(king)
#锁定用户 - 用户被锁定之后无法登录
[root@ubuntu huhao123]# getent shadow huhao
huhao:$6$f.fM7ttOiXv/CNlS$kMV2LsMh61dBw2OMC25W2Ua/W3A8oucU27o9CAtdz.KFhUSHy9mRy5L7QEWq6ILc7N.BaHZzdf01hO7Sz3mvf0:20234:0:99999:7:::
[root@ubuntu huhao123]# usermod -L huhao
[root@ubuntu huhao123]# getent shadow huhao
huhao:!$6$f.fM7ttOiXv/CNlS$kMV2LsMh61dBw2OMC25W2Ua/W3A8oucU27o9CAtdz.KFhUSHy9mRy5L7QEWq6ILc7N.BaHZzdf01hO7Sz3mvf0:20234:0:99999:7:::
#查看日志
[root@ubuntu huhao123]# cat /var/log/auth.log
#解锁用户
[root@ubuntu huhao123]# getent shadow huhao
huhao:!$6$f.fM7ttOiXv/CNlS$kMV2LsMh61dBw2OMC25W2Ua/W3A8oucU27o9CAtdz.KFhUSHy9mRy5L7QEWq6ILc7N.BaHZzdf01hO7Sz3mvf0:20234:0:99999:7:::
[root@ubuntu huhao123]# usermod -U huhao
[root@ubuntu huhao123]# getent shadow huhao
huhao:$6$f.fM7ttOiXv/CNlS$kMV2LsMh61dBw2OMC25W2Ua/W3A8oucU27o9CAtdz.KFhUSHy9mRy5L7QEWq6ILc7N.BaHZzdf01hO7Sz3mvf0:20234:0:99999:7:::
centos 允许空密码用户登录,所以两个 !!,无法用 -U 选项解锁,所谓解锁,只针对于有密码的用户来说,但是,可以直接修改/etc/shadow 文件,将密码栏置空产生空密码用户。
[root@Rocky130 ~]$useradd -m king2
[root@Rocky130 ~]$getent shadow
king2:!!:20251:0:99999:7:::
[root@Rocky130 ~]$vipw -s
king2::20251:0:99999:7::: #删除!!
#此时就可以直接enter登录 但是不能远程登陆
(3)删除用户
#userdel 可删除Linux用户
userdel [options] LOGIN
#常见选项
-f|--force #强制删除,哪怕用户正在登录状态
-r|--remove #删除家目录和邮件目录
#范例
#创建用户并设置密码
[root@ubuntu ~]# useradd -m king
[root@ubuntu ~]# passwd king
New password:
Retype new password:
passwd: password updated successfully
#查看相关数据
[root@ubuntu ~]# id king
uid=1001(king) gid=1001(king) groups=1001(king)
[root@ubuntu ~]# ll /home/king -a
total 20
drwxr-x--- 2 king king 4096 Jun 12 20:37 ./
drwxr-xr-x 4 root root 4096 Jun 12 20:37 ../
-rw-r--r-- 1 king king 220 Mar 5 10:35 .bash_logout
-rw-r--r-- 1 king king 3771 Mar 5 10:35 .bashrc
-rw-r--r-- 1 king king 807 Mar 5 10:35 .profile
#在另一个终端登录king
$ id
uid=1001(king) gid=1001(king) groups=1001(king)
#删除登陆中的用户失败
[root@ubuntu ~]# userdel king
userdel: user king is currently used by process 9329
#强制删除
[root@ubuntu ~]# userdel -f king
userdel: user king is currently used by process 9329
[root@ubuntu ~]# id king
id: ‘king’: no such user
#报错
whoami
whoami: cannot find name for user ID 1001
id
uid=1001 gid=1001 groups=1001
#用户被删除后,其名下的文件无法显示属主属组,只能显示UID
[root@ubuntu ~]# ll /home/king -a
total 20
drwxr-x--- 2 king king 4096 Jun 12 20:37 ./
drwxr-xr-x 4 root root 4096 Jun 12 20:37 ../
-rw-r--r-- 1 king king 220 Mar 5 10:35 .bash_logout
-rw-r--r-- 1 king king 3771 Mar 5 10:35 .bashrc
-rw-r--r-- 1 king king 807 Mar 5 10:35 .profile
[root@ubuntu ~]# ll /home/king -a
total 28
drwxr-x--- 3 1001 1001 4096 Jun 12 20:39 ./
drwxr-xr-x 4 root root 4096 Jun 12 20:37 ../
-rw-r--r-- 1 1001 1001 220 Mar 5 10:35 .bash_logout
-rw-r--r-- 1 1001 1001 3771 Mar 5 10:35 .bashrc
drwx------ 2 1001 1001 4096 Jun 12 20:38 .cache/
-rw-r--r-- 1 1001 1001 807 Mar 5 10:35 .profile
#如果新建用户,使用了原用户的UID,则可以继承原用户文件
[root@ubuntu ~]# useradd -m -u 1001 king2
[root@ubuntu ~]# ls /home -al
total 20
drwxr-xr-x 5 root root 4096 Jun 12 20:56 .
drwxr-xr-x 20 root root 4096 May 26 18:10 ..
drwxr-x--- 5 huhao huhao 4096 Jun 12 20:21 huhao
drwxr-x--- 3 king2 king2 4096 Jun 12 20:39 king
drwxr-x--- 2 king2 king2 4096 Jun 12 20:56 king2
#另一个终端登录king2可以进入king的家目录
$ pwd
/home/king2
$ cd /home/king
$ pwd
/home/king
$ id
uid=1001 gid=1001 groups=1001
$ whoami
whoami: cannot find name for user ID 1001
[root@ubuntu ~]# userdel -rf king2
userdel: user king2 is currently used by process 9648
userdel: king2 mail spool (/var/mail/king2) not found
[root@ubuntu ~]# ls /home
huhao king
[root@ubuntu ~]# ls /home -al
total 16
drwxr-xr-x 4 root root 4096 Jun 12 21:01 .
drwxr-xr-x 20 root root 4096 May 26 18:10 ..
drwxr-x--- 5 huhao huhao 4096 Jun 12 20:21 huhao
drwxr-x--- 3 1001 1001 4096 Jun 12 20:39 king
(4)查看用户相关的ID信息
#id命令可以查看用户的UID,GID等信息、
id [OPTION]... [USER]
#常见选项
-a #显示详细信息,默认选项
-Z|--context #仅显示安全上下文信息,要开启selinux 配置才有
-g|--group #仅显示GID,就是只显示主组ID
-G|--groups #显示主组和附加组ID,就是所有组ID
-n|--name #显示用户名或组名,要组合使用 -nu|-ng|-nG
-u|--user #仅显示UID
#范例
[root@ubuntu ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@ubuntu ~]# id -a
uid=0(root) gid=0(root) groups=0(root)
[root@Rocky130 ~]$id -Z
id: --context (-Z) works only on an SELinux-enabled kernel
[root@ubuntu ~]# id -G
0
[root@ubuntu ~]# id -nu
root
[root@ubuntu ~]# id -u
0
[root@ubuntu ~]# id -u huhao
1000
[root@ubuntu ~]# id -Gn huhao
huhao adm cdrom sudo dip plugdev users
(5)切换用户或以其他用户身份执行命令
如果在当前登录终端中,要执行某条命令,但当前登录用户又没有可执行权限或没有某些资源权限;则在此种情况下,我们可以:
1. 让有权限的用户登录终端,再执行相应的操作。
2. 在当前终端终,临时切换,以有权限的用户的身份去执行命令。
#su命令可以切换用户身份,并且以指定用户的身份执行命令
su [options...] [-] [user [args...]]
#常见选项
-m|-p|--preserve-environment #不重置环境变量
-g|--group group #指定主组,只有root 切普通用户才能指定此参数
-|-l|--login #完全切换
-c|--command command #不切换用户,而是临时使用该用户权限和环境执行命令
--session-command command #使用上同 -c 选项,但不会创建会话
-f|--fast #向shell 传递 -f 选项(csh 或 tcsh)
-s|--shell shell #切换用户后,指定新环境的shell环境,必须在 /etc/shells 中存在
-P|--pty #开一个新的终端
切换用户的方式:
⚪ su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完全切换。
⚪ su - UserName:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换。
说明:root su至其他用户无须密码;非root用户切换时需要密码。
huhao@ubuntu129:~$ echo $BASHPID
2590
huhao@ubuntu129:~$ pstree -p
sshd(1648)───sshd-session(2544)───sshd-session(2589)───bash(2590)───pstree(2610)
huhao@ubuntu129:~$ su - root
[root@ubuntu129 ~]# echo $BASHPID
2619
[root@ubuntu129 ~]# pstree -p
sshd(1648)───sshd-session(2544)───sshd-session(2589)───bash(2590)───su(2618)───bash(2619)───pstree(2638)
[root@ubuntu129 ~]# su - huhao
huhao@ubuntu129:~$ echo $BASHPID
2640
huhao@ubuntu129:~$ pstree -p
sshd(1648)───sshd-session(2544)───sshd-session(2589)───bash(2590)───su(2618)───bash(2619)───su(2639)───bash(2640)───pstree(2659)
注意:su 切换新用户后,使用 exit 退回至旧的用户身份,而不要再用 su 切换至旧用户,否则会生成很多的bash子进程,环境可能会混乱。
#直接以另一个用户执行命令,而不切换用户
huhao@ubuntu:~$ su - king
Password:
king@ubuntu:~$ pwd
/home/king
king@ubuntu:~$ touch file.txt
king@ubuntu:~$ ls
file.txt
king@ubuntu:~$ exit
logout
#三步变一步 -c:不切换
huhao@ubuntu:~$ su - king -c "touch file2.txt"
Password:
huhao@ubuntu:~$
[root@ubuntu huhao]# ll /home/king
total 28
drwxr-x--- 3 king king 4096 Jun 13 16:08 ./
drwxr-xr-x 4 root root 4096 Jun 13 15:56 ../
-rw------- 1 king king 62 Jun 13 16:01 .bash_history
-rw-r--r-- 1 king king 220 Mar 5 10:35 .bash_logout
-rw-r--r-- 1 king king 3771 Mar 5 10:35 .bashrc
-rw-rw-r-- 1 king king 0 Jun 13 16:08 file2.txt
-rw-rw-r-- 1 king king 0 Jun 13 16:00 file.txt
drwxrwxr-x 3 king king 4096 Jun 13 15:56 .local/
-rw-r--r-- 1 king king 807 Mar 5 10:35 .profile
huhao@ubuntu:~$ id
uid=1000(huhao) gid=1000(huhao) groups=1000(huhao),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users)
huhao@ubuntu:~$ su - king
Password:
king@ubuntu:~$ id
uid=1001(king) gid=1001(king) groups=1001(king)
king@ubuntu:~$ exit
logout
#三步变一步
huhao@ubuntu:~$ su - king -c "id"
Password:
uid=1001(king) gid=1001(king) groups=1001(king)
huhao@ubuntu:~$
注意:使用 /sbin/nologin shell 的系统用户无法切换,ubnutn 中使用 /bin/false shell 的用户同样无法切换。
[root@ubuntu huhao]# id mysql
uid=110(mysql) gid=112(mysql) groups=112(mysql)
[root@ubuntu huhao]# getent passwd mysql
mysql:x:110:112:MySQL Server,,,:/nonexistent:/bin/false
[root@ubuntu huhao]# su - mysql
This account is currently not available.
##但可以指定可切换的Shell
[root@ubuntu ~]# su - mysql -s /bin/bash
su: warning: cannot change directory to /nonexistent: No such file or directory
mysql@ubuntu:/root$ id
uid=110(mysql) gid=112(mysql) groups=112(mysql)
mysql@ubuntu:/root$
Ubuntu默认普通用户
huhao@ubuntu:~$ sudo -i
[sudo] password for huhao:
[root@ubuntu ~]# nano /etc/ssh/sshd_config
->PermitRootLogin yes
[root@ubuntu ~]# systemctl restart sshd
[root@ubuntu ~]# passwd
New password:
Retype new password:
passwd: password updated successfully
#这样就可以通过root直接登录Ubuntu
(6)设置密码
#passwd 可以修改用户密码
passwd [OPTION...] <accountName>
#常用选项
-k|--keep-tokens #保持身份验证令牌不过期
-d|--delete #删除用户密码,也删除密码锁,仅root有权限操作
-l|--lock #锁定用户密码,仅root有权限操作
-u|--unlock #解锁用户密码,仅root有权限操作
-e|--expire #终止用户密码,此操作完成后,用户下次登录成功后要立马修改,仅root有权限操作
-f|--force #强制执行操作
-x|--maximum=DAYS #指定用户密码最长有效期,仅root有权限操作
-n|--minimum=DAYS #指定用户密码最短有效期,仅root有权限操作
-w|--warning=DAYS #在密码过期前多少天开始提醒用户,仅root有权限操作
-i|--inactive=DAYS #当密码过期后经过多少天该用户账号会被禁用,仅root有权限操作
-S|--status #查询用户的密码状态,仅root有权限操作
--stdin #从标准输入接收密码,Ubuntu无此选项
#普通用户修改自己密码,要先验证当前使用的密码
huhao@ubuntu:~$ passwd
Changing password for huhao.
Current password:
New password:
Retype new password:
passwd: password updated successfully
#root修改其它用户密码
[root@ubuntu huhao]# passwd huhao
New password:
Retype new password:
passwd: password updated successfully
#修改密码其实就是更新 /etc/shadow 文件
[root@ubuntu huhao]# ll /etc/shadow
-rw-r----- 1 root shadow 1150 Jun 13 16:42 /etc/shadow
#非交互式修改密码
#适于红帽系列的Linux版本
[root@Rocky130 ~]$echo "12345" | passwd --stdin huhao
Changing password for user huhao.
passwd: all authentication tokens updated successfully.
[root@Rocky130 ~]$passwd --stdin huhao <<< 123456
Changing password for user huhao.
passwd: all authentication tokens updated successfully.
##Ubuntu中 passwd 无 --stdin 选项
#此写法在centos中也支持,更通用
[root@ubuntu ~]# echo -e "12345\n12345" | passwd huhao
New password: Retype new password: passwd: password updated successfully
#设置用户下次必须更改密码
[root@ubuntu ~]# passwd -e king
passwd: password changed.
[root@ubuntu ~]# su king
You are required to change your password immediately (administrator enforced).
Changing password for king.
Current password:
New password:
Retype new password:
king@ubuntu:/root$
#范例
[root@ubuntu ~]# getent shadow huhao
huhao:$y$j9T$X/AUuEq6Ym17Kf1Zuw7fh/$hlyZ5qrc3hwO4ftTLmlAyW8AvYVnbp603Hemi2X3xLD:20252:0:99999:7:::
[root@ubuntu ~]# passwd -e huhao
passwd: password changed.
[root@ubuntu ~]# getent shadow huhao
huhao:$y$j9T$X/AUuEq6Ym17Kf1Zuw7fh/$hlyZ5qrc3hwO4ftTLmlAyW8AvYVnbp603Hemi2X3xLD:0:0:99999:7:::
#重新登陆
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for huhao.
Current password:
New password:
Retype new password:
passwd: password updated successfully
huhao:$y$j9T$X/AUuEq6Ym17Kf1Zuw7fh/$hlyZ5qrc3hwO4ftTLmlAyW8AvYVnbp603Hemi2X3xLD:20252:0:99999:7:::
(7)修改用户密码策略
#chage可以修改用户密码策略
chage [options] LOGIN
#常见选项
-d LAST_DAY #更改密码的时间
-m|--mindays MIN_DAYS
-M|--maxdays MAX_DAYS
-W|--warndays WARN_DAYS
-I|--inactive INACTIVE #密码过期后的宽限期
-E|--expiredate EXPIRE_DATE #用户的有效期
-l #显示密码策略
#范例
#查看用户密码策略
[root@ubuntu ~]# chage -l huhao
Last password change : Jun 13, 2025
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
[root@ubuntu ~]# getent shadow huhao
huhao:$y$j9T$tMKapXXfiYgxHWHHEGJEM/$H90Ol9k19FtMS2nY4TtKq8YmOT2dfjMPFgAXdVq60O0:20251:0:99999:7:::
[root@ubuntu ~]# chage huhao
Changing the aging information for huhao
Enter the new value, or press ENTER for the default
Minimum Password Age [0]:
Maximum Password Age [99999]:
Last Password Change (YYYY-MM-DD) [2025-06-12]: 2025-06-03
Password Expiration Warning [7]:
Password Inactive [-1]:
Account Expiration Date (YYYY-MM-DD) [-1]:
[root@ubuntu ~]# getent shadow huhao
huhao:$y$j9T$tMKapXXfiYgxHWHHEGJEM/$H90Ol9k19FtMS2nY4TtKq8YmOT2dfjMPFgAXdVq60O0:20241:0:99999:7:::
#只修改单项
[root@ubuntu ~]# chage -d 2025-6-13 huhao
[root@ubuntu ~]# getent shadow huhao
huhao:$y$j9T$tMKapXXfiYgxHWHHEGJEM/$H90Ol9k19FtMS2nY4TtKq8YmOT2dfjMPFgAXdVq60O0:20251:0:99999:7:::
四、组管理命令
组帐号维护命令:groupadd、groupmod、groupdel。
(1)创建组
#groupadd实现创建组
groupadd [options] GROUP
#常见选项
-f|--force #如果组已经存在则成功退出
-g|--gid GID #新建组时指定组ID,默认是系统分配,指定值不要超过[GID_MIN,GID_MAX]
-K|--key KEY=VALUE #不使用 /etc/login.defs 中的默认值,自己指定,比如 -K GID_MIN=100
-o|--non-unique #允许创建有重复 GID 的组
-p|--password PASSWORD #为新组使用此加密过的密码,这里要用加密后的密文,不然就是直接是明文
在/etc/gshadow 里面
-r|--system #创建一个系统组 CentOS 6之前: ID<500,CentOS 7以后: ID<1000
#范例
[root@ubuntu ~]# groupadd -g 48 -r apache
[root@ubuntu ~]# getent group apache
apache:x:48:
#不加 -f 会提示已存在
[root@ubuntu ~]# groupadd -g 48 -r apache
groupadd: group 'apache' already exists
#-f 不提示直接结束
[root@ubuntu ~]# groupadd -f -g 48 -r apache
(2)修改组
#groupmod 组属性修改
groupmod [options] GROUP
#常见选项
-g|--gid GID #将组 ID 改为 GID
-n|--new-name NEW_GROUP #改名为 NEW_GROUP
-o|--non-unique #允许使用重复的 GID
-p|--password PASSWORD #将密码更改为(加密过的) PASSWORD
#范例
[root@ubuntu ~]# getent group apache
apache:x:48:
#修改组ID为123
[root@ubuntu ~]# groupmod -g 123 apache
[root@ubuntu ~]# getent group apache
apache:x:123:
#将apahce改名为apache2
[root@ubuntu ~]# groupmod -n apache2 apache
[root@ubuntu ~]# getent group apache
[root@ubuntu ~]# getent group apache2
apache2:x:123:
(3)组删除
删除组:如果该组下有用户将组作为主组,则不能删除。
删除用户:会把与其同ID的主组也给删了,前提是该组下没有其它用户。
#groupdel 可以删除组
groupdel [options] GROUP
#常见选项
-f|--force #强制删除,即使是用户的主组也强制删除组,但会导致无主组的用户不可用无法登录
#范例
[root@ubuntu ~]# groupdel apache2
#针对于组下存在用户
#创建用户时默认创建跟用户名相同的私有组
[root@ubuntu ~]# id king
uid=1001(king) gid=1001(king) groups=1001(king)
[root@ubuntu ~]# getent group king
king:x:1001:
[root@ubuntu ~]# groupdel king
groupdel: cannot remove the primary group of user 'king'
#-f 强制删除
[root@ubuntu ~]# groupdel -f king
[root@ubuntu ~]# id king
uid=1001(king) gid=1001 groups=1001
(4)更改组成员和密码
组没有密码的情况下,加组只能由root来操作。
#gpasswd 命令,可以更改组密码,也可以修改附加组的成员关系
gpasswd [option] GROUP
#常见选项
-a|--add USER #向组中添加用户
-d|--delete USER #从组中移除用户
-r|--delete-password #删除组密码
-R|--restrict #向其成员限制访问组 GROUP
-M|--members USER,... #批量加组
-A|--administrators ADMIN,... #批量设组管理员
#范例
[root@ubuntu ~]# useradd -m xiaohu
[root@ubuntu ~]# id xiaohu
uid=1002(xiaohu) gid=1002(xiaohu) groups=1002(xiaohu),1001(group1)
[root@ubuntu ~]# groups xiaohu
xiaohu : xiaohu
#创建新组
[root@ubuntu ~]# groupadd group1
[root@ubuntu ~]# getent group group1
group1:x:1001:
[root@ubuntu2204 ~]# getent gshadow group1
group1:!::
#给用户加组
[root@ubuntu ~]# gpasswd -a xiaohu group1
Adding user xiaohu to group group1
#查看用户的组
[root@ubuntu ~]# id xiaohu
uid=1002(xiaohu) gid=1002(xiaohu) groups=1002(xiaohu),1001(group1)
[root@ubuntu ~]# getent group group1
group1:x:1001:xiaohu
#设置组密码
[root@ubuntu ~]# gpasswd group1
Changing the password for group group1
New Password:
Re-enter new password:
[root@ubuntu ~]# getent gshadow group1
group1:$y$j9T$613y2QqHLDraDyNY.gJ1g.$rieoxS4HMqthluuY9T1bK.jigTVU6Rr0TOb6D5glPT9::xiaohu
#移除组用户
[root@ubuntu ~]# gpasswd -d xiaohu group1
Removing user xiaohu from group group1
[root@ubuntu ~]# id xiaohu
uid=1002(xiaohu) gid=1002(xiaohu) groups=1002(xiaohu)
[root@ubuntu ~]# groups xiaohu
xiaohu : xiaohu
(5)更改和查看组成员
#groupmems 可以管理附加组的成员关系
groupmems [options] [action]
#常见选项
-g|--group groupname #更改为指定组 (只有root)
-a|--add username #指定用户加入组
-d|--delete username #从组中删除用户
-p|--purge #从组中清除所有成员
-l|--list #显示组成员列表
#范例
#列出以group1 组为附加组的用户
[root@ubuntu huhao]# groupmems -g group1 -l
#将xiaohu加到group1 组
[root@ubuntu huhao]# groupmems -g group1 -a xiaohu
[root@ubuntu huhao]# groupmems -g group1 -l
xiaohu
[root@ubuntu huhao]# id xiaohu
uid=1002(xiaohu) gid=1002(xiaohu) groups=1002(xiaohu),1001(group1)
#groups 可查看用户组关系
#查看用户所属组列表
groups [OPTION].[USERNAME]...
#临时切换组
#newgrp [-] [group]
#临时切换用户组,这里就要用到上面gpasswd 给组设置的密码
#普通用户切组需要密码,root用户切组不需要密码
newprp huhao #切换之后创建的文件属组就是huhao
五、文件权限管理
(1)Linux中的权限体系介绍
在Linux系统中,一切皆文件,对文件来讲,系统中的用户,分属于三类不同的角色,分别是属主,属组,其它用户;而每个角色用户,对该文件的权限,也分三种,分别是读,写,执行。
角色 | 英文表示 | 字符表示 |
属主:所有者 | owner | OWNER | user | u |
属组:属于哪个组 | group | GROUP | g |
其他用户:不是所有者,也不再属组中的用户 | other | OTHER | o |
权限 | 英文表示 | 字符表示 | 八进制表示 |
读权限 | read | Readable | r | 4 |
写权限 | write | Writable | w | 2 |
执行权限 | execute | Excutable | x | 1 |
程序访问文件时的权限,取决于此程序的发起者:
⚪ 进程的发起者,同文件的属主:则应用文件属主权限
⚪ 进程的发起者,属于文件属组;则应用文件属组权限
⚪ 应用文件“其它”权限
(2)文件所有者和组属性操作
① 设置文件的所有者chown
#chown 命令可以修改文件的属主,也可以修改文件属组
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
#用法说明
OWNER #只修改所有者
OWNER:GROUP #同时修改所有者和属组
:GROUP #只修改属组,冒号也可用 . 替换
#常用选项
-c|--changes #同-v选项,但只显示更新成功的信息
-f|--silent|--quiet #不显示错误信息
-v|--verbose #显示过程
--dereference #修改的是符号链接指向的文件,而不是链接文件本身
-h|--no-dereference #修改的是符号链接文件,而不是其指向的目标文件(只有当前系统支持修改符号链接文件属性时,此项才有效)
--from=user:group #根据原属主属组来修改,相当于一个查询条件
--no-preserve-root #不特别对待“/”,意思就是将根目录当成普通目录来执行,默认如此,所以不要对根目录进行操作
--preserve-root #不允许在"/"上递归操作
--reference=RFILE #根据其它文件权限来操作,就是复制该文件的属主属组信息给指定文件
-R|--recursive #递归操作
#下列选项配合 -R 使用
-H #如果参数是指向目录的软链接,则只修改指向的目录,不改变目录里面文件的属主属组
-L #更改所有遇到的符号链接指向的目录
-P #不更改符号链接指向的目录
#范例 - 修改属主
[root@ubuntu 0615]# ll
total 0
-rw-r--r-- 1 root root 0 Jun 15 17:13 a1.txt
-rw-r--r-- 1 root root 0 Jun 15 17:13 a2.txt
-rw-r--r-- 1 root root 0 Jun 15 17:13 a3.txt
-rw-r--r-- 1 root root 0 Jun 15 17:13 a4.txt
-rw-r--r-- 1 root root 0 Jun 15 17:13 a5.txt
#只修改属主
[root@ubuntu 0615]# chown king a1.txt
#同时修改属主和属组(两种写法)
[root@ubuntu 0615]# chown king: a2.txt
[root@ubuntu 0615]# chown king. a2.txt
#查看
[root@ubuntu 0615]# chown king: a2.txt
[root@ubuntu 0615]# ll
total 0
-rw-r--r-- 1 king root 0 Jun 15 17:13 a1.txt
-rw-r--r-- 1 king king 0 Jun 15 17:13 a2.txt
-rw-r--r-- 1 root root 0 Jun 15 17:13 a3.txt
-rw-r--r-- 1 root root 0 Jun 15 17:13 a4.txt
-rw-r--r-- 1 root root 0 Jun 15 17:13 a5.txt
#上述写法,使用的组,是属主用户的主组
[root@ubuntu 0615]# id king
uid=1001(king) gid=1002(king) groups=1002(king)
[root@ubuntu 0615]# groupadd -g 123 g1
[root@ubuntu 0615]# usermod -g 123 king
[root@ubuntu 0615]# id king
uid=1001(king) gid=123(g1) groups=123(g1)
[root@ubuntu 0615]# chown king: a3.txt
[root@ubuntu 0615]# ll
total 0
-rw-r--r-- 1 king root 0 Jun 15 17:13 a1.txt
-rw-r--r-- 1 king king 0 Jun 15 17:13 a2.txt
-rw-r--r-- 1 king g1 0 Jun 15 17:13 a3.txt
-rw-r--r-- 1 root root 0 Jun 15 17:13 a4.txt
-rw-r--r-- 1 root root 0 Jun 15 17:13 a5.txt
#用户必须存在
[root@ubuntu 0615]# chown queen a4.txt
chown: invalid user: ‘queen’
#使用UID来修改属主,UID不支持省略写法
[root@ubuntu 0615]# chown 1000 a4.txt
[root@ubuntu 0615]# ll
total 0
-rw-r--r-- 1 king root 0 Jun 15 17:13 a1.txt
-rw-r--r-- 1 king king 0 Jun 15 17:13 a2.txt
-rw-r--r-- 1 king g1 0 Jun 15 17:13 a3.txt
-rw-r--r-- 1 huhao root 0 Jun 15 17:13 a4.txt
-rw-r--r-- 1 root root 0 Jun 15 17:13 a5.txt
#UID不支持 : , .同时修改属主属组写法
[root@ubuntu 0615]# chown 1000: a5.txt
chown: invalid spec: ‘1000:’
[root@ubuntu 0615]# chown 1000. a5.txt
chown: invalid user: ‘1000.’
#可支持不存在的UID
[root@ubuntu 0615]# chown 12345 a5.txt
[root@ubuntu 0615]# ll
total 0
-rw-r--r-- 1 king root 0 Jun 15 17:13 a1.txt
-rw-r--r-- 1 king king 0 Jun 15 17:13 a2.txt
-rw-r--r-- 1 king g1 0 Jun 15 17:13 a3.txt
-rw-r--r-- 1 huhao root 0 Jun 15 17:13 a4.txt
-rw-r--r-- 1 12345 root 0 Jun 15 17:13 a5.txt
# - 修改属组
[root@ubuntu 0615]# chown :king b1.txt
[root@ubuntu 0615]# chown .king b1.txt
#查看
[root@ubuntu 0615]# ll
total 0
-rw-r--r-- 1 root king 0 Jun 15 17:51 b1.txt
-rw-r--r-- 1 root root 0 Jun 15 17:51 b2.txt
-rw-r--r-- 1 root root 0 Jun 15 17:51 b3.txt
#使用gid修改
[root@ubuntu 0615]# id king
uid=1003(king) gid=1004(king) groups=1004(king)
[root@ubuntu 0615]# chown :1004 b2.txt
[root@ubuntu 0615]# ll
total 0
-rw-r--r-- 1 root king 0 Jun 15 17:51 b1.txt
-rw-r--r-- 1 root king 0 Jun 15 17:51 b2.txt
-rw-r--r-- 1 root root 0 Jun 15 17:51 b3.txt
#同样如果是用户前提得是存在的 如果是数字则都可以
[root@ubuntu 0615]# chown :xiaohu b3.txt
chown: invalid group: ‘:xiaohu’
[root@ubuntu 0615]# chown :67890 b3.txt
[root@ubuntu 0615]# ll
total 0
-rw-r--r-- 1 root king 0 Jun 15 17:51 b1.txt
-rw-r--r-- 1 root king 0 Jun 15 17:51 b2.txt
-rw-r--r-- 1 root 67890 0 Jun 15 17:51 b3.txt
# - 同时修改
[root@ubuntu 0615]# chown king:queen c1.txt
[root@ubuntu 0615]# ll
total 0
-rw-r--r-- 1 king queen 0 Jun 15 19:46 c1.txt
-rw-r--r-- 1 root root 0 Jun 15 19:46 c2.txt
-rw-r--r-- 1 root root 0 Jun 15 19:46 c3.txt
[root@ubuntu 0615]# chown A:B c2.txt
chown: invalid user: ‘A:B’
[root@ubuntu 0615]# chown 456:789 c2.txt
[root@ubuntu 0615]# ll
total 0
-rw-r--r-- 1 king queen 0 Jun 15 19:46 c1.txt
-rw-r--r-- 1 456 789 0 Jun 15 19:46 c2.txt
-rw-r--r-- 1 root root 0 Jun 15 19:46 c3.txt
[root@ubuntu 0615]#
#用户名属主 组id可以搭配混合使用
[root@ubuntu129 0702]# id king
uid=1001(king) gid=1001(king) groups=1001(king)
[root@ubuntu129 0702]# chown king:1001 b3.txt
-rw-r--r-- 1 king king 0 Jul 2 15:43 b3.txt
#范例
[root@ubuntu 0615]# chown 123:456 f1.txt
[root@ubuntu 0615]# ll
total 0
-rw-r--r-- 1 123 456 0 Jun 15 19:50 f1.txt
-rw-r--r-- 1 root root 0 Jun 15 19:50 f2.txt
-rw-r--r-- 1 root root 0 Jun 15 19:50 f3.txt
#--reference
[root@ubuntu 0615]# chown --reference=f1.txt f2.txt
[root@ubuntu 0615]# ll
total 0
-rw-r--r-- 1 123 456 0 Jun 15 19:50 f1.txt
-rw-r--r-- 1 123 456 0 Jun 15 19:50 f2.txt
-rw-r--r-- 1 root root 0 Jun 15 19:50 f3.txt
[root@ubuntu 0615]# ln -sv f3.txt f3.txt.link
'f3.txt.link' -> 'f3.txt'
[root@ubuntu 0615]# ll
total 0
-rw-r--r-- 1 123 456 0 Jun 15 19:50 f1.txt
-rw-r--r-- 1 123 456 0 Jun 15 19:50 f2.txt
-rw-r--r-- 1 root root 0 Jun 15 19:50 f3.txt
lrwxrwxrwx 1 root root 6 Jun 15 19:56 f3.txt.link -> f3.txt
#默认--dereference
[root@ubuntu 0615]# chown king:queen f3.txt.link
[root@ubuntu 0615]# ll
total 0
-rw-r--r-- 1 123 456 0 Jun 15 19:50 f1.txt
-rw-r--r-- 1 123 456 0 Jun 15 19:50 f2.txt
-rw-r--r-- 1 king queen 0 Jun 15 19:50 f3.txt
lrwxrwxrwx 1 root root 6 Jun 15 19:56 f3.txt.link -> f3.txt
#-h
[root@ubuntu 0615]# chown -h king:queen f3.txt.link
[root@ubuntu 0615]# ll
total 0
-rw-r--r-- 1 123 456 0 Jun 15 19:50 f1.txt
-rw-r--r-- 1 123 456 0 Jun 15 19:50 f2.txt
-rw-r--r-- 1 king queen 0 Jun 15 19:50 f3.txt
lrwxrwxrwx 1 king queen 6 Jun 15 19:56 f3.txt.link -> f3.txt
#当属主或属组是123时,将文件的属主改为queen
[root@ubuntu 0615]# chown queen: --from=123 *
[root@ubuntu 0615]# ll
total 0
-rw-r--r-- 1 queen queen 0 Jun 15 19:50 f1.txt
-rw-r--r-- 1 queen queen 0 Jun 15 19:50 f2.txt
-rw-r--r-- 1 king queen 0 Jun 15 19:50 f3.txt
lrwxrwxrwx 1 king queen 6 Jun 15 19:56 f3.txt.link -> f3.txt
[root@ubuntu 0615]# chown 123:456 --from=queen *
[root@ubuntu 0615]# ll
total 0
-rw-r--r-- 1 123 456 0 Jun 15 19:50 f1.txt
-rw-r--r-- 1 123 456 0 Jun 15 19:50 f2.txt
-rw-r--r-- 1 king queen 0 Jun 15 19:50 f3.txt
lrwxrwxrwx 1 king queen 6 Jun 15 19:56 f3.txt.link -> f3.txt
#-R 递归修改
[root@ubuntu 0615]# tree
.
└── dira
├── dirb
│ ├── dirc
│ ├── xa
│ ├── xb
│ ├── xc
│ └── xd
├── f1
├── f2
└── f3
4 directories, 7 files
[root@ubuntu 0615]# chown king:queen dira
[root@ubuntu 0615]# ll
total 4
drwxr-xr-x 3 king queen 4096 Jun 15 20:13 dira
[root@ubuntu 0615]# ll dira
total 4
drwxr-xr-x 3 root root 4096 Jun 15 20:13 dirb
-rw-r--r-- 1 root root 0 Jun 15 20:13 f1
-rw-r--r-- 1 root root 0 Jun 15 20:13 f2
-rw-r--r-- 1 root root 0 Jun 15 20:13 f3
[root@ubuntu 0615]# chown -R king:queen dira
[root@ubuntu 0615]# ll
total 4
drwxr-xr-x 3 king queen 4096 Jun 15 20:13 dira
[root@ubuntu 0615]# ll dira
total 4
drwxr-xr-x 3 king queen 4096 Jun 15 20:13 dirb
-rw-r--r-- 1 king queen 0 Jun 15 20:13 f1
-rw-r--r-- 1 king queen 0 Jun 15 20:13 f2
-rw-r--r-- 1 king queen 0 Jun 15 20:13 f3
[root@ubuntu 0615]# ll dira/dirb
total 4
drwxr-xr-x 2 king queen 4096 Jun 15 20:12 dirc
-rw-r--r-- 1 king queen 0 Jun 15 20:13 xa
-rw-r--r-- 1 king queen 0 Jun 15 20:13 xb
-rw-r--r-- 1 king queen 0 Jun 15 20:13 xc
-rw-r--r-- 1 king queen 0 Jun 15 20:13 xd
② 设置文件的属组信息chgrp
#chgrp 命令可以只修改文件的属组
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...
#常用选项
-c|--changes #同-v选项,但只显示更新成功的信息
-f|--silent|--quiet #不显示错误信息
-v|--verbose #显示过程
--dereference #修改的是符号链接指向的文件,而不是链接文件本身
-h|--no-dereference #修改的是符号链接文件,而不是其指向的目标文件(只有当前系统支持修改符号链接文件属性时,此项才有效)
--no-preserve-root #不特别对待“/”,意思就是将家目录当成普通目录来执行,默认如此,所以不要对根目录进行操作
--preserve-root #不允许在"/"上递归操作
--reference=RFILE #根据其它文件权限来操作,就是复制该文件的属主属组信息给指定文件
-R|--recursive #递归操作
#下列选项配合 -R 使用,
-H #如果参数是指向目录的软链接,则只修改指向的目录,不改变目录里面文件的属主属组
-L #更改所有遇到的符号链接指向的目录
-P #不更改符号链接指向的目录
(3)文件权限
① 文件权限说明
角色 | 在命令中的字符 | 备注 |
owner | u | 属主 |
group | g | 属组 |
other | o | 其他用户 |
all | a | 所有人,包括属主属组和其他用户 |
在命令中的字符 | 备注 |
+ | 增加某些权限 |
- | 删除某些权限 |
= | 只保留某些权限,覆盖写法 |
权限 | 在命令中的字符 | 八进制数字表示 | 备注 |
Readable | r | 4 | 读权限 |
Writable | w | 2 | 写权限 |
Excutable | x | 1 | 主执行权限 |
#常用写法
u+r #属主加读权限
g-x #属组去掉执行权限
ug=rx #属主属组权限改为读和执行
o= #other用户无任何权限
a=rwx #所有用户都有读写执行权限
注意:
⚪ 当用户尝试访问文件时,系统会按以下顺序检查权限 -> 如果用户是文件的所有者:使用所有者权限;如果用户在文件的所属组中:使用组权限;其他情况:使用其他用户(Others)权限。最终权限是第一个匹配的身份对应的权限。
⚪ 用户的最终权限,是从左向右进行顺序匹配,即,所有者,所属组,其他人,一旦匹配权限立即生效,不再向右查看其权限。
⚪ root用户默认拥有对所有文件的完全控制权(读、写、执行),不受文件权限限制。即使是 - - - - - - - - - 无任何权限,也可以继续操作。而文件限制主要针对非root用户起作用。
权限 | 对文件 | 对目录 |
r | 可查看文件内容 | 可读取目录中的文件名,但文件元数据无法查看 |
w | 可修改文件内容 | 可在目录中创建文件和删除文件 |
x | 可执行,发起为一个进程 | 可进入目录,可查看文件元数据,可查看文件内容,属于目录最小权限 |
面试题
问题1:Linux中的目录和文件的权限区别?分别说明读,写和执行权限的区别?
答:文件权限直接控制对文件内容的操作,而目录权限控制对目录内文件/子目录的元数据操(如列出、进入、删除等)。
文件 | 目录 | |
r | 允许查看文件内容 | 允许列出目录内容 |
w | 允许修改文件内容 | 允许增删目录内文件/子目录 |
x | 允许执行文件 | 允许进入目录,访问其内容 |
② 修改文件权限chmod
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
#常用选项
-c|--changes #同-v选项,但只显示更新成功的信息
-f|--silent|--quiet #不显示错误信息
-v|--verbose #显示过程
--no-preserve-root #不特别对待“/”,意思就是将家目录当成普通目录来执行,默认如此,所以不要对根目录进行操作
--preserve-root #不允许在"/"上递归操作
--reference=RFILE #根据其它文件权限来操作,就是复制该文件的权限信息给指定文件
-R|--recursive #递归操作
#MODE
who opt permisson
who # u|g|o|a
opt # +|-|=
permission # r|w|x
#范例 - 修改权限
[root@ubuntu129 0702]# ll
total 0
-rw-r--r-- 1 root root 0 Jul 2 17:36 a1
-rw-r--r-- 1 root root 0 Jul 2 17:36 a2
-rw-r--r-- 1 root root 0 Jul 2 17:36 a3
-rw-r--r-- 1 root root 0 Jul 2 17:36 a4
-rw-r--r-- 1 root root 0 Jul 2 17:36 a5
[root@ubuntu129 0702]# chmod a= a1
---------- 1 root root 0 Jul 2 17:42 a1
[root@ubuntu129 0702]# chmod u=r,g=w,o=x a2
-r---w---x 1 root root 0 Jul 2 17:42 a2*
[root@ubuntu129 0702]# chmod u+x,g-r,o-r a3
-rwx------ 1 root root 0 Jul 2 17:42 a3*
[root@ubuntu129 0702]# chmod u=,g=rx,o=w a4
----r-x-w- 1 root root 0 Jul 2 17:42 a4*
[root@ubuntu129 0702]# chmod ugo=rwx,u=rx,g-r,o= a5
-r-x-wx--- 1 root root 0 Jul 2 17:42 a5*
#数字写法
[root@ubuntu129 0702]# ll
total 0
-rw-r--r-- 1 root root 0 Jul 2 17:55 b1
-rw-r--r-- 1 root root 0 Jul 2 17:55 b2
-rw-r--r-- 1 root root 0 Jul 2 17:55 b3
-rw-r--r-- 1 root root 0 Jul 2 17:55 b4
-rw-r--r-- 1 root root 0 Jul 2 17:55 b5
[root@ubuntu129 0702]# chmod 777 b1
-rwxrwxrwx 1 root root 0 Jul 2 17:55 b1*
[root@ubuntu129 0702]# chmod 000 b2 = chmod 0 b2
---------- 1 root root 0 Jul 2 17:55 b2
[root@ubuntu129 0702]# chmod 761 b3
-rwxrw---x 1 root root 0 Jul 2 17:55 b3*
#注意:两种形式不可混用!
[root@ubuntu129 0702]# chmod u+7 b4
chmod: invalid mode: ‘u+7’
Try 'chmod --help' for more information.
#递归操作
[root@ubuntu129 0702]# tree
.
└── dira
├── x1
├── x2
└── x3
2 directories, 3 files
[root@ubuntu129 0702]# chmod 0 dira -R
[root@ubuntu129 dira]# ll
total 0
---------- 1 root root 0 Jul 2 18:12 x1
---------- 1 root root 0 Jul 2 18:12 x2
---------- 1 root root 0 Jul 2 18:12 x3
#目录权限
[root@ubuntu129 tmp]# ll -d dira
drwxr-xr-x 2 root root 80 Jul 3 09:16 dira/
[root@ubuntu129 tmp]# ll dira/
total 0
-rw-r--r-- 1 root root 0 Jul 3 09:16 a1
-rw-r--r-- 1 root root 0 Jul 3 09:16 a2
#去掉目录所有权限
[root@ubuntu129 tmp]# chmod a= dira
[root@ubuntu129 tmp]# ll -d dira
d--------- 2 root root 80 Jul 3 09:16 dira/
huhao@ubuntu129:/tmp$ ls dira
ls: cannot open directory 'dira': Permission denied
huhao@ubuntu129:/tmp$ cat dira/a1
cat: dira/a1: Permission denied
huhao@ubuntu129:/tmp$ stat dira/a1
stat: cannot statx 'dira/a1': Permission denied
huhao@ubuntu129:/tmp$ rm -f dira/a1
rm: cannot remove 'dira/a1': Permission denied
huhao@ubuntu129:/tmp$ cd dira
-bash: cd: dira: Permission denied
#+r权限
[root@ubuntu129 tmp]# chmod o+r dira
[root@ubuntu129 tmp]# ll -d dira
d------r-- 2 root root 80 Jul 3 09:16 dira/
huhao@ubuntu129:/tmp$ ls dira
ls: cannot access 'dira/a2': Permission denied
ls: cannot access 'dira/a1': Permission denied
a1 a2
huhao@ubuntu129:/tmp$ cat dira/a1
cat: dira/a1: Permission denied
huhao@ubuntu129:/tmp$ stat dira/a1
stat: cannot statx 'dira/a1': Permission denied
huhao@ubuntu129:/tmp$ rm -f dira/a1
rm: cannot remove 'dira/a1': Permission denied
huhao@ubuntu129:/tmp$ cd dira
-bash: cd: dira: Permission denied
#+w权限
[root@ubuntu129 tmp]# chmod o+w dira
[root@ubuntu129 tmp]# ll -d dira
d------rw- 2 root root 80 Jul 3 09:16 dira/
huhao@ubuntu129:/tmp$ ll dira
ls: cannot access 'dira/.': Permission denied
ls: cannot access 'dira/..': Permission denied
ls: cannot access 'dira/a2': Permission denied
ls: cannot access 'dira/a1': Permission denied
total 0
d????????? ? ? ? ? ? ./
d????????? ? ? ? ? ? ../
-????????? ? ? ? ? ? a1
-????????? ? ? ? ? ? a2
huhao@ubuntu129:/tmp$ cat dira/a1
cat: dira/a1: Permission denied
huhao@ubuntu129:/tmp$ cd dira
-bash: cd: dira: Permission denied
#+x权限
[root@ubuntu129 tmp]# chmod o+x dira
[root@ubuntu129 tmp]# ll -d dira
d------rwx 2 root root 80 Jul 3 09:16 dira/
huhao@ubuntu129:/tmp$ ll dira
total 8
d------rwx 2 root root 80 Jul 3 09:16 ./
drwxrwxrwt 14 root root 280 Jul 3 09:16 ../
-rw-r--r-- 1 root root 4 Jul 3 09:21 a1
-rw-r--r-- 1 root root 4 Jul 3 09:22 a2
huhao@ubuntu129:/tmp$ cd dira
huhao@ubuntu129:/tmp/dira$ ls
a1 a2
huhao@ubuntu129:/tmp/dira$ cat a1
223
huhao@ubuntu129:/tmp/dira$ echo "111">a1
-bash: a1: Permission denied
#文件所属主是root 但当前用户huhao是其他用户 文件本省权限限制此操作
huhao@ubuntu129:/tmp/dira$ rm -f a1
huhao@ubuntu129:/tmp/dira$ ls
a2
huhao@ubuntu129:/tmp/dira$ touch c1
huhao@ubuntu129:/tmp/dira$ ls
a2 c1
面试题
问题:执行 cp /etc/issue /data/dir/ 所需要的最小权限?
答:/bin/cp —— 需要x权限
/etc/ —— 需要x权限
/etc/issue —— 需要r权限
/data —— 需要x权限
/data/dir —— 需要w,x权限
(4)新建文件和目录的默认权限
在linux 系统中,新建文件或目录,都有一个默认权限,umask 值间接影响新建文件和新建目录的权限。非特权用户umask默认是 002,root的umask 默认是 022。
⚪ 新建文件:666-umask,按位对应相减,如果所得结果某位存在执行(奇数)权限,则该位+1。(新建的文件,默认永远都不会有执行权限;基于安全考虑,系统会认为文件有执行权限是危险的)
⚪ 新建目录:777-umask。
#显示或设定文件模式掩码
umask [-p] [-S] [mode]
-p #如果省略 MODE 模式,以可重用为输入的格式输入
-S #以字符显示
[root@ubuntu129 0703]# ll
drwxr-xr-x 2 root root 40 Jul 3 15:01 dira/
-rw-r--r-- 1 root root 0 Jul 3 15:01 f1
huhao@ubuntu129:/tmp$ ll
drwxrwxr-x 2 huhao huhao 40 Jul 3 15:03 dirb
-rw-rw-r-- 1 huhao huhao 0 Jul 3 15:03 f2
#查看mask
[root@ubuntu129 0703]# umask
0022
huhao@ubuntu129:/tmp$ umask
0002
#修改mask
[root@ubuntu129 0703]# umask 0
[root@ubuntu129 0703]# umask
0000
[root@ubuntu129 0703]# touch f1
[root@ubuntu129 0703]# mkdir dira
[root@ubuntu129 0703]# ll
total 0
drwxrwxrwx 2 root root 40 Jul 3 15:15 dira/
-rw-rw-rw- 1 root root 0 Jul 3 15:15 f1
[root@ubuntu129 0703]# umask u=rw,g=r,o=
[root@ubuntu129 0703]# umask
0137
[root@ubuntu129 0703]# umask -p
umask 0022
[root@ubuntu129 0703]# umask -S
u=rwx,g=rx,o=rx
持久保存umask
⚪ 全局设置: /etc/bashrc , /etc/bash.bashrc(ubuntu)
⚪ 用户设置:~/.bashrc
#范例
[root@ubuntu129 0703]# umask
0022
[root@ubuntu129 0703]# umask 666;touch a1
[root@ubuntu129 0703]# ll
total 0
drwxr-xr-x 2 root root 60 Jul 3 15:27 ./
drwxrwxrwt 15 root root 320 Jul 3 15:03 ../
---------- 1 root root 0 Jul 3 15:27 a1
[root@ubuntu129 0703]# umask
0666
#为了解决如上问题 可以采用如下写法
[root@ubuntu129 0703]# umask
0022
[root@ubuntu129 0703]# (umask 666;touch s1)
[root@ubuntu129 0703]# ll
total 0
drwxr-xr-x 2 root root 60 Jul 3 15:29 ./
drwxrwxrwt 15 root root 320 Jul 3 15:03 ../
---------- 1 root root 0 Jul 3 15:29 s1
[root@ubuntu129 0703]# umask
0022
(5)Linxu文件系统上的特殊权限
在Linux中,除了rwx 这三种常⻅的权限之外,还有三个特殊权限,分别是 SUID, SGID,Sticky,三个特殊权限独⽴于rwx权限体系。
⚪ SUID:作用于二进制可执行文件上,用户将继承此程序所有者的权限。
⚪ SGID:作用于二进制可执行文件上,用户将继承此程序所有组的权限;作用于目录上,此目录中新建的文件的所属组将自动从此目录继承。
⚪ STICKY:作用于目录上,此目录中的文件只能由所有者自已来删除。
权限 | 字符表示 | 八进制表示 | 备注 |
SUID | s | 4 | 如果原属主没有可执行权限,再加SUID权限,则显示为S |
SGID | s | 2 | 如果原属组没有可执行权限,再加SGID权限,则显示为S |
STICKY | t | 1 | 如果other没有可执行权限,再加STICKY权限,则显示为T |
[root@ubuntu129 0703]# which passwd
/usr/bin/passwd
[root@ubuntu129 0703]# ll /usr/bin/passwd
-rwsr-xr-x 1 root root 93640 Dec 2 2024 /usr/bin/passwd*
[root@ubuntu129 0703]# ll /etc/shadow
-rw-r----- 1 root shadow 1105 Jul 2 15:43 /etc/shadow
[root@ubuntu129 0703]# getent shadow huhao
huhao:$y$j9T$/7odf5KMEPKX7C3.FLPMO/$xxQrIe7Tv/dY.Qd5vMZru7ASwqtcV0YgUUXLemljhE8:20264:0:99999:7:::
huhao@ubuntu129:~$ ll /etc/shadow
-rw-r----- 1 root shadow 1105 Jul 2 15:43 /etc/shadow
huhao@ubuntu129:~$ passwd
Changing password for huhao.
Current password:
New password:
Retype new password:
passwd: password updated successfully
[root@ubuntu129 0703]# ll /etc/shadow
-rw-r----- 1 root shadow 1105 Jul 3 15:40 /etc/shadow
[root@ubuntu129 0703]# getent shadow huhao
huhao:$y$j9T$1gjcI7VvA2MCLMOd.1wyE.$ovBy9MX505mrRrjc5ZAjyHnfFyamFBl1cKmc9ceh4N3:20272:0:99999:7:::
[root@ubuntu129 0703]# which cat
/usr/bin/cat
[root@ubuntu129 0703]# ll /usr/bin/{cat,tail,passwd}
-rwxr-xr-x 1 root root 43560 Feb 11 15:30 /usr/bin/cat*
-rwsr-xr-x 1 root root 93640 Dec 2 2024 /usr/bin/passwd*
-rwxr-xr-x 1 root root 76400 Feb 11 15:30 /usr/bin/tail*
huhao@ubuntu129:~$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[root@ubuntu129 0703]# ps aux | grep tail
huhao 16396 0.0 0.1 8904 2080 pts/1 S+ 15:45 0:00 tail -f /etc/fstab
root 16398 0.0 0.1 9872 2484 pts/0 S+ 15:46 0:00 grep --color=auto tail
[root@ubuntu129 0703]# ll /etc/shadow
-rw-r----- 1 root shadow 1105 Jul 3 15:40 /etc/shadow
[root@ubuntu129 0703]# ll /usr/bin/tail
-rwxr-xr-x 1 root root 76400 Feb 11 15:30 /usr/bin/tail*
huhao@ubuntu129:~$ tail -f /etc/shadow
tail: cannot open '/etc/shadow' for reading: Permission denied
tail: no files remaining
huhao@ubuntu129:~$ cat /etc/fstab
huhao@ubuntu129:~$ tail -f /etc/fstab
[root@ubuntu129 0703]# stat /usr/bin/passwd
File: /usr/bin/passwd
Size: 93640 Blocks: 184 IO Block: 4096 regular file
Device: 252,0 Inode: 1573534 Links: 1
Access: (4755/-rwsr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2025-07-03 15:40:12.223391794 +0800
Modify: 2024-12-02 19:39:54.000000000 +0800
Change: 2025-05-26 18:08:27.010868500 +0800
Birth: 2025-05-26 18:08:27.005567928 +0800
[root@ubuntu129 0703]# stat /usr/bin/tail
File: /usr/bin/tail
Size: 76400 Blocks: 152 IO Block: 4096 regular file
Device: 252,0 Inode: 1573818 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2025-07-03 08:45:37.004000742 +0800
Modify: 2025-02-11 15:30:05.000000000 +0800
Change: 2025-05-26 18:08:29.111593626 +0800
Birth: 2025-05-26 18:08:29.111106424 +0800
huhao@ubuntu129:~$ tail -f /etc/shadow
tail: cannot open '/etc/shadow' for reading: Permission denied
tail: no files remaining
huhao@ubuntu129:~$ passwd
[root@ubuntu129 0703]# ps aux | grep passwd
root 16413 0.0 0.2 13080 4200 pts/1 S+ 15:51 0:00 passwd
root 16415 0.0 0.1 9872 2484 pts/0 S+ 15:51 0:00 grep --color=auto passwd
① 特殊权限SUID
前提:进程有属主和属组,文件有属主和属组。
⚪ 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限。
⚪ 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组。
⚪ 进程访问文件时的权限,取决于进程的发起者。
二进制的可执行文件上SUID权限功能:
⚪ 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限。
⚪ 启动为进程之后,其进程的属主为原程序文件的属主。
⚪ SUID只对二进制可执行程序有效。
⚪ SUID设置在目录上无意义。
#SUID权限设定
chmod u+s FILE...
chmod 4xxx FILE
chmod u-s FILE...
#范例
[root@ubuntu129 0703]# chmod u+s /usr/bin/tail
[root@ubuntu129 0703]# ll /usr/bin/{cat,tail,passwd}
-rwxr-xr-x 1 root root 43560 Feb 11 15:30 /usr/bin/cat*
-rwsr-xr-x 1 root root 93640 Dec 2 2024 /usr/bin/passwd*
-rwsr-xr-x 1 root root 76400 Feb 11 15:30 /usr/bin/tail*
huhao@ubuntu129:~$ tail -f /etc/shadow
tcpdump:!:20193::::::
tss:!:20193::::::
landscape:!:20193::::::
...
[root@ubuntu129 0703]# ps aux | grep tail
root 16459 0.0 0.1 8904 2080 pts/1 S+ 16:15 0:00 tail -f /etc/shadow
root 16461 0.0 0.1 9872 2484 pts/0 S+ 16:15 0:00 grep --color=auto tail
[root@ubuntu129 0703]# chmod u-s /usr/bin/tail
[root@ubuntu129 0703]# ll /usr/bin/{cat,tail,passwd}
-rwxr-xr-x 1 root root 43560 Feb 11 15:30 /usr/bin/cat*
-rwsr-xr-x 1 root root 93640 Dec 2 2024 /usr/bin/passwd*
-rwxr-xr-x 1 root root 76400 Feb 11 15:30 /usr/bin/tail*
huhao@ubuntu129:~$ tail -f /etc/shadow
tail: cannot open '/etc/shadow' for reading: Permission denied
tail: no files remaining
② 特殊权限SGID
二进制的可执行文件上SGID权限功能:
⚪ 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限。
⚪ 启动为进程之后,其进程的属组为原程序文件的属组。
目录上的SGID权限功能:
默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录。
#SGID权限设定
chmod g+s FILE...
chmod 2xxx FILE
chmod g-s FILE...
#范例
huhao@ubuntu129:/tmp/0703$ mkdir dira
huhao@ubuntu129:/tmp/0703$ ls -l
total 0
drwxrwxr-x 2 huhao huhao 40 Jul 3 16:34 dira
huhao@ubuntu129:/tmp/0703$ touch dira/huhao1
[root@ubuntu129 0703]# touch dira/root1
king@ubuntu129:/tmp/0703$ touch dira/king1
[root@ubuntu129 0703]# ll dira
total 0
-rw-rw-r-- 1 huhao huhao 0 Jul 3 16:36 huhao1
-rw-rw-r-- 1 king king 0 Jul 3 16:38 king1
-rw-r--r-- 1 root root 0 Jul 3 16:37 root1
[root@ubuntu129 0703]# chmod g+s dira
[root@ubuntu129 0703]# touch dira/root2
huhao@ubuntu129:/tmp/0703$ touch dira/huhao2
[root@ubuntu129 0703]# ll dira/*2
-rw-rw-r-- 1 huhao huhao 0 Jul 3 16:40 dira/huhao2
-rw-r--r-- 1 root huhao 0 Jul 3 16:39 dira/root2
[root@ubuntu129 0703]# chown 123:456 dira
[root@ubuntu129 0703]# touch dira/root3
[root@ubuntu129 0703]# ll dira/*3
-rw-r--r-- 1 root 456 0 Jul 3 16:43 dira/root3
#查看目录中的sticky权限
[root@ubuntu129 0703]# file dira
dira: setgid, directory
[root@ubuntu129 0703]# ll -d dira
drwxrwxrwt 2 root root 40 Jul 3 17:41 dira/
[root@ubuntu129 0703]# mkdir dirb
[root@ubuntu129 0703]# file dirb
dirb: directory
③ 特殊权限Sticky位
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权。
在目录设置Sticky 位,只有文件的所有者或root可以删除该文件。
sticky 设置在文件上无意义。
#Sticky权限设定
chmod o+t DIR...
chmod 1xxx DIR
chmod o-t DIR...
#创建dira,权限打满
[root@ubuntu129 0703]# mkdir dira
[root@ubuntu129 0703]# chmod a=rwx dira
#不同用户创建
[root@ubuntu129 0703]# touch dira/root1
huhao@ubuntu129:/tmp/0703$ touch dira/huhao1
king@ubuntu129:/tmp/0703$ touch dira/king1
[root@ubuntu129 0703]# ll dira -d
drwxrwxrwx 2 root root 40 Jul 3 16:59 dira/
#查看,三个文件分属于不同的属主属组
[root@ubuntu129 0703]# ll dira
total 0
-rw-rw-r-- 1 huhao huhao 0 Jul 3 16:56 huhao1
-rw-rw-r-- 1 king king 0 Jul 3 16:56 king1
-rw-r--r-- 1 root root 0 Jul 3 16:56 root1
#普通用户可以删除其他用户的文件
huhao@ubuntu129:/tmp/0703$ rm -rf dira/root1
huhao@ubuntu129:/tmp/0703$ rm -rf dira/king1
king@ubuntu129:/tmp/0703/dira$ rm huhao1
rm: remove write-protected regular empty file 'huhao1'? y
#加权限
[root@ubuntu129 0703]# chmod o+t dira
[root@ubuntu129 0703]# ll
total 0
drwxrwxrwt 2 root root 40 Jul 3 16:59 dira/
#不同用户再次创建
[root@ubuntu129 0703]# touch dira/root2
huhao@ubuntu129:/tmp/0703/dira$ touch huhao2
king@ubuntu129:/tmp/0703/dira$ touch king2
#查看,三个文件分属于不同的属主属组
[root@ubuntu129 0703]# ll dira
total 0
-rw-rw-r-- 1 huhao huhao 0 Jul 3 17:08 huhao2
-rw-rw-r-- 1 king king 0 Jul 3 17:07 king2
-rw-r--r-- 1 root root 0 Jul 3 17:01 root2
#普通用户此时无法删除没权限的文件
huhao@ubuntu129:/tmp/0703/dira$ rm -rf root2
rm: cannot remove 'root2': Operation not permitted
huhao@ubuntu129:/tmp/0703/dira$ rm -rf king2
rm: cannot remove 'king2': Operation not permitted
huhao@ubuntu129:/tmp/0703/dira$ rm huhao2
huhao@ubuntu129:/tmp/0703/dira$ ls
king2 root2
###
[root@ubuntu129 0703]# stat dira
File: dira
Size: 80 Blocks: 0 IO Block: 4096 directory
Device: 0,44 Inode: 681 Links: 2
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2025-07-03 17:09:08.490321427 +0800
Modify: 2025-07-03 17:09:05.795325651 +0800
Change: 2025-07-03 17:09:05.795325651 +0800
Birth: 2025-07-03 16:55:39.523809502 +0800
[root@ubuntu129 0703]# mkdir dirb
[root@ubuntu129 0703]# stat dirb
File: dirb
Size: 40 Blocks: 0 IO Block: 4096 directory
Device: 0,44 Inode: 689 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2025-07-03 17:10:38.467387860 +0800
Modify: 2025-07-03 17:10:38.467387860 +0800
Change: 2025-07-03 17:10:38.467387860 +0800
Birth: 2025-07-03 17:10:38.467387860 +0800
[root@ubuntu129 0703]# chmod 0777 dira
[root@ubuntu129 0703]# ll
total 0
drwxrwxrwx 2 root root 80 Jul 3 17:09 dira/
drwxr-xr-x 2 root root 40 Jul 3 17:10 dirb/
[root@ubuntu129 0703]# stat dira
File: dira
Size: 80 Blocks: 0 IO Block: 4096 directory
Device: 0,44 Inode: 681 Links: 2
Access: (0777/drwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2025-07-03 17:09:08.490321427 +0800
Modify: 2025-07-03 17:09:05.795325651 +0800
Change: 2025-07-03 17:11:12.697988833 +0800
Birth: 2025-07-03 16:55:39.523809502 +0800
[root@ubuntu129 0703]# chmod 7777 dira
[root@ubuntu129 0703]# ll
total 0
drwsrwsrwt 2 root root 80 Jul 3 17:09 dira/
drwxr-xr-x 2 root root 40 Jul 3 17:10 dirb/
[root@ubuntu129 0703]# chmod u-x dira
[root@ubuntu129 0703]# ll
total 0
drwSrwsrwt 2 root root 80 Jul 3 17:09 dira/
drwxr-xr-x 2 root root 40 Jul 3 17:10 dirb/
④ 特殊权限数字法
字符表示 | 二进制表示 | 八进制表示 | 备注 |
--------- | 000 | 0 | 无任何特殊权限 |
--------t | 001 | 1 | Sticky |
-----s--- | 010 | 2 | SGID |
-----s--t | 011 | 3 | SGID,Sticky |
--s------ | 100 | 4 | SUID |
--s-----t | 101 | 5 | SUID,Sticky |
--s---s--- | 110 | 6 | SUID,SGID |
--s--s--t | 111 | 7 | SUID,SGID,Sticky |
权限位映射
SUID: user,占据属主的执行权限位
s:属主拥有x权限
S:属主没有x权限
SGID: group,占据属组的执行权限位
s: group拥有x权限
S:group没有x权限
Sticky: other,占据other的执行权限位
t:other拥有x权限
T:other没有x权限
⑤ 设定文件特殊属性
chattr [-pRVf] [-+=aAcCdDeijPsStTuF] [-v version] files...
#常用选项
-p project #设置文件项目编号
-R #递归执行
-V #显示过程,并输出chattr 版本
-f #不输出错误信息
-v version #设置版本
#操作符
+attribute #添加该属性
-attribute #去掉该属性
=attribute #仅有该属性
#常用属性
a #对文件:可追加内容,不可被删除,不可被修改,不可被重命名;对目录,可新建,修改文件,但不可删除文件
A #不更新atime,节省IO
c #文件会被压缩保存
i #对文件:不可被删除不可被修改不可重命名;对目录:可修改查看目录中的文件,不可新建文件,不可删除文件
s #彻底删除文件,用0填充原来的数据块
u #防止误删除,这里是指原来存储该文件的块不会被新的数据覆盖
#显示文件特殊属性
lsattr [-RVadlpv] [files...]
#范例
# +i - 防止误删除
[root@ubuntu129 0704]# echo "abc">a.txt
[root@ubuntu129 0704]# ls
a.txt
[root@ubuntu129 0704]# ll
total 12
-rw-r--r-- 1 root root 4 Jul 4 09:09 a.txt
[root@ubuntu129 0704]# chattr +i a.txt
[root@ubuntu129 0704]# lsattr a.txt
----i---------e------- a.txt
#不可删除
[root@ubuntu129 0704]# rm -rf a.txt
rm: cannot remove 'a.txt': Operation not permitted
[root@ubuntu129 0704]# rm -rf *
rm: cannot remove 'a.txt': Operation not permitted
#不可覆盖
[root@ubuntu129 0704]# echo "888">a.txt
-bash: a.txt: Operation not permitted
#不可追加
[root@ubuntu129 0704]# echo "666">>a.txt
-bash: a.txt: Operation not permitted
#不可移动
[root@ubuntu129 0704]# mv a.txt /tmp
mv: cannot remove 'a.txt': Operation not permitted
#可复制
[root@ubuntu129 0704]# cp a.txt b.txt
[root@ubuntu129 0704]# ls
a.txt b.txt
[root@ubuntu129 0704]# lsattr b.txt
--------------e------- b.txt #e是文件系统自带的
#可查看
[root@ubuntu129 0704]# cat a.txt
abc
#去掉i权限
chattr -i a.txt
[root@ubuntu129 0704]# rm -rf *
# +a - 一般用于日志文件
[root@ubuntu129 0704]# chattr +a a.txt
[root@ubuntu129 0704]# ll
total 12
-rw-r--r-- 1 root root 4 Jul 4 09:17 a.txt
[root@ubuntu129 0704]# lsattr a.txt
-----a--------e------- a.txt
#不可删除
[root@ubuntu129 0704]# rm -rf a.txt
rm: cannot remove 'a.txt': Operation not permitted
[root@ubuntu129 0704]# rm -rf *
rm: cannot remove 'a.txt': Operation not permitted
#不可覆盖
[root@ubuntu129 0704]# echo "999">a.txt
-bash: a.txt: Operation not permitted
#可追加
[root@ubuntu129 0704]# echo "999">>a.txt
#可查看
[root@ubuntu129 0704]# cat a.txt
abc
999
#不可移动
[root@ubuntu129 0704]# mv a.txt b.txt
mv: cannot move 'a.txt' to 'b.txt': Operation not permitted
#可复制
[root@ubuntu129 0704]# cp a.txt b.txt
[root@ubuntu129 0704]# lsattr b.txt
--------------e------- b.txt
(6)访问控制列表ACL
① ACL权限功能
rwx 权限体系中,仅仅只能将用户分成三种角色,如果要对单独用户设置额外的权限,则无法完成;而ACL可以单独对指定的用户设定各不相同的权限,提供颗粒度更细的权限控制。
注意:CentOS7 默认创建的xfs和ext4文件系统具有ACL功能,CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加。
#永久修改 ext2/ext3/ext4 文件系统的默认挂载选项,启用 ACL 支持
tune2fs –o acl /dev/sdb1
#临时挂载分区 /dev/sdb1 到 /mnt/test,并显式启用 ACL 功能
mount –o acl /dev/sdb1 /mnt/test
ACL生效顺序:所有者,自定义用户,所属组,自定义组,其他人。
② ACL相关命令
#setfacl 可设置ACL权限
setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...
#getfacl 可查看设置的ACL权限
#常用选项
-m|--modify=acl #修改acl权限
-M|--modify-file=file #从文件读取规则
-x|--remove=acl #删除文件acl 权限
-X|--remove-file=file #从文件读取规则
-b|--remove-all #删除文件所有acl权限
-k|--remove-default #删除默认acl规则
--set=acl #用新规则替换旧规则,会删除原有ACL项,用新的替代,一定要包含UGO的设置,不能象 -m一样只有 ACL
--set-file=file #从文件读取新规则
--mask #重新计算mask值
-n|--no-mask #不重新计算mask值
-d|--default #在目录上设置默认acl
-R|--recursive #递归执行
-L|--logical #将acl 应用在软链接指向的目标文件上,与-R一起使用
-P|--physical #将acl 不应用在软链接指向的目标文件上,与-R一起使用
#范例
# -b - 删除文件所有acl权限
[root@ubuntu129 0704]# getfacl b.txt
# file: b.txt
# owner: root
# group: root
user::rw-
user:huhao:---
user:king:rwx
group::r--
mask::rwx
other::r--
[root@ubuntu129 0704]# setfacl -b b.txt
[root@ubuntu129 0704]# getfacl b.txt
# file: b.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
#给组加ACL
[root@ubuntu129 0704]# getfacl b.txt
# file: b.txt
# owner: root
# group: root
user::---
group::---
other::---
[root@ubuntu129 0704]# id king
uid=1001(king) gid=1001(king) groups=1001(king)
[root@ubuntu129 0704]# setfacl -m g:king:rwx b.txt
[root@ubuntu129 0704]# getfacl b.txt
# file: b.txt
# owner: root
# group: root
user::---
group::---
group:king:rwx
mask::rwx
other::---
#从文件复制ACL
[root@ubuntu129 0704]# getfacl a.txt
# file: a.txt
# owner: root
# group: root
user::rw-
user:huhao:rw-
user:king:---
group::r--
mask::rw-
other::r--
[root@ubuntu129 0704]# getfacl b.txt
# file: b.txt
# owner: root
# group: root
user::---
group::---
other::---
[root@ubuntu129 0704]# getfacl b.txt | setfacl --set-file=- a.txt
[root@ubuntu129 0704]# getfacl a.txt b.txt
# file: a.txt
# owner: root
# group: root
user::---
group::---
other::---
# file: b.txt
# owner: root
# group: root
user::---
group::---
other::---
# -x - 移除ACL权限
[root@ubuntu129 0704]# getfacl b.txt
# file: b.txt
# owner: root
# group: root
user::---
user:king:r-x
group::---
group:huhao:rwx
mask::rwx
other::---
[root@ubuntu129 0704]# setfacl -x g:huhao b.txt
[root@ubuntu129 0704]# setfacl -x u:king b.txt
[root@ubuntu129 0704]# getfacl b.txt
# file: b.txt
# owner: root
# group: root
user::---
group::---
mask::---
other::---
#--set 替换
[root@ubuntu129 0704]# getfacl a.txt
# file: a.txt
# owner: root
# group: root
user::rw-
user:huhao:---
user:king:rw-
group::---
group:queen:rwx
mask::rwx
other::---
[root@ubuntu129 0704]# setfacl --set u::r-x,u:huhao:rwx,g::-,o::r-- a.txt
[root@ubuntu129 0704]# getfacl a.txt
# file: a.txt
# owner: root
# group: root
user::r-x
user:huhao:rwx
group::---
mask::rwx
other::r--
mask 权限
⚪ mask只影响除所有者和other的之外的人和组的最大权限。
⚪ mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)
⚪ 用户或组的设置必须存在于mask权限设定范围内才会生效。
对于脚本程序来讲,必须先要有读权限,才能执行。
[root@ubuntu129 0704]# getfacl a.txt
# file: a.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
[root@ubuntu129 0704]# setfacl -m u:king:x a.txt
[root@ubuntu129 0704]# getfacl a.txt
# file: a.txt
# owner: root
# group: root
user::rw-
user:king:--x
group::r--
mask::r-x
other::r--
[root@ubuntu129 0704]# setfacl -m mask::rwx a.txt
[root@ubuntu129 0704]# getfacl a.txt
# file: a.txt
# owner: root
# group: root
user::rw-
user:king:--x
group::r--
mask::rwx
other::r--