1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 《Linux基础三》用户和文件权限管理

《Linux基础三》用户和文件权限管理

时间:2022-11-19 19:01:40

相关推荐

《Linux基础三》用户和文件权限管理

用户和文件权限管理

1,用户

管理员用户:

Root用户,也称根用户、超级用户、超级管理员

可对根目录执行读写和执行操作

具有系统中的最高、所有权限

普通用户

权限有限的用户

Root用户拥有系统的所有权限,等同于操作系统的权限,足以把整个系统的大部分文件删掉,导致系统完全毁坏,不能再次使用。所以,用root进行不当的操作是相当危险的,轻微的可以死机,严重的甚至不能开机。但是有时候也有一些需要root权限的应用,譬如广告阻挡。除非确实需要,一般情况下都不推荐使用root。最好单独建立一个普通的用户,作为日常之用。

Linux系统是一个多用户、多任务的操作系统,每个用户之间都是互相隔离的,每个用户是通过User Id (UID)来唯一标识的,相当于人类社会的身份证号码。

Linux中可以将一个或多个用户加入用户组中,组就是包含0个或多个用户的集合,用户组是通过Group

ID(GID) 来唯一标识的。

用户(组)分类:

命令提示符#、$

# 管理员

$ 普通用户

范例:显示系统中现有用户的相关信息

[root@Rocky8 ~]# lslogins UID USERPROC PWD-LOCK PWD-DENY LAST-LOGIN GECOS0 root153 0 0 09:57 root1 bin 0 0 0 bin2 daemon0 0 0 daemon3 adm 0 0 0 adm4 lp0 0 0 lp5 sync 0 0 0 sync6 shutdown 0 0 0 Feb02/01:08 shutdown7 halt 0 0 0 halt8 mail 0 0 0 mail11 operator 0 0 0 operator12 games 0 0 0 games14 ftp 0 0 0 FTP User59 tss 0 1 0 Account used for TPM access72 tcpdump0 1 0 74 sshd 0 1 0 Privilege-separated SSH81 dbus 1 1 0 System message bus89 postfix0 1 0 193 systemd-resolve 0 1 0 systemd Resolver991 setroubleshoot 0 1 0 992 unbound0 1 0 Unbound DNS resolver993 chrony0 1 0 994 cockpit-wsinstance 0 1 0 User for cockpit-ws instances995 cockpit-ws 0 1 0 User for cockpit web service996 sssd 0 1 0 User for sssd997 libstoragemgmt 1 1 0 daemon account for libstoragemgmt998 polkitd1 1 0 User for polkitd999 systemd-coredump0 1 0 systemd Core Dumper1000 jett 0 0 0 65534 nobody0 0 0 Kernel Overflow User

范例:

[root@Rocky8 ~]# who #查看当前登录用户信息rootpts/0 -02-02 09:57 (10.0.0.1)[root@Rocky8 ~]# whoami #打印当前登录用户,相当于执行”id -un”指令root[root@Rocky8 ~]# id#显示当前用户与用户组信息uid=0(root) gid=0(root) groups=0(root)[root@Rocky8 ~]# w#显示目前登入系统的用户信息10:48:38 up 54 min, 1 user, load average: 0.00, 0.00, 0.00USERTTYFROM LOGIN@ IDLE JCPU PCPU WHATrootpts/0 10.0.0.1 09:57 1.00s 0.04s 0.00s w

Linux用户和组的关系

用户和用户组的对应关系是:一对一、多对一、一对多或多对多

1.一对一:一个用户可以存在一个组中,是组中的唯一成员;

2.一对多:一个用户可以存在多个用户组中,此用户具有这多个组的共同权限;

3.多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限;

4.多对多:多个用户可以存在多个组中,也就是以上 3 种关系的扩展。

一个用户至少有一个组,也可以有多个组;

一个组至少有0个用户,也可以有多个用户;

用户的主要组(primary group):又称私有组,一个用户必须属于且只有一个主组,创建用户时,默认会创建与其同名的组作为主组;

用户的附加组(supplementary group):又称辅助组,一个用户可以属于0个或多个附加组;

1.1 用户管理

1.1.1 用户管理主要配置文件

/etc/passwd:用户及其属性信息

/etc/shadow:用户密码及其相关属性

[root@Rocky8 ~]# man 5 passwd 查看帮助文档

[root@Rocky8 ~]# man 5 shadow 查看帮助文档

#/etc/passwd文件的每一行代表一个用户的信息,用冒号分隔的每一个字段分别代表不同的含义。第一个字段:用户名第二个字段:密码,这里的 x 仅仅是一个标识,真正的密码加密保存在 /etc/shadow 中第三个字段:UID第四个字段:GID第五个字段:用户描述信息,可不填第六个字段:用户家目录位置第七个字段:默认shell,用 chsh 命令修改[root@Rocky8 ~]# cat /etc/passwd |head -3root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin#/etc/shadow文件同样是一行一个用户的信息,每个字段有不同含义第一个字段:用户名第二个字段:密码。有密码的用户在这里都是一串加密过的字符。这里我填了两个叹号,表示没有密码。第三个字段:从1970/01/01到最近一次密码修改经过的时间,以天为单位。第四个字段:密码过多久可以被修改,0表示随时可改。第五个字段:密码的有效期第六个字段:密码要过期前多少天提醒用户,7就是提前一周提醒。第七个字段:密码过期后多少天之内还能登录,但是要登录必须改密码。第八个字段:密码的最长使用期限第九个字段:系统保留字段所有伪用户的密码都是 "!!" 或 "*",代表没有密码是不能登录的,新建用户还没设密码时为!!,禁用账号,可以直接在密码字段前加 ![root@Rocky8 ~]# cat /etc/shadow |head -3root:$6$cPKVQe4MwVWb9vCN$Rrx2WSze5G86tEOzWOCcY6TeptTN0aHNceSqIpWj.h4sF/df3CdYM8xBHjERxt19pvSUtJWyDPckgbzxdMyPe1::0:99999:7:::bin:*:18700:0:99999:7:::daemon:*:18700:0:99999:7:::

1.1.2 用户管理命令

useradd命令 – 创建并设置用户信息

newusers命令 – 更新和批量创建新用户

userdel命令 – 删除用户账户

passwd命令 – 设置和修改用户的密码值

chpasswd命令 – 批量更新用户密码

chage命令 – 修改帐号和密码的有效期限

usermod命令 – 修改用户账号信息

su命令 – 切换用户身份

who命令 – 查看当前登录用户信息

groups - 打印用户所在的组

getent命令 – 查看系统数据库中的记录信息

1.1.2.1 用户创建useradd、newusers

useradd命令来自于英文词组“User add”的全拼,其功能是用于创建并设置用户信息。

#语法:useradd [options] LOGINuseradd -Duseradd -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 中可以查看,指定用户使用/sbin/nologin,无论是本地还是远程都不能登录系统,也无法实现系统管理,使用/sbin/nologin的shell的用户无法切换,ubnutn中使用/bin/false的shell的用户同样无法切换-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

范例:默认创建指定的用户

[root@Rocky8 ~]# useradd user1#默认创建用户user1[root@Rocky8 ~]# lslogins |grep user1 #查看用户user1信息1001 user1 0 1 0[root@Rocky8 ~]# getent passwd user1#查看本地的用户文件(/etc/passwd)中包含的指定用户user1信息user1:x:1001:1001::/home/user1:/bin/bash[root@Rocky8 ~]# getent shadow user1#查看本地的用户密码文件(/etc/shadow)中包含的指定用户user1信息user1:!!:19390:0:99999:7:::[root@Rocky8 ~]# getent group user1 #查看本地的用户组文件(/etc/group)中包含的指定用户user1信息user1:x:1001:[root@Rocky8 ~]# getent gshadow user1#查看本地的用户组密码文件(/etc/gshadow)中包含的指定用户user1信息user1:!::[root@Rocky8 ~]# ls -a /home/user1/ #用户user1默认家目录,来源于家目录模块文件/etc/skel。. .. .bash_logout .bash_profile .bashrc[root@Rocky8 ~]# ll /var/spool/mail/user1 -rw-rw---- 1 user1 mail 0 Feb 2 11:42 /var/spool/mail/user1[root@Rocky8 ~]# ls -a /etc/skel #家目录模板,修改此目录内容后,新创建的用户家目录中的内容会发生改变. .. .bash_logout .bash_profile .bashrc[root@Rocky8 ~]# useradd -D#显示或更改默认的 useradd 配置,默认配置文件是/etc/default/useraddGROUP=100#useradd不指定组,且/etc/login.defs中的USERGROUPS_ENAB为no或useradd -N时,group 为100HOME=/home #此项表示将新建用户的主目录放在/home目录下INACTIVE=-1 #此项表示是否启用帐号过期禁用,-1表示不启用,对应/etc/shadow文件第7列EXPIRE= #此项表示帐号过期日期,不设置表示不启用,对应/etc/shadow文件第8列SHELL=/bin/bash #此项指定了新建用户的默认shell类型SKEL=/etc/skel #此项用来指定用户主目录默认文件的来源,也就是说新建用户主目录下的文件都是从这个目录下复制而来的CREATE_MAIL_SPOOL=yes [root@Rocky8 ~]# cat /etc/default/useradd # useradd defaults fileGROUP=100HOME=/homeINACTIVE=-1EXPIRE=SHELL=/bin/bashSKEL=/etc/skelCREATE_MAIL_SPOOL=yes/etc/default/useradd文件定义了新建用户的一些默认属性,比如用户的主目录、使用的shell等等,通过更改此文件,可以改变创建新用户的默认属性值#/etc/login.defs文件用来定义创建一个用户时的默认设置,比如指定用户的UID和GID的范围,用户的过期时间、是否需要创建用户主目录等等。[root@Rocky8 ~]# cat /etc/login.defs## Please note that the parameters in this configuration file control the# behavior of the tools from the shadow-utils component. None of these# tools uses the PAM mechanism, and the utilities that use PAM (such as the# passwd command) should therefore be configured elsewhere. Refer to# /etc/pam.d/system-auth for more information.## *REQUIRED*# Directory where mailboxes reside, _or_ name of file, relative to the# home directory. If you _do_ define both, MAIL_DIR takes precedence.# QMAIL_DIR is for Qmail##QMAIL_DIRMaildirMAIL_DIR/var/spool/mail #当创建用户时,同时在目录/var/spool/mail中创建一个用户mail文件#MAIL_FILE.mail# Default initial "umask" value used by login(1) on non-PAM enabled systems.# Default "umask" value for pam_umask(8) on PAM enabled systems.# UMASK is also used by useradd(8) and newusers(8) to set the mode for new# home directories if HOME_MODE is not set.# 022 is the default value, but 027, or even 077, could be considered# for increased privacy. There is no One True Answer here: each sysadmin# must make up their mind.UMASK022# HOME_MODE is used by useradd(8) and newusers(8) to set the mode for new# home directories.# If HOME_MODE is not set, the value of UMASK is used to create the mode.HOME_MODE0700# Password aging controls:##PASS_MAX_DAYSMaximum number of days a password may be used.#PASS_MIN_DAYSMinimum number of days allowed between password changes.#PASS_MIN_LENMinimum acceptable password length.#PASS_WARN_AGENumber of days warning given before a password expires.#PASS_MAX_DAYS99999 #指定密码保持有效的最大天数PASS_MIN_DAYS0#表示自从上次密码修改以来多少天后用户才被允许修改口令PASS_MIN_LEN5#指定密码的最小长度PASS_WARN_AGE7#表示在口令到期前多少天系统开始通知用户口令即将到期## Min/max values for automatic uid selection in useradd#UID_MIN 1000 #添加用户时,用户的UID 从1000开始UID_MAX 60000 #指定最大UID为60000# System accountsSYS_UID_MIN201SYS_UID_MAX999## Min/max values for automatic gid selection in groupadd#GID_MIN 1000 #添加组时,组的GID从1000开始GID_MAX 60000 #指定最大GID为60000# System accountsSYS_GID_MIN201SYS_GID_MAX999## If defined, this command is run when removing a user.# It should remove any at/cron/print jobs etc. owned by# the user to be removed (passed as the first argument).##USERDEL_CMD/usr/sbin/userdel_local## If useradd should create home directories for users by default# On RH systems, we do. This option is overridden with the -m flag on# useradd command line.#CREATE_HOMEyes #此项是指是否创建用户主目录,yes为创建,no为不创建。# This enables userdel to remove user groups if no members exist.#USERGROUPS_ENAB yes #会用和用户名相同的名字创建用户组# Use SHA512 to encrypt password.ENCRYPT_METHOD SHA512 #用sha512加密算法#综上:新建用户的相关文件/etc/default/useradd/etc/skel/*/etc/login.defs

范例:使用newusers命令批量创建用户

#使用命令之前需要创建包含新用户的文件,假如是/root/newuserfile,文件内容如下:[root@Rocky8 ~]# vim /root/newuserfile [root@Rocky8 ~]# cat /root/newuserfile linuxcool0:x:520:520::/home/zhangsan0:/bin/bashlinuxcool1:x:521:521::/home/zhangsan1:/bin/bashlinuxcool2:x:521:521::/home/zhangsan2:/bin/bash#使用此文件批量创建用户[root@Rocky8 ~]# newusers /root/newuserfile [root@Rocky8 ~]# id linuxcool0uid=520(linuxcool0) gid=520(linuxcool0) groups=520(linuxcool0)[root@Rocky8 ~]# id linuxcool1uid=521(linuxcool2) gid=521(linuxcool1) groups=521(linuxcool1)[root@Rocky8 ~]# id linuxcool2uid=521(linuxcool2) gid=521(linuxcool1) groups=521(linuxcool1)

范例:

#创建指定的用户信息,但不创建家目录,亦不让登录系统[root@Rocky8 ~]# useradd -M -s /sbin/nologin user2[root@Rocky8 ~]# id user2uid=1002(user2) gid=1002(user2) groups=1002(user2)#创建指定的用户信息,并自定义UID值[root@Rocky8 ~]# useradd -u 6688 user3[root@Rocky8 ~]# id user3uid=6688(user3) gid=6688(user3) groups=6688(user3)#创建用户前先建组,可以确保组ID是己知的[root@Rocky8 ~]# groupadd -g 336 -r mysql[root@Rocky8 ~]# getent group mysqlmysql:x:336:[root@Rocky8 ~]# getent gshadow mysqlmysql:!::#创建指定的用户信息,并追加指定组为该账户的扩展组[root@Rocky8 ~]# useradd -G mysql user4[root@Rocky8 ~]# id user4uid=6689(user4) gid=6689(user4) groups=6689(user4),336(mysql)#创建指定的用户信息,并指定过期时间[root@Rocky8 ~]# useradd -e "2025/05/05" user5[root@Rocky8 ~]# id user5uid=6690(user5) gid=6690(user5) groups=6690(user5)[root@Rocky8 ~]# getent passwd user5user5:x:6690:6690::/home/user5:/bin/bash[root@Rocky8 ~]# getent shadow user5user5:!!:19390:0:99999:7::3:#创建多项定义的用户[root@Rocky8 ~]# useradd -u 336 -g mysql -s /sbin/nologin -d /data/mysql -M -r mysql[root@Rocky8 ~]# getent shadow mysql mysql:!!:19390::::::[root@Rocky8 ~]# getent passwd mysql mysql:x:336:336::/data/mysql:/sbin/nologin[root@Rocky8 ~]# getent group mysql mysql:x:336:user4[root@Rocky8 ~]# getent gshadow mysql mysql:!::user4

1.1.2.2 用户属性修改usermod

usermod命令来自于英文词组“user modify”的缩写,其功能是用于修改用户帐户的属性。

语法: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@Rocky8 ~]# useradd -u 336 -g mysql -s /sbin/nologin -d /data/mysql -M -r mysql[root@Rocky8 ~]# getent shadow mysql mysql:!!:19390::::::[root@Rocky8 ~]# getent passwd mysql mysql:x:336:336::/data/mysql:/sbin/nologin[root@Rocky8 ~]# getent group mysql mysql:x:336:user4[root@Rocky8 ~]# getent gshadow mysql mysql:!::user4#修改指定用户的家目录路径[root@Rocky8 ~]# usermod -d /home mysql [root@Rocky8 ~]# getent shadow mysql mysql:!!:19390::::::[root@Rocky8 ~]# getent passwd mysql mysql:x:336:336::/home:/sbin/nologin#修改指定用户的UID号码[root@Rocky8 ~]# id mysql uid=336(mysql) gid=336(mysql) groups=336(mysql)[root@Rocky8 ~]# usermod -u 6688 mysql #不可占用己存在的UID、GIDusermod: UID '6688' already exists[root@Rocky8 ~]# usermod -u 1234 mysql [root@Rocky8 ~]# id mysql uid=1234(mysql) gid=336(mysql) groups=336(mysql)#修改指定用户的名称并备注信息[root@Rocky8 ~]# id mysql uid=1234(mysql) gid=336(mysql) groups=336(mysql)[root@Rocky8 ~]# usermod -c "mysql to newmysql" -l newmysql mysql[root@Rocky8 ~]# id mysqlid: ‘mysql’: no such user[root@Rocky8 ~]# id newmysqluid=1234(newmysql) gid=336(mysql) groups=336(mysql)

范例:锁定用户,使密码无效

#锁定指定用户的账户,临时不允许登录系统[root@Rocky8 ~]# usermod -L jett[root@Rocky8 ~]# getent shadow jettjett:!$6$wrYwzcQGIzCWUyU6$LoNSlWvL3M9GS4WE0Q9YAqgxkESrLAImEGZd/mD98RDkzfUwU.McQgkACw3EHHPmwtH2z/1uOXKGXP0EAygxO.::0:99999:7:::#解锁指定用户的账户,再次允许登录系统[root@Rocky8 ~]# usermod -U jett[root@Rocky8 ~]# getent shadow jettjett:$6$wrYwzcQGIzCWUyU6$LoNSlWvL3M9GS4WE0Q9YAqgxkESrLAImEGZd/mD98RDkzfUwU.McQgkACw3EHHPmwtH2z/1uOXKGXP0EAygxO.::0:99999:7:::#centos允许空密码用户登录,所以两个 !!,无法用 -U 选项解锁,但是,可以直接修改/etc/shadow 文件,将密码栏置空产生空密码用户[root@Rocky8 ~]# id newmysql uid=1234(newmysql) gid=336(mysql) groups=336(mysql)[root@Rocky8 ~]# getent shadow newmysql newmysql:!!:19390::::::[root@Rocky8 ~]# usermod -L newmysql [root@Rocky8 ~]# getent shadow newmysql newmysql:!!:19390::::::[root@Rocky8 ~]# usermod -U newmysql usermod: unlocking the user's password would result in a passwordless account.You should set a password with usermod -p to unlock this user's password.[root@Rocky8 ~]# getent shadow newmysql newmysql:!!:19390::::::

1.1.2.3 用户账户删除userdel

userdel命令来自于英文词组“user delete”的缩写,其功能是删除用户帐户和相关文件。Linux系统中一切都是文件,用户信息被保存到了/etc/passwd、/etc/shadow以及/etc/group文件中,因此使用userdel命令实际就是帮助我们删除了指定用户在上述三个文件中的对应信息。

#语法:userdel [options] LOGIN#常用参数:-f强制删除用户账号,正在登录状态的用户也可以删除-r删除用户主目录及其中的任何文件

范例:删除指定的用户账户信息

[user1@Rocky8 ~]$ whoamiwhoami: cannot find name for user ID 1001#用户被删除后,其名下的文件无法显示属主属组,只能显示UID[root@Rocky8 ~]# ll -a /home/user1total 12drwx------ 2 1001 1001 62 Feb 2 11:42 .drwxr-xr-x. 10 root root 121 Feb 2 13:08 ..-rw-r--r-- 1 1001 1001 18 Aug 2 .bash_logout-rw-r--r-- 1 1001 1001 141 Aug 2 .bash_profile-rw-r--r-- 1 1001 1001 376 Aug 2 .bashrc#如果新建用户,使用了原用户的UID,则可以继承原用户文件[root@Rocky8 ~]# useradd -u 1001 newuser1[root@Rocky8 ~]# ll -a /home/newuser1total 12drwx------ 2 newuser1 newuser1 62 Feb 2 14:21 .drwxr-xr-x. 11 rootroot137 Feb 2 14:21 ..-rw-r--r-- 1 newuser1 newuser1 18 Aug 2 .bash_logout-rw-r--r-- 1 newuser1 newuser1 141 Aug 2 .bash_profile-rw-r--r-- 1 newuser1 newuser1 376 Aug 2 .bashrc#删除指定的用户账户信息及家目录[root@Rocky8 ~]# userdel -rf newuser1userdel: user newuser1 is currently used by process 2459[root@Rocky8 ~]# id newuser1id: ‘newuser1’: no such user

1.1.2.4 用户密码设置passwd

passwd命令来自于英文单词password的缩写,其功能适用于修改用户的密码值,修改密码其实就是更新 /etc/shadow 文件。同时也可以对用户进行锁定等操作,但需要管理员身份才可以执行。

#语法:passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [-?] [--usage] [username]#常用选项-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无此选项

范例:

#修改当前登录用户的密码值Changing password for user root.New password: 输入密码BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic 密码过于简单报提示Retype new password: 再次输入密码passwd: all authentication tokens updated successfully.#修改指定用户的密码值,仅root权限[root@Rocky8 ~]# passwd user1#查看指定用户的密码状态[root@Rocky8 ~]# passwd -S rootroot PS 1969-12-31 0 99999 7 -1 (Password set, SHA512 crypt.)#强制指定的用户在下次登陆时必须重置其密码[root@Rocky8 ~]# passwd -e user1#删除指定用户的密码值[root@Rocky8 ~]# passwd -d user2Removing password for user user2.passwd: Note: deleting a password also unlocks the password.passwd: Success[root@Rocky8 ~]# passwd user2Changing password for user user2.New password: BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary wordRetype new password: passwd: all authentication tokens updated successfully.[root@Rocky8 ~]# getent shadow user2user2:$6$z73dgtJohvibO9s0$QhYKE4ajBxooKKbnZusjVBsIj4SHZhy4kc7HrP8L4p39kokYfWYdRrsGiaCytwYQ2Po2xuhNfjeMlJuWUyCr5.:19390:0:99999:7:::#锁定指定用户的密码值,不允许其进行修改[root@Rocky8 ~]# passwd -l user2Locking password for user user2.passwd: Success#解锁指定用户的密码值,允许其进行修改[root@Rocky8 ~]# passwd -u user2Unlocking password for user user2.passwd: Success

范例:非交互式修改用户密码

#适用于红帽系列的Linux版本,Ubuntu中 passwd 无 --stdin 选项。[root@Rocky8 ~]# echo '123456' | passwd --stdin user3[root@Rocky8 ~]# passwd --stdin jose <<<123456#通用写法,此写法在centos中也支持root@ubuntu2204:~# echo -e '123456\n123456' | passwd jose

1.1.2.5 用户密码批量更新chpasswd

chpasswd命令是批量更新用户口令的工具,是把一个文件内容重新定向添加到/etc/shadow中。

范例:

[root@Rocky8 ~]# cat newuserfile linuxcool0:x:520:520::/home/zhangsan0:/bin/bashlinuxcool1:x:521:521::/home/zhangsan1:/bin/bashlinuxcool2:x:521:521::/home/zhangsan2:/bin/bash[root@Rocky8 ~]# getent shadow linuxcool0 linuxcool1 linuxcool2linuxcool0:$6$Ap2It/Kzcat/p$ixQ9r3MyiKtN9W5JFSmdfJ43rqGOOxBdDgV7C3m1HYfproIQYKiUjLee4tK62PoOSRVw4cXar2mXIqPc3ooz.1:19390:0:99999:7:::linuxcool1:$6$vffQg/ay4yX$EqBWRUFTjfZ/FjzkoS7xNIJDQkLnj3kKswx2ke2F8.X4l9falbuBeCsrOaLZZoEGGgV18xq9v4ueI6wX8gbn4/:19390:0:99999:7:::linuxcool2:$6$Fb04Q/DIvvHIhQ$tOZ8SU5bQB55IZ8q/TQ0KtYa94/D3Bqsi2P./A3492mMPuUGQuWxRnvZm9TY..7pYYttc.NQFr8wMJRB5Mu7A0:19390:0:99999:7:::[root@Rocky8 ~]# echo "linuxcool0:aa123456" > passfile[root@Rocky8 ~]# echo "linuxcool1:bb345678" >> passfile[root@Rocky8 ~]# echo "linuxcool2:cc567890" >> passfile[root@Rocky8 ~]# cat passfile linuxcool0:aa123456linuxcool1:bb345678linuxcool2:cc567890[root@Rocky8 ~]# chpasswd < passfile [root@Rocky8 ~]# getent shadow linuxcool0 linuxcool1 linuxcool2linuxcool0:$6$7DRKYTbZRr/Gt3Og$m7Opti/h0SDr2xliTJCTlX9UpGza4eGXiSh2zce/V8HsRJTGvVzvmhVCDtMXeykpkPm8k7lPw1LHVxXUcTGBm1:19390:0:99999:7:::linuxcool1:$6$BOujs/YvYZg/WY$Z97CzROmVCE2NY4BOdcR/YrR1Ft5ahyzanxItvIcPmuBvGeAscgkBKbbtRKR.LqQyTap0FOuSVRP1EXuclnwt1:19390:0:99999:7:::linuxcool2:$6$oji6L/U.YCJ/kuV$tne/qgduD2Ju0/UWqPqEc4vvKY6g.f9RPCdys6ReqDkhgc.tZE2Ukg.NvDUCTg343gQvVrwJNiqCxMD3gV5us.:19390:0:99999:7:::

1.1.2.6 用户密码策略设置chage

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 #显示密码策略

范例:

#使用-l参数列出用户密码过期的设置,即显示用户密码策略[root@Rocky8 ~]# chage -l rootLast password change: neverPassword expires: neverPassword inactive: neverAccount expires: neverMinimum number of days between password change: 0Maximum number of days between password change: 99999Number of days of warning before password expires: 7#使用-M参数设置user2用户的密码最大有效期为100天[root@Rocky8 ~]# chage -M 100 user2[root@Rocky8 ~]# getent shadow user2user2:$6$DoHfEFJkV2RtQUj8$Cvf0pN9z6JVGr1IUxdMPGe0Hj9DM19k9awelGrIs4GtKHT4KXtQX8tHpJrx2qCq05U3WxmbdzGvypvKtHfTgL1:19390:0:100:7:::#自定义用户user2密码策略[root@Rocky8 ~]# chage user2Changing the aging information for user2Enter the new value, or press ENTER for the defaultMinimum Password Age [0]: 3 #密码保持有效的最小天数Maximum Password Age [100]: 100 #密码保持有效的最大天数Last Password Change (YYYY-MM-DD) [-02-02]: -02-03 #更改密码的时间Password Expiration Warning [7]: 2 #用户密码到期前,提前收到警告信息的天数Password Inactive [-1]: 1 #密码过期后的宽限期Account Expiration Date (YYYY-MM-DD) [-1]: -04-18 #用户的有效期,帐号到期的日期,会禁止此帐号[root@Rocky8 ~]# chage -l user2Last password change: Feb 03, Password expires: May 14, Password inactive: May 15, Account expires: Apr 18, Minimum number of days between password change: 3Maximum number of days between password change: 100Number of days of warning before password expires: 2[root@Rocky8 ~]# getent shadow user2user2:$6$DoHfEFJkV2RtQUj8$Cvf0pN9z6JVGr1IUxdMPGe0Hj9DM19k9awelGrIs4GtKHT4KXtQX8tHpJrx2qCq05U3WxmbdzGvypvKtHfTgL1:19391:3:100:2:1:19465:-d LAST_DAY #更改密码的时间-m|--mindays MIN_DAYS #密码保持有效的最小天数-M|--maxdays MAX_DAYS #密码保持有效的最大天数-W|--warndays WARN_DAYS #用户密码到期前,提前收到警告信息的天数-I|--inactive INACTIVE #密码过期后的宽限期-E|--expiredate EXPIRE_DATE #用户的有效期,帐号到期的日期,会禁止此帐号

1.1.3 用户组管理主要配置文件

/etc/group:组及其属性信息

/etc/gshadow:组密码及其相关属性

[root@Rocky8 ~]# man group 查看帮助文档

[root@Rocky8 ~]# man gshadow 查看帮助文档

#/etc/group文件一行有四个字段其含义如下第一个字段是组名第二个字段是组密码,这里的 x 和 /etc/passwd 的密码字段差不多。第三个字段就是GID第四个字段是组中的用户[root@Rocky8 ~]# cat /etc/group |head -3root:x:0:bin:x:1:daemon:x:2:#/etc/gshadow文件中,每行代表一个组用户的密码信息,各行信息用 ":" 作为分隔符分为 4 个字段,每个字段的含义如下:第一个字段是组名,同 /etc/group 文件中的组名相对应第二个字段是组密码第三个字段是组管理员第四个字段是组附加用户列表,桶/etc/group 文件中附加组显示内容相同[root@Rocky8 ~]# cat /etc/gshadow |head -3root:::bin:::daemon:::

1.1.4 用户组管理命令

创建新的用户组-groupadd

修改用户组属性-groupmod

删除用户组-groupdel

更改组成员和密码-gpasswd

管理用户主组的成员-groupmems

用户组切换-newgrp

1.1.4.1 用户组创建groupadd

groupadd命令来自于英文词组“group add”,使用命令行中指定的值加上系统中的默认值创建新的组帐户。新组将根据需要输入到系统文件中。

#语法: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

范例:

#创建一个新的用户组,指定GID号码并设定为系统工作组[root@Rocky8 ~]# groupadd -g 1234 -r group1[root@Rocky8 ~]# getent group group1 group1:x:1234:

1.1.4.2 用户组属性修改groupmod

groupmod修改系统上的用户组属性。

#语法:groupmod [options] GROUP#常见选项-g|--gid GID #将组 ID 改为 GID-n|--new-name NEW_GROUP #改名为 NEW_GROUP-o|--non-unique #允许使用重复的 GID-p|--password PASSWORD #将密码更改为(加密过的) PASSWORD

范例:

#更改user2用户的用户组名称为user2.ng[root@Rocky8 ~]# groups user2user2 : user2[root@Rocky8 ~]# groupmod -n user2.ng user2[root@Rocky8 ~]# groups user2user2 : user2.ng#更改用户组的GID[root@Rocky8 ~]# cat /etc/group|tail -5mysql:x:336:user4user4:x:6689:user5:x:6690:group1:x:1234:user2.ng:x:1002:[root@Rocky8 ~]# groupmod -g 11111 group1 [root@Rocky8 ~]# cat /etc/group|grep group1group1:x:11111:

1.1.4.3 用户组删除groupdel

groupdel命令用于删除指定的工作组,本命令要修改的系统文件包括/ect/group和/ect/gshadow。

#语法:groupdel [options] GROUP#常见选项-f|--force #强制删除,即使是用户的主组也强制删除组,但会导致无主组的用户不可用无法登录

范例:

[root@Rocky8 ~]# cat /etc/group|tail -5mysql:x:336:user4user4:x:6689:user5:x:6690:group1:x:11111:user2.ng:x:1002:[root@Rocky8 ~]# groupdel group1[root@Rocky8 ~]# getent group group1[root@Rocky8 ~]#

1.1.4.4 用户组成员和密码修改gpasswd

gpasswd命令,可以更改组密码,也可以修改附加组的成员关系,管理/etc/group和/etc/gshadow;组没有密码的情况下,加组只能由root来操作。

#语法:gpasswd [option] group#常用参数:-a添加用户到组-d从组中删除用户-A指定组管理员-M指定组成员-r删除组密码-R限制用户登入组

范例:

[root@Rocky8 ~]# groupadd group1 [root@Rocky8 ~]# groupadd group2[root@Rocky8 ~]# getent group group1 group2group1:x:6691:group2:x:6695:[root@Rocky8 ~]# useradd u1[root@Rocky8 ~]# useradd u2[root@Rocky8 ~]# useradd u3[root@Rocky8 ~]# getent passwd u1 u2 u3u1:x:6691:6692::/home/u1:/bin/bashu2:x:6692:6693::/home/u2:/bin/bashu3:x:6693:6694::/home/u3:/bin/bash#将指定用户加入到指定用户组[root@Rocky8 ~]# groups u1u1 : u1[root@Rocky8 ~]# gpasswd -a u1 group1Adding user u1 to group group1[root@Rocky8 ~]# groups u1u1 : u1 group1[root@Rocky8 ~]# groupmems -g group1 -lu1 #将指定用户从指定用户组中删除[root@Rocky8 ~]# gpasswd -d u1 group1Removing user u1 from group group1[root@Rocky8 ~]# groups u1u1 : u1#为指定用户组设置管理密码[root@Rocky8 ~]# gpasswd group1Changing the password for group group1New Password: 输入密码Re-enter new password: 再次输入[root@Rocky8 ~]# getent gshadow group1 group1:$6$M2QGYQRzI$TwymD.qx1GGZJLevrs2iAx2n2cHqgPr8vhPCY/vIERtqWk63ADaXOCYihtNU5TjOQVyUBGpA3OlvBEH29xrkA0::u1#删除指定用户组中的管理密码[root@Rocky8 ~]# gpasswd -r group1[root@Rocky8 ~]# getent gshadow group1group1:::u1

1.1.4.5 用户主组成员管理groupmems

groupmems管理用户主组的成员。

#语法:groupmems -a user_name | -d user_name | [-g group_name] | -l | -p#常见选项-g|--group groupname #更改为指定组 (只有root)-a|--add username #指定用户加入组-d|--delete username #从组中删除用户-p|--purge #从组中清除所有成员-l|--list #显示组成员列表

范例:

#列出以group1 组为附加组的用户[root@Rocky8 ~]# groupmems -g group1 -lu1 #设置用户u2的主要组群为group1[root@Rocky8 ~]# groupmems -g group1 -a u2[root@Rocky8 ~]# groupmems -g group1 -lu1 u2 [root@Rocky8 ~]# groups u2u2 : u2 group1#切换用户组,临时切换用户组,这里就要用到上面gpasswd 给组设置的密码#普通用户切组需要密码,root用户切组不需要密码##切换之后创建的文件属组就是切换后的组了[root@Rocky8 ~]# newgrp group1[root@Rocky8 ~]# touch fg2[root@Rocky8 ~]# ll fg2-rw-r--r-- 1 root group1 0 Feb 2 17:23 fg2[root@Rocky8 ~]# newgrp group2[root@Rocky8 ~]# touch fg1[root@Rocky8 ~]# ll fg1-rw-r--r-- 1 root group2 0 Feb 2 17:22 fg1[root@Rocky8 ~]# newgrp root[root@Rocky8 ~]# touch fgr[root@Rocky8 ~]# ll fgr-rw-r--r-- 1 root root 0 Feb 2 17:27 fgr

1.1.5 nobody用户和/sbin/nologin

在Linux系统中同样有一些用户帐户是在系统安装后就有的,用来完成特定任务的,比如nobody和ftp。nobody是一个普通用户,同时nobody用户都是伪用户,非特权用户,其 UID 和 GID 不提供任何特权,该uid和gid只能访问人人皆可读写的文件,只能访问服务器上的公共内容,默认登录shell是’/sbin/nologin’,所以这个用户是无法直接登录系统的。简单理解就是nobody相当于Windows系统中的匿名帐户。

[root@Rocky8 ~]# id nobodyuid=65534(nobody) gid=65534(nobody) groups=65534(nobody)[root@Rocky8 ~]# cat /etc/passwd |grep nobody #系统中会默认创建一个nobodynobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin

指定用户shell类型使用/sbin/nologin,无论是本地还是远程都不能登录系统,也无法实现系统管理,即使给了密码也不行。所谓“无法登陆”指的仅是这个用户无法使用bash或其他shell来登陆系统而已,并不是说这个账号就无法使用系统资源,所以限于能登陆shell的用户可以使用 /etc/nologin 文件临时禁止登录,直到删除/etc/nologin文件后,一般用户才可以正常登录。

[root@Rocky8 ~]# useradd -s /sbin/nologin mysql #指定用户使用/sbin/nologin,无论是本地还是远程都不能登录系统,也无法实现系统管理,[root@Rocky8 ~]# getent passwd mysql mysql:x:1001:1001::/home/mysql:/sbin/nologin[root@Rocky8 ~]# su - mysql #此帐户当前不可用This account is currently not available.[root@Rocky8 ~]# su - mysql -c "touch testfile" #不切换用户,而是临时使用该用户权限和环境执行命令也不行This account is currently not available.[root@Rocky8 ~]# su - mysql -s /bin/bash #指定shell类型从而切换用户,但是并不没有真正改变shell类型Last login: Sun Dec 4 13:11:35 CST on pts/1[mysql@Rocky8 ~]$ getent passwd mysqlmysql:x:1001:1001::/home/mysql:/sbin/nologin[mysql@Rocky8 ~]$ whoami ; idmysqluid=1001(mysql) gid=1001(mysql) groups=1001(mysql)[mysql@Rocky8 ~]$ touch testfile[mysql@Rocky8 ~]$ lstestfile

对于那些登陆shell为/sbin/nologin的用户来说 /etc/nologin 文件没有影响,因为他们本身就无法登陆shell,想要让某个具有 /sbin/nologin 的用户也能知道知道,可以新建 /etc/nologin.txt 这个文件,在文件内面写上不能登陆的原因,当用户登录时,屏幕上就会出现这个文件里面的内容。

[root@Rocky8 ~]# echo "This account is system account or mail account." > /etc/nologin.txt[root@Rocky8 ~]# su - mailThis account is system account or mail account.[root@Rocky8 ~]# su - ftpThis account is system account or mail account.[root@Rocky8 ~]# su - sshdThis account is system account or mail account.[root@Rocky8 ~]# su - nobody This account is system account or mail account.[root@Rocky8 ~]# getent passwd mail ftp sshd nobody mail:x:8:12:mail:/var/spool/mail:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologinnobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin[root@Rocky8 ~]# rm -rf /etc/nologin[root@Rocky8 ~]# rm -rf /etc/nologin.txt[root@Rocky8 ~]# su - mail#为什么删除了/etc/nologin和/etc/nologin.txt还是会有提示?怎么解决?Last login: Sat Feb 4 09:58:38 CST on pts/0This account is currently not available.[root@Rocky8 ~]# whoamiroot

总结:

nobody是linux/unix系统下的匿名用户,只能访问服务器上的公共内容

/sbin/nologin是linux/unix系统下的一种shell设置项对于登陆shell为/sbin/nologin的用户是不允许登录系统的

/etc/nologin.txt只针对shell为/sbin/nologin的用户

/etc/nologin可以理解为针对所有普通用户

1.1.6 id命令显示用户和组ID

id命令打印真实有效的用户和组ID。

#语法:id [OPTION]... [USER]#常用参数:-g显示用户所属群组的ID-G显示用户扩展群组的ID-n显示用户所属群组或扩展群组的名称-r显示实际ID-u显示用户ID

范例:

#显示当前用户的身份信息[root@Rocky8 ~]# iduid=0(root) gid=0(root) groups=0(root),6691(group1),6695(group2)#-g 显示当前用户的所属群组GID,-u 显示当前用户的身份码UID[root@Rocky8 ~]# id -g0[root@Rocky8 ~]# id -u0查询指定用户的身份信息[root@Rocky8 ~]# id u1uid=6691(u1) gid=6692(u1) groups=6692(u1),6691(group1)

面试题:

需求:手动新建一个用户,用户名为zhangsan,uid设置为1024(前提是这个uid没有被占用),gid也设置为1024,组名与用户名同名,家目录在/home/zhangsan、默认shell为/bin/bash

1.1.7 用户身份切换su

su命令来自于英文单词“switch user”的缩写,其功能是用于切换用户身份,并且以指定用户的身份执行命令,实质是使用替换用户和组ID运行命令。管理员切换至任意用户身份而无需密码验证,而普通用户切换至任意用户身份均需密码验证。另外添加单个减号(-)参数为完全的身份变更,不保留任何之前用户的环境变量信息。

#语法:su [options] [-] [user [argument...]]#常见选项-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:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换#注意:su 切换新用户后,使用 exit 退回至旧的用户身份,而不要再用 su 切换至旧用户,否则会生成很多的bash子进程,环境可能会混乱。

范例:

[root@Rocky8 ~]# whoami ; idrootuid=0(root) gid=0(root) groups=0(root)[root@Rocky8 ~]# su - jett #从root管理员切换至普通用户,不需要密码,减号(-)意味着完全切换到新的用户,比较推荐这种方式。[jett@Rocky8 ~]$ whoami ; idjettuid=1000(jett) gid=1000(jett) groups=1000(jett)[jett@Rocky8 ~]$ su - root #从普通用户切换成root管理员就需要进行密码验证Password: 输入root管理员密码Last login: Sun Dec 4 12:44:48 CST on pts/1[root@Rocky8 ~]# whoami ; idrootuid=0(root) gid=0(root) groups=0(root)

范例:使用/sbin/nologin的shell的用户无法切换,ubnutn 中使用/bin/false的shell的用户同样无法切换

[root@Rocky8 ~]# useradd -s /sbin/nologin mysql #指定用户使用/sbin/nologin,无论是本地还是远程都不能登录系统,也无法实现系统管理[root@Rocky8 ~]# getent passwd mysql mysql:x:1001:1001::/home/mysql:/sbin/nologin[root@Rocky8 ~]# su - mysql #此帐户当前不可用This account is currently not available.[root@Rocky8 ~]# su - mysql -c "touch testfile" #不切换用户,而是临时使用该用户权限和环境执行命令也不行This account is currently not available.[root@Rocky8 ~]# su - mysql -s /bin/bash #指定shell类型从而切换用户,但是并不没有真正改变shell类型Last login: Sun Dec 4 13:11:35 CST on pts/1[mysql@Rocky8 ~]$ getent passwd mysqlmysql:x:1001:1001::/home/mysql:/sbin/nologin[mysql@Rocky8 ~]$ whoami ; idmysqluid=1001(mysql) gid=1001(mysql) groups=1001(mysql)[mysql@Rocky8 ~]$ touch testfile[mysql@Rocky8 ~]$ lstestfile

范例:切换到root用户

[jett@Rocky8 ~]$ su -Password: Last login: Sat Feb 4 11:51:31 CST on pts/0[root@Rocky8 jett]# whoamiroot

1.1.8 授权普通用户执行管理员命令sudo

sudo允许一个用户作为超级用户或安全策略指定的其他用户执行命令,默认的安全策略是sudoers,安全策略决定了用户运行sudo的权限。配置sudo服务可以直接编辑配置文件/etc/sudoers,亦可以执行visudo命令(自动调用vi编辑器来配置/etc/sudoers权限文件)进行设置。

#语法sudo -h | -K | -k | -Vsudo -v [-ABknS] [-g group] [-h host] [-p prompt] [-u user]sudo -l [-ABknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]sudo [-ABbEHnPS] [-C num] [-g group] [-h host] [-p prompt] [-r role] [-t type] [-T timeout] [-u user [VAR=value] [-i | -s] [command]#常用选项-l列出当前用户可执行的命令-u 用户名或UID值以指定的用户身份执行命令-k清空密码的有效时间,下次执行sudo时需要再次进行密码验证-b在后台执行指定的命令-p更改询问密码的提示语#使用sudoedit命令可以以另外一个用户身份编辑文件sudoedit [-ABknS] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] file ...常用参数:-u以指定用户运行命令-g以指定主要组群运行命令-n防止提示用户输入密码

范例:查看当前用户有哪些被sudo服务授权的命令

[root@Rocky8 ~]# sudo -lMatching Defaults entries for root on Rocky8:!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",secure_path=/sbin\:/bin\:/usr/sbin\:/usr/binUser root may run the following commands on Rocky8:(ALL) ALL[root@Rocky8 ~]# su - jettLast login: Sat Feb 4 10:42:24 CST on pts/0[jett@Rocky8 ~]$ sudo -l[sudo] password for jett: Sorry, user jett may not run sudo on Rocky8. #用户jett不在sudoers文件中。[jett@Rocky8 ~]$ su - rootPassword: Last login: Sat Feb 4 10:43:56 CST on pts/0[root@Rocky8 ~]# visudo#visudo命令自动调用vi编辑器来配置/etc/sudoers权限文件## Allow root to run any commands anywhereroot ALL=(ALL) ALLjett ALL=(ALL) ALL #格式:谁可以使用 允许使用的主机 = (以谁的身份) 可执行命令的列表,注意要写在root后面。## Allows members of the 'sys' group to run networking, software,[root@Rocky8 ~]# su - jett #切换至指定的普通用户身份,此时就可以用sudo -l命令查看所有可执行的命令了Last login: Sat Feb 4 10:46:54 CST on pts/0[jett@Rocky8 ~]$ sudo -l[sudo] password for jett: 输入切换至指定的普通用户的密码Matching Defaults entries for jett on Rocky8:!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",secure_path=/sbin\:/bin\:/usr/sbin\:/usr/binUser jett may run the following commands on Rocky8:(ALL) ALL[jett@Rocky8 ~]$ ls /root #普通用户不能看到root管理员的家目录ls: cannot open directory '/root': Permission denied[jett@Rocky8 ~]$ sudo ls /root #sudo授权之后之后就可了anaconda-ks.cfg

范例:visudo命令授予指定用户特定权限

授权原则:在保证普通用户完成相应工作的前提下,尽可能少地赋予额外的权限。

[root@Rocky8 ~]# visudo#visudo命令自动调用vi编辑器来配置/etc/sudoers权限文件## Allow root to run any commands anywhereroot ALL=(ALL) ALL #添加的授权用户注意要写在root后面jett ALL=(ALL) ALL #格式:谁可以使用 允许使用的主机 = (以谁的身份) 可执行命令的列表## Allows members of the 'sys' group to run networking, software,可执行命令的列表的ALL参数允许某个普通用户拥有整个系统中所有命令的最高执行权,这非常危险也不满足授权原则,所以应该让某个用户只能使用root管理员的身份执行指定的命令。[jett@Rocky8 ~]$ exit #退出当前终端logout[root@Rocky8 ~]# whereis cat #需要命令的绝对路径否则系统会识别不出来cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz[root@Rocky8 ~]# whereis touch #需要命令的绝对路径否则系统会识别不出来touch: /usr/bin/touch /usr/share/man/man1/touch.1.gz /usr/share/man/man1p/touch.1p.gz[root@Rocky8 ~]# visudo #添加/usr/bin/cat,/usr/bin/touch如下位置,多个命令文件之间用逗号“,”间隔## Allow root to run any commands anywhereroot ALL=(ALL) ALLjett ALL=(ALL) ALL /usr/bin/cat,/usr/bin/touch## Allows members of the 'sys' group to run networking, software,保存退出后有如下屏幕显示>>> /etc/sudoers: syntax error near line 102 <<<What now? Options are:(e)dit sudoers file again#(e) 再次编辑sudoers文件e(x)it without saving changes to sudoers file #e(x)它不保存对sudoers文件的更改(Q)uit and save changes to sudoers file (DANGER!) #(Q) 将更改提交并保存到sudoers文件(危险!)What now? Q[root@Rocky8 ~]# su - jettLast login: Sat Feb 4 11:02:58 CST on pts/0[jett@Rocky8 ~]$ cat /etc/shadowcat: /etc/shadow: Permission denied[jett@Rocky8 ~]$ sudo cat /etc/shadow #此时显示语法错误,而命令visudo -c可以检查/etc/sudoers文件的语法错误、所有者和模式>>> /etc/sudoers: syntax error near line 102 <<<sudo: parse error in /etc/sudoers near line 102sudo: no valid sudoers sources found, quittingsudo: unable to initialize policy plugin[jett@Rocky8 ~]$ su - rootPassword: Last login: Sat Feb 4 10:54:59 CST on pts/0[root@Rocky8 ~]# visudo -c#检查语法出错,在102行>>> /etc/sudoers: syntax error near line 102 <<<parse error in /etc/sudoers near line 102[root@Rocky8 ~]# visudo #在102行处,进行如下修改,显示行号:set nu,保存退出:wq>>> /etc/sudoers: syntax error near line 102 <<<99 ## Allow root to run any commands anywhere100 root ALL=(ALL) ALL101 102 jett ALL=(ALL) /usr/bin/cat,/usr/bin/touch103 104 ## Allows members of the 'sys' group to run networking, software,[root@Rocky8 ~]# visudo -c #再次检查语法,语法OK/etc/sudoers: parsed OK[root@Rocky8 ~]# su - jettLast login: Sat Feb 4 11:30:02 CST on pts/0[jett@Rocky8 ~]$ cat /etc/shadowcat: /etc/shadow: Permission denied[jett@Rocky8 ~]$ sudo cat /etc/shadow [sudo] password for jett:#每次执行sudo命令都要输入一次密码挺麻烦的,可以添加NOPASSWD参数root:$6$cPKVQe4MwVWb9vCN$Rrx2WSze5G86tEOzWOCcY6TeptTN0aHNceSqIpWj.h4sF/df3CdYM8xBHjERxt19pvSUtJWyDPckgbzxdMyPe1::0:99999:7:::bin:*:18700:0:99999:7:::daemon:*:18700:0:99999:7:::.....................省略部分信息........................[jett@Rocky8 ~]$ su - root[root@Rocky8 ~]# visudo## Allow root to run any commands anywhereroot ALL=(ALL) ALLjett ALL=(ALL) NOPASSWD:/usr/bin/cat,/usr/bin/touch #添加NOPASSWD参数,就不用每次输入密码了## Allows members of the 'sys' group to run networking, software,[root@Rocky8 ~]# visudo -c/etc/sudoers: parsed OK[root@Rocky8 ~]# su - jett#添加NOPASSWD参数,就不用每次输入密码了Last login: Sat Feb 4 11:40:32 CST on pts/0[jett@Rocky8 ~]$ sudo cat /etc/passwd|head -3root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin

范例:使用sudoedit命令可以以另外一个用户身份编辑文件

[jett@Rocky8 ~]$ su -root[root@Rocky8 ~]# visudo99 ## Allow root to run any commands anywhere100 root ALL=(ALL) ALL101 102 jett ALL=(ALL) ALL103 104 ## Allows members of the 'sys' group to run networking, software,[root@Rocky8 ~]# su - jettLast login: Sat Feb 4 11:46:31 CST on pts/0[jett@Rocky8 ~]$ sudoedit -u root /etc/shadow #使用sudoedit命令可以以另外一个用户身份编辑文件,[sudo] password for jett: sudoedit: /etc/shadow unchanged#可以看出如果给予普通用户最高权限后果非常严重,所以要遵守授权原则

2,文件权限

对文件设置一定存取权限,是一种常用的文件保护方法,Linux系统中对文件的访问者或者用户进行分类识别{文件主(owner)、文件主的同组用户(group)、其它用户(other)},所有人包括属主属组和其它用户就是all|a,对文件操作权限也进行了分类识别{读操作(read|r)、写操作(write|w)、执行操作(execute|x)、不能执行任何操作(-)}。每一个属性与文件属性的一个二进制位相对应,如果该存取权限设置了,对应的二进制位就是1,反之,就是0,因此使用8进制表示就是读r=4、写w=2、执行x=1。

#文件权限赋值写法,在命令中的字符+ 增加某些权限- 删除某些权限= 只保留某些权限,覆盖写法#常用写法u+r #属主加读权限g-x #属组去掉执行权限ug=rx #属主属组权限改为读和执行o= #other用户无任何权限a=rwx #所有用户都有读写执行权限#注意:1)用户的最终权限,是从左向右进行顺序匹配,即,所有者,所属组,其他人,一旦匹配权限立即生效,不再向右查看其权限2)r和w权限对root 用户无效,对没有读写权限的文件,root用户也可读可写3)只要所有者,所属组或other三者之一有x权限,root就可以执行

Linux采用树形目录结构,凡是得到某级目录的用户就可以得到该级目录所属的全部目录和文件,按目录中规定的存取权限使用目录或文件。

2.1 文件权限查看ls -l

由于对文件主、组和其它用户都有读、写、执行的权限设置,因此每个文件共有9个权限参数,通过命令“ls -l”就能看到各个文件的权限设置,文件的权限设置在列出的数据中的第一列显示。

第一列中的第1个位置表示文件类型:Linux 系统中的文件类型标识符

第一列第2-4个位置表示属主的权限;

第一列第5-7个位置表示属组的权限;

第一列第8-10个位置表示其它用户的权限;

2.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@Rocky8 ~]# useradd usertest1[root@Rocky8 ~]# useradd usertest2[root@Rocky8 ~]# getent passwd usertest1 usertest2usertest1:x:6694:6696::/home/usertest1:/bin/bashusertest2:x:6695:6697::/home/usertest2:/bin/bash[root@Rocky8 ~]# groupadd grouptest1[root@Rocky8 ~]# groupadd grouptest2[root@Rocky8 ~]# getent group grouptest1 grouptest2grouptest1:x:6698:grouptest2:x:6699:[root@Rocky8 ~]# touch f{1..5}[root@Rocky8 ~]# ll f*-rw-r--r-- 1 root root 0 Feb 2 22:03 f1-rw-r--r-- 1 root root 0 Feb 2 22:03 f2-rw-r--r-- 1 root root 0 Feb 2 22:03 f3-rw-r--r-- 1 root root 0 Feb 2 22:03 f4-rw-r--r-- 1 root root 0 Feb 2 22:03 f5-rwxrwxrwx 1 root root 3918756 Jan 31 14:59 file1-rw-r--r-- 1 root root10 Jan 29 22:42 file2[root@Rocky8 ~]# chown usertest1 f1 #只改变文件属主[root@Rocky8 ~]# chown :grouptest1 f1 #只改变文件属组[root@Rocky8 ~]# chown usertest2:grouptest2 f2 #即改变文件属主同时改变文件属组[root@Rocky8 ~]# chown 6694:6699 f3 #以UID、GID修改[root@Rocky8 ~]# chown -R usertest2:grouptest2 data/[root@Rocky8 ~]# ll f1 f2 f3 data/ #改变指定目录及其内所有子文件的所属主与所属组-rw-r--r-- 1 usertest1 grouptest1 0 Feb 2 22:03 f1-rw-r--r-- 1 usertest2 grouptest2 0 Feb 2 22:03 f2-rw-r--r-- 1 usertest1 grouptest2 0 Feb 2 22:03 f3data/:total 0drwxr-xr-x 3 usertest2 grouptest2 23 Jan 31 11:10 test[root@Rocky8 ~]# chown --reference=f3 f4 # 根据其它文件的属主属组同步给自己文件的属主属组[root@Rocky8 ~]# ll f3 f4-rw-r--r-- 1 usertest1 grouptest2 0 Feb 2 22:03 f3-rw-r--r-- 1 usertest1 grouptest2 0 Feb 2 22:03 f4

2.3 更改文件所属用户组chgrp

chgrp命令来自于英文词组”change group“的缩写,只能更改文件所属用户组。

#语法: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 #不更改符号链接指向的目录

范例:

[root@Rocky8 ~]# ll f4 data/-rw-r--r-- 1 usertest1 grouptest2 0 Feb 2 22:03 f4data/:total 0drwxr-xr-x 3 usertest2 grouptest2 23 Jan 31 11:10 test[root@Rocky8 ~]# chgrp usertest1 f4 #更改文件所属用户组为新的指定身份信息[root@Rocky8 ~]# chgrp -R usertest1 data/ #更改目录及其下所有文件的所属用户组为新的指定身份信息[root@Rocky8 ~]# ll f4 data/-rw-r--r-- 1 usertest1 usertest1 0 Feb 2 22:03 f4data/:total 0drwxr-xr-x 3 usertest2 usertest1 23 Jan 31 11:10 test

范例:

[root@Rocky8 ~]# ln -s f1 f1.link[root@Rocky8 ~]# ll f1.link lrwxrwxrwx 1 root root 2 Feb 2 23:29 f1.link -> f1[root@Rocky8 ~]# chgrp group1 --no-dereference f1.link #修改f1.link 本身的属组[root@Rocky8 ~]# ll f1.link lrwxrwxrwx 1 root group1 2 Feb 2 23:29 f1.link -> f1[root@Rocky8 ~]# ll f1-rw-r--r-- 1 usertest1 group1 0 Feb 2 22:03 f1[root@Rocky8 ~]# chgrp grouptest2 --dereference f1.link #修改f1.link所指向的属组[root@Rocky8 ~]# ll f1-rw-r--r-- 1 usertest1 grouptest2 0 Feb 2 22:03 f1

2.4 改变文件或目录权限chmod

chmod命令来自于英文词组”change mode“的缩写,其功能是用于改变文件或目录权限的命令。默认只有文件的所有者和管理员可以设置文件权限,普通用户只能管理自己文件的权限属性。设置权限时可以使用数字法,亦可使用字母表达式。

#语法:chmod [OPTION]... MODE[,MODE]... FILE...chmod [OPTION]... OCTAL-MODE FILE...chmod [OPTION]... --reference=RFILE FILE...#字母表达式,#MODEwho opt permissonwho # u|g|o|aopt # +|-|=permission # r|w|x#常用选项-c|--changes #同-v选项,但只显示更新成功的信息-f|--silent|--quiet #不显示错误信息-v|--verbose #显示过程--no-preserve-root #不特别对待“/”,意思就是将家目录当成普通目录来执行,默认如此,所以不要对根目录进行操作--preserve-root #不允许在"/"上递归操作--reference=RFILE #根据其它文件权限来操作,就是复制该文件的权限信息给指定文件-R|--recursive #递归操作

范例:字母表达法修改权限

[root@Rocky8 ~]# touch file{1..5}[root@Rocky8 ~]# ll total 0drwxr-xr-x 3 usertest2 usertest1 18 Jan 31 11:10 data-rw-r--r-- 1 rootroot 0 Feb 2 23:59 file1-rw-r--r-- 1 rootroot 0 Feb 2 23:59 file2-rw-r--r-- 1 rootroot 0 Feb 2 23:59 file3-rw-r--r-- 1 rootroot 0 Feb 2 23:59 file4-rw-r--r-- 1 rootroot 0 Feb 2 23:59 file5[root@Rocky8 ~]# chmod a= file1[root@Rocky8 ~]# chmod u=r,g=w,o=x file2[root@Rocky8 ~]# chmod u+w,g-x,o-r file3[root@Rocky8 ~]# chmod a=rwx file4[root@Rocky8 ~]# chmod ug=rx file5[root@Rocky8 ~]# lltotal 0drwxr-xr-x 3 usertest2 usertest1 18 Jan 31 11:10 data---------- 1 rootroot 0 Feb 2 23:59 file1-r---w---x 1 rootroot 0 Feb 2 23:59 file2-rw-r----- 1 rootroot 0 Feb 2 23:59 file3-rwxrwxrwx 1 rootroot 0 Feb 2 23:59 file4-r-xr-xr-- 1 rootroot 0 Feb 2 23:59 file5

范例:数字法修改权限

[root@Rocky8 ~]# chmod 640 file1[root@Rocky8 ~]# chmod 644 file2[root@Rocky8 ~]# chmod 755 file3[root@Rocky8 ~]# ll file1 file2 file3-rw-r----- 1 root root 0 Feb 2 23:59 file1 #属主可读写,属组可读,其它用户无任何权限-rw-r--r-- 1 root root 0 Feb 2 23:59 file2 #属主可读写,属组可读,其它用户可读-rwxr-xr-x 1 root root 0 Feb 2 23:59 file3 #属主可读写,可执行,属组可读可执行,其它用户可读可执行

范例:

#设定某个目录及其内子文件任何人都可以读取[root@Rocky8 ~]# chmod -R a+r data/[root@Rocky8 ~]# ll data/total 0drwxr-xr-x 3 usertest2 usertest1 23 Jan 31 11:10 test#设定某个二进制命令文件上新增SUID特殊权限位[root@Rocky8 ~]#chmod u+s /sbin/reboot

2.5 新建文件或目录默认权限umask

在linux 系统中,新建文件或目录,都有一个默认权限;权限掩码是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限,而umask命令可用来设定权限掩码。

umask 值间接影响新建文件和新建目录的权限:

新建文件:666-umask,按位对应相减,如果所得结果某位存在执行(奇数)权限,则该位+1;

新建目录:777-umask

非特权用户umask默认是 002

root的umask 默认是 022

持久保存umask

全局设置: /etc/bashrc

用户设置:~/.bashrc

#语法:umask [-p] [-S] [mode] 显示或设置文件权限掩码-S以文字的方式来表示权限掩码-p输出的权限掩码可直接作为指令来执行,如果省略 MODE 模式,以可重用为输入的格式输入

范例:

#使用指令”umask”查看当前权限掩码[root@Rocky8 ~]# umask0022[root@Rocky8 ~]# umask -pumask 0022[root@Rocky8 ~]# umask -s-bash: umask: -s: invalid optionumask: usage: umask [-p] [-S] [mode][root@Rocky8 ~]# umask -Su=rwx,g=rx,o=rx#使组用户的写权限,其他用户的读、写和执行权限都被取消[root@Rocky8 ~]#umask u=, g=w, o=rwx

3,特殊文件权限SUID 、SGID、 SBID

在Linux中,除了rwx 这三种常⻅的权限之外,还有三个特殊权限,分别是SUID、SGID与SBIT的特殊权限位,可以与一般权限同时使用,以弥补一般权限不能实现的功能。

SUID:字符表示为s,八进制表示为4,如果原属主没有可执行权限,再加SUID权限,则显示为SSGID:字符表示为s,八进制表示为2,如果原属组没有可执行权限,再加SGID权限,则显示为SSBIT:字符表示为t,八进制表示为1,如果other没有可执行权限,再加STICKY Bit权限,则显示为T

chmod命令设置特殊权限的参数

#参数 作用u+s设置SUID权限u-s取消SUID权限g+s设置SGID权限g-s取消SGID权限o+t设置SBIT权限o-t取消SBIT权限#SUID/SGID/SBIT权限设置和rwx差不多,也有两种方式,一种是以字符,一种是以数字。4 为 SUID = u+s2 为 SGID = g+s1 为 SBIT = o+t

SUID权限

Set UID,简称为SUID,仅对拥有执行权限的二进制程序有效,这个SUID不能放到目录上,也不能用在脚本上(script),放上也是无效的。能够让二进制程序的执行者临时拥有所有者的权限,因此,千万不要将SUID权限设置到vim、cat、rm等命令上面。

[root@Rocky8 ~]# ll /etc/shadow---------- 1 root root 1669 Feb 2 23:19 /etc/shadow[root@Rocky8 ~]# ll /bin/passwd #当s这个标志出现在文件所有者的x权限上时,则就被称为Set UID-rwsr-xr-x. 1 root root 33424 Apr 20 /bin/passwd#用户的登录密码是存放在/etc/shadow的文件中的,而这个文件的权限是“全0”,除了root用户能修改密码外,普通用户自己同样也能修改密码,为什么没有写入权限,还能修改密码,就是因为这个SUID功能,当某个用户执行/bin/passwd命令的时候,就拥有了root的权限了。

SUID权限设定:

chmod u+s FILE…

chmod 4xxx FILE

chmod u-s FILE…

[root@Rocky8 ~]# whoamiroot[root@Rocky8 ~]# su jett[jett@Rocky8 root]$ whoamijett[jett@Rocky8 root]$ cat /etc/shadow #普通用户无法查看密码文件cat: /etc/shadow: Permission denied[jett@Rocky8 root]$ ll /bin/cat-rwxr-xr-x 1 root root 38352 Sep 30 15:31 /bin/cat[jett@Rocky8 root]$ chmod u+s /bin/cat #普通用户不能设置suid权限chmod: changing permissions of '/bin/cat': Operation not permitted[jett@Rocky8 root]$ su rootPassword: [root@Rocky8 ~]# chmod u+s /bin/cat #添加suid权限之后有了root权限了[root@Rocky8 ~]# su jett[jett@Rocky8 root]$ ll /bin/cat-rwsr-xr-x 1 root root 38352 Sep 30 15:31 /bin/cat[jett@Rocky8 root]$ cat /etc/shadow |head -5 #有suid权限之后可以查看了root:$6$cPKVQe4MwVWb9vCN$Rrx2WSze5G86tEOzWOCcY6TeptTN0aHNceSqIpWj.h4sF/df3CdYM8xBHjERxt19pvSUtJWyDPckgbzxdMyPe1::0:99999:7:::bin:*:18700:0:99999:7:::daemon:*:18700:0:99999:7:::adm:*:18700:0:99999:7:::lp:*:18700:0:99999:7:::[jett@Rocky8 root]$

SGID权限

Set GID,简称为SGID,SGID特殊权限有两种应用场景:当对二进制程序进行设置时,能够让执行者临时获取文件所属组的权限;当对目录进行设置时,则是让目录内新创建的文件自动继承该目录原有用户组的名称。

SGID权限设定:

chmod g+s DIR...chmod 2xxx DIRchmod g-s DIR...

[root@Rocky8 ~]# useradd usertest[root@Rocky8 ~]# groupadd grouptest[root@Rocky8 ~]# mkdir datatest[root@Rocky8 ~]# chown usertest:grouptest datatest/[root@Rocky8 ~]# ll -d datatest/drwxr-xr-x 2 usertest grouptest 23 Feb 3 22:24 datatest/[root@Rocky8 ~]# chmod g+s datatest/ #为目录设置了SGID特殊权限位后,在此目录下建立新文件,则新文件的群组与此目录的群组相同。[root@Rocky8 ~]# touch datatest/testfile88 [root@Rocky8 ~]# ll datatest/testfile88 #新建文件属组变成了目录属组-rw-r--r-- 1 root grouptest 0 Feb 3 22:27 datatest/testfile88

SBIT

Sticky Bit,简称SBIT,目前只针对目录有效,SBIT对文件不起作用,针对others来设置的,对于目录的作用是:当用户在该目录下建立文件或目录时,仅有自己与 root才有权力删除。

Sticky权限设定:

chmod o+t DIR…

chmod 1xxx DIR

chmod o-t DIR…

最具有代表的就是/tmp目录,任何人都可以在/tmp内增加、修改文件(因为权限全是rwx),但仅有该文件/目录建立者与 root能够删除自己的目录或文件。

[jett@Rocky8 tmp]$ file /tmp #查看目录中的sticky权限/tmp: sticky, directory[root@Rocky8 ~]# ls -ald /tmpdrwxrwxrwt. 8 root root 105 Feb 3 22:27 /tmp #目录被设置SBIT特殊权限位后,文件的其他用户权限部分的x执行权限就会被替换成t或者T—原本有x执行权限则会写成t,原本没有x执行权限则会被写成T[root@Rocky8 ~]# cd /tmp[root@Rocky8 tmp]# touch test[root@Rocky8 tmp]# chmod 777 test[root@Rocky8 tmp]# ll -a test -rwxrwxrwx 1 root root 0 Feb 3 22:41 test[root@Rocky8 tmp]# su jett[jett@Rocky8 tmp]$ rm -rf /tmp/test rm: cannot remove '/tmp/test': Operation not permitted

4,隐藏文件权限chattr、lsattr

Linux系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉。隐藏权限的专用设置命令是chattr,专用查看命令是lsattr,使用常规的ls命令是不能看到的。

4.1 chattr命令

#语法:chattr [ -RVf ] [ -v version ] [ -p project ] [ mode ] files...#常用选项-p project #设置文件项目编号-R #递归执行-V #显示过程,并输出chattr 版本-f #不输出错误信息-v version #设置版本#操作符+attribute #添加该属性-attribute #去掉该属性=attribute #仅有该属性#常用属性a#对文件:可追加内容,不可被删除,不可被修改,不可被重命名;对目录,可新建,修改文件,但不可删除文件A#不更新atime,节省IOc#文件会被压缩保存i#对文件:不可被删除不可被修改不可重命名;对目录:可修改查看目录中的文件,不可新建文件,不可删除文件s#彻底删除文件,用0填充原来的数据块u#防止误删除,这里是指原来存储该文件的块不会被新的数据覆盖

范例:

[root@Rocky8 ~]# echo "for Test" > testfile[root@Rocky8 ~]# chattr +a testfile #设置了“不允许删除与覆盖”(+a参数)权限无法删除[root@Rocky8 ~]# rm -rf testfile rm: cannot remove 'testfile': Operation not permitted[root@Rocky8 ~]# lsattr testfile #lsattr显示文件特殊属性-----a-------------- testfile

4.2 lsattr命令

在Linux系统中,文件的隐藏权限必须使用lsattr命令来查看,平时使用的ls之类的命令是看不到的,lsattr命令英文全称为“list attributes”。

范例:

[root@Rocky8 ~]# echo "abcd">test.txt[root@Rocky8 ~]# chattr +i test.txt # +i 防止误删除[root@Rocky8 ~]# ll -a test.txt -rw-r--r-- 1 root root 5 Dec 4 12:47 test.txt[root@Rocky8 ~]# lsattr test.txt #lsattr显示文件特殊属性----i--------------- test.txt[root@Rocky8 ~]# rm -f test.txt #不咳删除rm: cannot remove 'test.txt': Operation not permitted[root@Rocky8 ~]# echo "123456" > test.txt #不可写入bash: test.txt: Operation not permitted[root@Rocky8 ~]# echo "123456" >> test.txt #不可追加bash: test.txt: Operation not permitted[root@Rocky8 ~]# mv test.txt /tmp #不可移动mv: cannot move 'test.txt' to '/tmp/test.txt': Operation not permitted[root@Rocky8 ~]# cp test.txt /tmp #可以复制[root@Rocky8 ~]# ll /tmp/test.txt -rw-r--r-- 1 root root 5 Dec 4 12:51 /tmp/test.txt[root@Rocky8 ~]# cat test.txt #可读abcd

5,文件访问控制列表ACL

Access Control List(访问控制列表),简称ACL,在 Linux 系统中, ACL 可实现对单一用户也可以针对某个组设定访问文件的权限。

ACL生效顺序:所有者->自定义用户->所属组|自定义组->其他人

ACL权限的设置都是立即且永久生效的,会覆盖掉文件原始的权限信息,所以要小心谨慎,不好找回之前设置,设置ACL权限的时候最好备份一下原始文件的ACL权限设置。

显示文件的ACL权限getfacl

getfacl命令用于查看文件的ACL权限规则,英文全称为“get files ACL”

#语法:getfacl [-aceEsRLPtpndvh] file ...getfacl [-aceEsRLPtpndvh] -

范例:查看文件是否设置了ACL,只需要看文件属性第一列的点“.”变成了加号“+”。

[root@Rocky8 ~]# ls -ld /root #查看文件是否设置了ACL,只需要看文件属性第一列的点“.”变成了加号“+”。dr-xrwx---+ 2 root root 151 Dec 4 12:07 /root[root@Rocky8 ~]# ls -ld /etcdrwxr-xr-x. 94 root root 8192 Feb 4 11:52 /etc

范例:查看文件的ACL权限规则

[root@Rocky8 ~]# getfacl /etc/fstab getfacl: Removing leading '/' from absolute path names# file: etc/fstab# owner: root# group: rootuser::rw-group::r--other::r--[root@Rocky8 ~]#

设置文件的ACL权限setfacl

setfacl命令用于管理文件的ACL权限规则,英文全称为“set files ACL”。

#语法setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file...setfacl --restore=file#常用选项-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一起使用

范例:普通用户单独设置一下文件访问权限ACL

[root@Rocky8 ~]# ls -ld /root #查看文件是否设置了ACL,只需要看文件属性第一列的点“.”变成了加号“+”。dr-xrwx---+ 2 root root 151 Dec 4 12:07 /root[root@Rocky8 ~]# ls -ld /etcdrwxr-xr-x. 94 root root 8192 Feb 4 11:52 /etc[root@Rocky8 ~]# su - jettLast login: Sat Feb 4 11:52:32 CST on pts/0[jett@Rocky8 ~]$ cd /root#普通用户无法进入/root目录中-bash: cd: /root: Permission denied[jett@Rocky8 ~]$ su -Password: Last login: Sat Feb 4 12:10:34 CST on pts/0[root@Rocky8 ~]# setfacl -Rm u:jett:rwx /root #普通用户单独设置一下文件访问权限ACL就可以了[root@Rocky8 ~]# su - jettLast login: Sat Feb 4 12:13:46 CST on pts/0[jett@Rocky8 ~]$ cd /root[jett@Rocky8 root]$ lsanaconda-ks.cfg

范例:

[root@Rocky8 ~]# ll /etc/shadow----rw----+ 1 root root 976 Dec 4 13:03 /etc/shadow[root@Rocky8 ~]# setfacl -m g:jett:rw /etc/shadow #允许某个组的用户都可以读写/etc/shadow文件[root@Rocky8 ~]# getfacl /etc/shadowgetfacl: Removing leading '/' from absolute path names# file: etc/shadow# owner: root# group: rootuser::---group::---group:jett:rw- #运行jett组用户读写操作mask::rw-other::---[root@Rocky8 ~]# [root@Rocky8 ~]# ll /etc/shadow #文件属性第一列的点“.”变成了加号“+”表示设置了ACL----rw----+ 1 root root 976 Dec 4 13:03 /etc/shadow[root@Rocky8 ~]# su - jettLast login: Sat Feb 4 12:15:44 CST on pts/0[jett@Rocky8 ~]$ cat /etc/shadowroot:$6$cPKVQe4MwVWb9vCN$Rrx2WSze5G86tEOzWOCcY6TeptTN0aHNceSqIpWj.h4sF/df3CdYM8xBHjERxt19pvSUtJWyDPckgbzxdMyPe1::0:99999:7:::bin:*:18700:0:99999:7:::daemon:*:18700:0:99999:7:::.........................省略部分信息...................................[root@Rocky8 ~]# setfacl -x g:jett /etc/shadow #选项-x删除特定ACL权限,-b清空ACL[root@Rocky8 ~]# getfacl /etc/shadowgetfacl: Removing leading '/' from absolute path names# file: etc/shadow# owner: root# group: rootuser::---group::---mask::---other::---

备份ACL权限

[root@Rocky8 ~]# cd /[root@Rocky8 /]# getfacl -R etc/ > ~/backupetc.ACL #getfacl在备份目录权限时必须先切换到备份目录的上一层目录,不能使用绝对路径的形式,参数-R目录本身及其文件的权限自动备份。[root@Rocky8 /]# cd[root@Rocky8 ~]# ll backupetc.ACL -rw-r--r-- 1 root root 67556 Feb 4 12:58 backupetc.ACL[root@Rocky8 ~]# cat backupetc.ACL | head # file: etc/# owner: root# group: rootuser::rwxgroup::r-xother::r-x# file: etc//fstab# owner: root# group: root[root@Rocky8 ~]# setfacl --restore backupetc.ACL setfacl: etc/: No such file or directorysetfacl: etc//fstab: No such file or directory.........省略部分信息................[root@Rocky8 ~]# cd / #ACL权限的恢复时同样需要切换到恢复文件的上一层目录[root@Rocky8 /]# setfacl --restore ~/backupetc.ACL [root@Rocky8 /]#

root

[jett@Rocky8 root]$ ls

anaconda-ks.cfg

范例:```bash[root@Rocky8 ~]# ll /etc/shadow----rw----+ 1 root root 976 Dec 4 13:03 /etc/shadow[root@Rocky8 ~]# setfacl -m g:jett:rw /etc/shadow #允许某个组的用户都可以读写/etc/shadow文件[root@Rocky8 ~]# getfacl /etc/shadowgetfacl: Removing leading '/' from absolute path names# file: etc/shadow# owner: root# group: rootuser::---group::---group:jett:rw- #运行jett组用户读写操作mask::rw-other::---[root@Rocky8 ~]# [root@Rocky8 ~]# ll /etc/shadow #文件属性第一列的点“.”变成了加号“+”表示设置了ACL----rw----+ 1 root root 976 Dec 4 13:03 /etc/shadow[root@Rocky8 ~]# su - jettLast login: Sat Feb 4 12:15:44 CST on pts/0[jett@Rocky8 ~]$ cat /etc/shadowroot:$6$cPKVQe4MwVWb9vCN$Rrx2WSze5G86tEOzWOCcY6TeptTN0aHNceSqIpWj.h4sF/df3CdYM8xBHjERxt19pvSUtJWyDPckgbzxdMyPe1::0:99999:7:::bin:*:18700:0:99999:7:::daemon:*:18700:0:99999:7:::.........................省略部分信息...................................[root@Rocky8 ~]# setfacl -x g:jett /etc/shadow #选项-x删除特定ACL权限,-b清空ACL[root@Rocky8 ~]# getfacl /etc/shadowgetfacl: Removing leading '/' from absolute path names# file: etc/shadow# owner: root# group: rootuser::---group::---mask::---other::---

备份ACL权限

[root@Rocky8 ~]# cd /[root@Rocky8 /]# getfacl -R etc/ > ~/backupetc.ACL #getfacl在备份目录权限时必须先切换到备份目录的上一层目录,不能使用绝对路径的形式,参数-R目录本身及其文件的权限自动备份。[root@Rocky8 /]# cd[root@Rocky8 ~]# ll backupetc.ACL -rw-r--r-- 1 root root 67556 Feb 4 12:58 backupetc.ACL[root@Rocky8 ~]# cat backupetc.ACL | head # file: etc/# owner: root# group: rootuser::rwxgroup::r-xother::r-x# file: etc//fstab# owner: root# group: root[root@Rocky8 ~]# setfacl --restore backupetc.ACL setfacl: etc/: No such file or directorysetfacl: etc//fstab: No such file or directory.........省略部分信息................[root@Rocky8 ~]# cd / #ACL权限的恢复时同样需要切换到恢复文件的上一层目录[root@Rocky8 /]# setfacl --restore ~/backupetc.ACL [root@Rocky8 /]#

mask权限**

用户或群组能拥有的最大 ACL 权限

用户设置的ACL与mask“按位相与”运算,最终得出的值才是用户真正的ACL权限,也就是说给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围。

[root@Rocky8 ~]# mkdir datatest[root@Rocky8 ~]# getfacl datatest/# file: datatest/# owner: root# group: rootuser::rwxgroup::r-xother::r-x[root@Rocky8 ~]# setfacl -m u:jett:rx datatest/[root@Rocky8 ~]# getfacl datatest/# file: datatest/# owner: root# group: rootuser::rwxuser:jett:r-x #用户jett对datatest/目录的权限group::r-xmask::r-x#mask权限,指的是用户或群组能拥有的最大 ACL 权限other::r-x#对比添加 ACL权限前后getfacl命令的输出信息,发现设置了ACL权限之后多了用户权限设置和mask权限设置。#用户设置的ACL与mask“按位相与”运算,r-x没有超过mask的r-x权限,所以用户jett对datatest/目录具有r-x权限。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。