赞
踩
管理员用户:
Root用户,也称根用户、超级用户、超级管理员
可对根目录执行读写和执行操作
具有系统中的最高、所有权限
普通用户:
权限有限的用户
Root用户拥有系统的所有权限,等同于操作系统的权限,足以把整个系统的大部分文件删掉,导致系统完全毁坏,不能再次使用。所以,用root进行不当的操作是相当危险的,轻微的可以死机,严重的甚至不能开机。但是有时候也有一些需要root权限的应用,譬如广告阻挡。除非确实需要,一般情况下都不推荐使用root。最好单独建立一个普通的用户,作为日常之用。
Linux系统是一个多用户、多任务的操作系统,每个用户之间都是互相隔离的,每个用户是通过User Id (UID)来唯一标识的,相当于人类社会的身份证号码。
Linux中可以将一个或多个用户加入用户组中,组就是包含0个或多个用户的集合,用户组是通过Group
ID(GID) 来唯一标识的。
用户(组)分类:
用户类型 | 用户名 | 用户ID (uid) | 作用 |
---|---|---|---|
超级管理员**(组)** | root(可自定义) | 0 | 超级管理员 |
系统用户**(组)** | 自定义 | 1-499(CentOS6及以前), 1-999(CentOS7及以后) | 给后台程序使用,像nginx,mysql等 |
登录用户**(组)** | 自定义 | 500+(CentOS6及以前), 1000+(CentOS7及以后) | 给用户进行交互式登录 |
命令提示符#、$
# 管理员
$ 普通用户
范例:显示系统中现有用户的相关信息
[root@Rocky8 ~]# lslogins UID USER PROC PWD-LOCK PWD-DENY LAST-LOGIN GECOS 0 root 153 0 0 09:57 root 1 bin 0 0 0 bin 2 daemon 0 0 0 daemon 3 adm 0 0 0 adm 4 lp 0 0 0 lp 5 sync 0 0 0 sync 6 shutdown 0 0 0 Feb02/01:08 shutdown 7 halt 0 0 0 halt 8 mail 0 0 0 mail 11 operator 0 0 0 operator 12 games 0 0 0 games 14 ftp 0 0 0 FTP User 59 tss 0 1 0 Account used for TPM access 72 tcpdump 0 1 0 74 sshd 0 1 0 Privilege-separated SSH 81 dbus 1 1 0 System message bus 89 postfix 0 1 0 193 systemd-resolve 0 1 0 systemd Resolver 991 setroubleshoot 0 1 0 992 unbound 0 1 0 Unbound DNS resolver 993 chrony 0 1 0 994 cockpit-wsinstance 0 1 0 User for cockpit-ws instances 995 cockpit-ws 0 1 0 User for cockpit web service 996 sssd 0 1 0 User for sssd 997 libstoragemgmt 1 1 0 daemon account for libstoragemgmt 998 polkitd 1 1 0 User for polkitd 999 systemd-coredump 0 1 0 systemd Core Dumper 1000 jett 0 0 0 65534 nobody 0 0 0 Kernel Overflow User
范例:
[root@Rocky8 ~]# who #查看当前登录用户信息
root pts/0 2023-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.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/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个或多个附加组;
/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 -3 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin #/etc/shadow文件同样是一行一个用户的信息,每个字段有不同含义 第一个字段:用户名 第二个字段:密码。有密码的用户在这里都是一串加密过的字符。这里我填了两个叹号,表示没有密码。 第三个字段:从1970/01/01到最近一次密码修改经过的时间,以天为单位。 第四个字段:密码过多久可以被修改,0表示随时可改。 第五个字段:密码的有效期 第六个字段:密码要过期前多少天提醒用户,7就是提前一周提醒。 第七个字段:密码过期后多少天之内还能登录,但是要登录必须改密码。 第八个字段:密码的最长使用期限 第九个字段:系统保留字段 所有伪用户的密码都是 "!!" 或 "*",代表没有密码是不能登录的,新建用户还没设密码时为!!,禁用账号,可以直接在密码字段前加 ! [root@Rocky8 ~]# cat /etc/shadow |head -3 root:$6$cPKVQe4MwVWb9vCN$Rrx2WSze5G86tEOzWOCcY6TeptTN0aHNceSqIpWj.h4sF/df3CdYM8xBHjERxt19pvSUtJWyDPckgbzxdMyPe1::0:99999:7::: bin:*:18700:0:99999:7::: daemon:*:18700:0:99999:7:::
useradd命令 – 创建并设置用户信息
newusers命令 – 更新和批量创建新用户
userdel命令 – 删除用户账户
passwd命令 – 设置和修改用户的密码值
chpasswd命令 – 批量更新用户密码
chage命令 – 修改帐号和密码的有效期限
usermod命令 – 修改用户账号信息
su命令 – 切换用户身份
who命令 – 查看当前登录用户信息
groups - 打印用户所在的组
getent命令 – 查看系统数据库中的记录信息
useradd命令来自于英文词组“User add”的全拼,其功能是用于创建并设置用户信息。
#语法: 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 中可以查看,指定用户使用/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/useradd GROUP=100 #useradd不指定组,且/etc/login.defs中的USERGROUPS_ENAB为no或useradd -N时,group 为100 HOME=/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 file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_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_DIR Maildir MAIL_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. UMASK 022 # 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_MODE 0700 # Password aging controls: # # PASS_MAX_DAYS Maximum number of days a password may be used. # PASS_MIN_DAYS Minimum number of days allowed between password changes. # PASS_MIN_LEN Minimum acceptable password length. # PASS_WARN_AGE Number of days warning given before a password expires. # PASS_MAX_DAYS 99999 #指定密码保持有效的最大天数 PASS_MIN_DAYS 0 #表示自从上次密码修改以来多少天后用户才被允许修改口令 PASS_MIN_LEN 5 #指定密码的最小长度 PASS_WARN_AGE 7 #表示在口令到期前多少天系统开始通知用户口令即将到期 # # Min/max values for automatic uid selection in useradd # UID_MIN 1000 #添加用户时,用户的UID 从1000开始 UID_MAX 60000 #指定最大UID为60000 # System accounts SYS_UID_MIN 201 SYS_UID_MAX 999 # # Min/max values for automatic gid selection in groupadd # GID_MIN 1000 #添加组时,组的GID从1000开始 GID_MAX 60000 #指定最大GID为60000 # System accounts SYS_GID_MIN 201 SYS_GID_MAX 999 # # 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_HOME yes #此项是指是否创建用户主目录,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/bash
linuxcool1:x:521:521::/home/zhangsan1:/bin/bash
linuxcool2:x:521:521::/home/zhangsan2:/bin/bash
#使用此文件批量创建用户
[root@Rocky8 ~]# newusers /root/newuserfile
[root@Rocky8 ~]# id linuxcool0
uid=520(linuxcool0) gid=520(linuxcool0) groups=520(linuxcool0)
[root@Rocky8 ~]# id linuxcool1
uid=521(linuxcool2) gid=521(linuxcool1) groups=521(linuxcool1)
[root@Rocky8 ~]# id linuxcool2
uid=521(linuxcool2) gid=521(linuxcool1) groups=521(linuxcool1)
范例:
#创建指定的用户信息,但不创建家目录,亦不让登录系统 [root@Rocky8 ~]# useradd -M -s /sbin/nologin user2 [root@Rocky8 ~]# id user2 uid=1002(user2) gid=1002(user2) groups=1002(user2) #创建指定的用户信息,并自定义UID值 [root@Rocky8 ~]# useradd -u 6688 user3 [root@Rocky8 ~]# id user3 uid=6688(user3) gid=6688(user3) groups=6688(user3) #创建用户前先建组,可以确保组ID是己知的 [root@Rocky8 ~]# groupadd -g 336 -r mysql [root@Rocky8 ~]# getent group mysql mysql:x:336: [root@Rocky8 ~]# getent gshadow mysql mysql:!:: #创建指定的用户信息,并追加指定组为该账户的扩展组 [root@Rocky8 ~]# useradd -G mysql user4 [root@Rocky8 ~]# id user4 uid=6689(user4) gid=6689(user4) groups=6689(user4),336(mysql) #创建指定的用户信息,并指定过期时间 [root@Rocky8 ~]# useradd -e "2025/05/05" user5 [root@Rocky8 ~]# id user5 uid=6690(user5) gid=6690(user5) groups=6690(user5) [root@Rocky8 ~]# getent passwd user5 user5:x:6690:6690::/home/user5:/bin/bash [root@Rocky8 ~]# getent shadow user5 user5:!!:19390:0:99999:7::20213: #创建多项定义的用户 [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
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、GID usermod: 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 mysql id: ‘mysql’: no such user [root@Rocky8 ~]# id newmysql uid=1234(newmysql) gid=336(mysql) groups=336(mysql)
范例:锁定用户,使密码无效
#锁定指定用户的账户,临时不允许登录系统 [root@Rocky8 ~]# usermod -L jett [root@Rocky8 ~]# getent shadow jett jett:!$6$wrYwzcQGIzCWUyU6$LoNSlWvL3M9GS4WE0Q9YAqgxkESrLAImEGZd/mD98RDkzfUwU.McQgkACw3EHHPmwtH2z/1uOXKGXP0EAygxO.::0:99999:7::: #解锁指定用户的账户,再次允许登录系统 [root@Rocky8 ~]# usermod -U jett [root@Rocky8 ~]# getent shadow jett jett:$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::::::
userdel命令来自于英文词组“user delete”的缩写,其功能是删除用户帐户和相关文件。Linux系统中一切都是文件,用户信息被保存到了/etc/passwd、/etc/shadow以及/etc/group文件中,因此使用userdel命令实际就是帮助我们删除了指定用户在上述三个文件中的对应信息。
#语法:
userdel [options] LOGIN
#常用参数:
-f 强制删除用户账号,正在登录状态的用户也可以删除
-r 删除用户主目录及其中的任何文件
范例:删除指定的用户账户信息
[user1@Rocky8 ~]$ whoami whoami: cannot find name for user ID 1001 #用户被删除后,其名下的文件无法显示属主属组,只能显示UID [root@Rocky8 ~]# ll -a /home/user1 total 12 drwx------ 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 2022 .bash_logout -rw-r--r-- 1 1001 1001 141 Aug 2 2022 .bash_profile -rw-r--r-- 1 1001 1001 376 Aug 2 2022 .bashrc #如果新建用户,使用了原用户的UID,则可以继承原用户文件 [root@Rocky8 ~]# useradd -u 1001 newuser1 [root@Rocky8 ~]# ll -a /home/newuser1 total 12 drwx------ 2 newuser1 newuser1 62 Feb 2 14:21 . drwxr-xr-x. 11 root root 137 Feb 2 14:21 .. -rw-r--r-- 1 newuser1 newuser1 18 Aug 2 2022 .bash_logout -rw-r--r-- 1 newuser1 newuser1 141 Aug 2 2022 .bash_profile -rw-r--r-- 1 newuser1 newuser1 376 Aug 2 2022 .bashrc #删除指定的用户账户信息及家目录 [root@Rocky8 ~]# userdel -rf newuser1 userdel: user newuser1 is currently used by process 2459 [root@Rocky8 ~]# id newuser1 id: ‘newuser1’: no such user
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 root root PS 1969-12-31 0 99999 7 -1 (Password set, SHA512 crypt.) #强制指定的用户在下次登陆时必须重置其密码 [root@Rocky8 ~]# passwd -e user1 #删除指定用户的密码值 [root@Rocky8 ~]# passwd -d user2 Removing password for user user2. passwd: Note: deleting a password also unlocks the password. passwd: Success [root@Rocky8 ~]# passwd user2 Changing password for user user2. New password: BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word Retype new password: passwd: all authentication tokens updated successfully. [root@Rocky8 ~]# getent shadow user2 user2:$6$z73dgtJohvibO9s0$QhYKE4ajBxooKKbnZusjVBsIj4SHZhy4kc7HrP8L4p39kokYfWYdRrsGiaCytwYQ2Po2xuhNfjeMlJuWUyCr5.:19390:0:99999:7::: #锁定指定用户的密码值,不允许其进行修改 [root@Rocky8 ~]# passwd -l user2 Locking password for user user2. passwd: Success #解锁指定用户的密码值,允许其进行修改 [root@Rocky8 ~]# passwd -u user2 Unlocking 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
chpasswd命令是批量更新用户口令的工具,是把一个文件内容重新定向添加到/etc/shadow中。
范例:
[root@Rocky8 ~]# cat newuserfile linuxcool0:x:520:520::/home/zhangsan0:/bin/bash linuxcool1:x:521:521::/home/zhangsan1:/bin/bash linuxcool2:x:521:521::/home/zhangsan2:/bin/bash [root@Rocky8 ~]# getent shadow linuxcool0 linuxcool1 linuxcool2 linuxcool0:$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:aa123456 linuxcool1:bb345678 linuxcool2:cc567890 [root@Rocky8 ~]# chpasswd < passfile [root@Rocky8 ~]# getent shadow linuxcool0 linuxcool1 linuxcool2 linuxcool0:$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:::
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 root Last password change : never 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 #使用-M参数设置user2用户的密码最大有效期为100天 [root@Rocky8 ~]# chage -M 100 user2 [root@Rocky8 ~]# getent shadow user2 user2:$6$DoHfEFJkV2RtQUj8$Cvf0pN9z6JVGr1IUxdMPGe0Hj9DM19k9awelGrIs4GtKHT4KXtQX8tHpJrx2qCq05U3WxmbdzGvypvKtHfTgL1:19390:0:100:7::: #自定义用户user2密码策略 [root@Rocky8 ~]# chage user2 Changing the aging information for user2 Enter the new value, or press ENTER for the default Minimum Password Age [0]: 3 #密码保持有效的最小天数 Maximum Password Age [100]: 100 #密码保持有效的最大天数 Last Password Change (YYYY-MM-DD) [2023-02-02]: 2023-02-03 #更改密码的时间 Password Expiration Warning [7]: 2 #用户密码到期前,提前收到警告信息的天数 Password Inactive [-1]: 1 #密码过期后的宽限期 Account Expiration Date (YYYY-MM-DD) [-1]: 2023-04-18 #用户的有效期,帐号到期的日期,会禁止此帐号 [root@Rocky8 ~]# chage -l user2 Last password change : Feb 03, 2023 Password expires : May 14, 2023 Password inactive : May 15, 2023 Account expires : Apr 18, 2023 Minimum number of days between password change : 3 Maximum number of days between password change : 100 Number of days of warning before password expires : 2 [root@Rocky8 ~]# getent shadow user2 user2:$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 #用户的有效期,帐号到期的日期,会禁止此帐号
/etc/group:组及其属性信息
/etc/gshadow:组密码及其相关属性
[root@Rocky8 ~]# man group 查看帮助文档
[root@Rocky8 ~]# man gshadow 查看帮助文档
#/etc/group文件一行有四个字段其含义如下 第一个字段是组名 第二个字段是组密码,这里的 x 和 /etc/passwd 的密码字段差不多。 第三个字段就是GID 第四个字段是组中的用户 [root@Rocky8 ~]# cat /etc/group |head -3 root:x:0: bin:x:1: daemon:x:2: #/etc/gshadow文件中,每行代表一个组用户的密码信息,各行信息用 ":" 作为分隔符分为 4 个字段,每个字段的含义如下: 第一个字段是组名,同 /etc/group 文件中的组名相对应 第二个字段是组密码 第三个字段是组管理员 第四个字段是组附加用户列表,桶/etc/group 文件中附加组显示内容相同 [root@Rocky8 ~]# cat /etc/gshadow |head -3 root::: bin::: daemon:::
创建新的用户组-groupadd
修改用户组属性-groupmod
删除用户组-groupdel
更改组成员和密码-gpasswd
管理用户主组的成员-groupmems
用户组切换-newgrp
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:
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 user2 user2 : user2 [root@Rocky8 ~]# groupmod -n user2.ng user2 [root@Rocky8 ~]# groups user2 user2 : user2.ng #更改用户组的GID [root@Rocky8 ~]# cat /etc/group|tail -5 mysql:x:336:user4 user4:x:6689: user5:x:6690: group1:x:1234: user2.ng:x:1002: [root@Rocky8 ~]# groupmod -g 11111 group1 [root@Rocky8 ~]# cat /etc/group|grep group1 group1:x:11111:
groupdel命令用于删除指定的工作组,本命令要修改的系统文件包括/ect/group和/ect/gshadow。
#语法:groupdel [options] GROUP
#常见选项
-f|--force #强制删除,即使是用户的主组也强制删除组,但会导致无主组的用户不可用无法登录
范例:
[root@Rocky8 ~]# cat /etc/group|tail -5
mysql:x:336:user4
user4:x:6689:
user5:x:6690:
group1:x:11111:
user2.ng:x:1002:
[root@Rocky8 ~]# groupdel group1
[root@Rocky8 ~]# getent group group1
[root@Rocky8 ~]#
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 group2 group1:x:6691: group2:x:6695: [root@Rocky8 ~]# useradd u1 [root@Rocky8 ~]# useradd u2 [root@Rocky8 ~]# useradd u3 [root@Rocky8 ~]# getent passwd u1 u2 u3 u1:x:6691:6692::/home/u1:/bin/bash u2:x:6692:6693::/home/u2:/bin/bash u3:x:6693:6694::/home/u3:/bin/bash #将指定用户加入到指定用户组 [root@Rocky8 ~]# groups u1 u1 : u1 [root@Rocky8 ~]# gpasswd -a u1 group1 Adding user u1 to group group1 [root@Rocky8 ~]# groups u1 u1 : u1 group1 [root@Rocky8 ~]# groupmems -g group1 -l u1 #将指定用户从指定用户组中删除 [root@Rocky8 ~]# gpasswd -d u1 group1 Removing user u1 from group group1 [root@Rocky8 ~]# groups u1 u1 : u1 #为指定用户组设置管理密码 [root@Rocky8 ~]# gpasswd group1 Changing the password for group group1 New 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 group1 group1:::u1
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 -l u1 #设置用户u2的主要组群为group1 [root@Rocky8 ~]# groupmems -g group1 -a u2 [root@Rocky8 ~]# groupmems -g group1 -l u1 u2 [root@Rocky8 ~]# groups u2 u2 : 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
在Linux系统中同样有一些用户帐户是在系统安装后就有的,用来完成特定任务的,比如nobody和ftp。nobody是一个普通用户,同时nobody用户都是伪用户,非特权用户,其 UID 和 GID 不提供任何特权,该uid和gid只能访问人人皆可读写的文件,只能访问服务器上的公共内容,默认登录shell是’/sbin/nologin’,所以这个用户是无法直接登录系统的。简单理解就是nobody相当于Windows系统中的匿名帐户。
[root@Rocky8 ~]# id nobody
uid=65534(nobody) gid=65534(nobody) groups=65534(nobody)
[root@Rocky8 ~]# cat /etc/passwd |grep nobody #系统中会默认创建一个nobody
nobody: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 2022 on pts/1 [mysql@Rocky8 ~]$ getent passwd mysql mysql:x:1001:1001::/home/mysql:/sbin/nologin [mysql@Rocky8 ~]$ whoami ; id mysql uid=1001(mysql) gid=1001(mysql) groups=1001(mysql) [mysql@Rocky8 ~]$ touch testfile [mysql@Rocky8 ~]$ ls testfile
对于那些登陆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 - mail This account is system account or mail account. [root@Rocky8 ~]# su - ftp This account is system account or mail account. [root@Rocky8 ~]# su - sshd This 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/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin nobody: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 2023 on pts/0 This account is currently not available. [root@Rocky8 ~]# whoami root
总结:
nobody是linux/unix系统下的匿名用户,只能访问服务器上的公共内容
/sbin/nologin是linux/unix系统下的一种shell设置项对于登陆shell为/sbin/nologin的用户是不允许登录系统的
/etc/nologin.txt只针对shell为/sbin/nologin的用户
/etc/nologin可以理解为针对所有普通用户
id命令打印真实有效的用户和组ID。
#语法:
id [OPTION]... [USER]
#常用参数:
-g 显示用户所属群组的ID
-G 显示用户扩展群组的ID
-n 显示用户所属群组或扩展群组的名称
-r 显示实际ID
-u 显示用户ID
范例:
#显示当前用户的身份信息
[root@Rocky8 ~]# id
uid=0(root) gid=0(root) groups=0(root),6691(group1),6695(group2)
#-g 显示当前用户的所属群组GID,-u 显示当前用户的身份码UID
[root@Rocky8 ~]# id -g
0
[root@Rocky8 ~]# id -u
0
查询指定用户的身份信息
[root@Rocky8 ~]# id u1
uid=6691(u1) gid=6692(u1) groups=6692(u1),6691(group1)
面试题:
需求:手动新建一个用户,用户名为zhangsan,uid设置为1024(前提是这个uid没有被占用),gid也设置为1024,组名与用户名同名,家目录在/home/zhangsan、默认shell为/bin/bash
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 ; id
root
uid=0(root) gid=0(root) groups=0(root)
[root@Rocky8 ~]# su - jett #从root管理员切换至普通用户,不需要密码,减号(-)意味着完全切换到新的用户,比较推荐这种方式。
[jett@Rocky8 ~]$ whoami ; id
jett
uid=1000(jett) gid=1000(jett) groups=1000(jett)
[jett@Rocky8 ~]$ su - root #从普通用户切换成root管理员就需要进行密码验证
Password: 输入root管理员密码
Last login: Sun Dec 4 12:44:48 CST 2022 on pts/1
[root@Rocky8 ~]# whoami ; id
root
uid=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 2022 on pts/1 [mysql@Rocky8 ~]$ getent passwd mysql mysql:x:1001:1001::/home/mysql:/sbin/nologin [mysql@Rocky8 ~]$ whoami ; id mysql uid=1001(mysql) gid=1001(mysql) groups=1001(mysql) [mysql@Rocky8 ~]$ touch testfile [mysql@Rocky8 ~]$ ls testfile
范例:切换到root用户
[jett@Rocky8 ~]$ su -
Password:
Last login: Sat Feb 4 11:51:31 CST 2023 on pts/0
[root@Rocky8 jett]# whoami
root
sudo允许一个用户作为超级用户或安全策略指定的其他用户执行命令,默认的安全策略是sudoers,安全策略决定了用户运行sudo的权限。配置sudo服务可以直接编辑配置文件/etc/sudoers,亦可以执行visudo命令(自动调用vi编辑器来配置/etc/sudoers权限文件)进行设置。
#语法 sudo -h | -K | -k | -V sudo -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 -l Matching 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/bin User root may run the following commands on Rocky8: (ALL) ALL [root@Rocky8 ~]# su - jett Last login: Sat Feb 4 10:42:24 CST 2023 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 - root Password: Last login: Sat Feb 4 10:43:56 CST 2023 on pts/0 [root@Rocky8 ~]# visudo #visudo命令自动调用vi编辑器来配置/etc/sudoers权限文件 ## Allow root to run any commands anywhere root ALL=(ALL) ALL jett 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 2023 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/bin User 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 anywhere root 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 anywhere root ALL=(ALL) ALL jett 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 - jett Last login: Sat Feb 4 11:02:58 CST 2023 on pts/0 [jett@Rocky8 ~]$ cat /etc/shadow cat: /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 102 sudo: no valid sudoers sources found, quitting sudo: unable to initialize policy plugin [jett@Rocky8 ~]$ su - root Password: Last login: Sat Feb 4 10:54:59 CST 2023 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 anywhere 100 root ALL=(ALL) ALL 101 102 jett ALL=(ALL) /usr/bin/cat,/usr/bin/touch 103 104 ## Allows members of the 'sys' group to run networking, software, [root@Rocky8 ~]# visudo -c #再次检查语法,语法OK /etc/sudoers: parsed OK [root@Rocky8 ~]# su - jett Last login: Sat Feb 4 11:30:02 CST 2023 on pts/0 [jett@Rocky8 ~]$ cat /etc/shadow cat: /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 anywhere root ALL=(ALL) ALL jett 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 2023 on pts/0 [jett@Rocky8 ~]$ sudo cat /etc/passwd|head -3 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
范例:使用sudoedit命令可以以另外一个用户身份编辑文件
[jett@Rocky8 ~]$ su -root
[root@Rocky8 ~]# visudo
99 ## Allow root to run any commands anywhere
100 root ALL=(ALL) ALL
101
102 jett ALL=(ALL) ALL
103
104 ## Allows members of the 'sys' group to run networking, software,
[root@Rocky8 ~]# su - jett
Last login: Sat Feb 4 11:46:31 CST 2023 on pts/0
[jett@Rocky8 ~]$ sudoedit -u root /etc/shadow #使用sudoedit命令可以以另外一个用户身份编辑文件,
[sudo] password for jett:
sudoedit: /etc/shadow unchanged
#可以看出如果给予普通用户最高权限后果非常严重,所以要遵守授权原则
对文件设置一定存取权限,是一种常用的文件保护方法,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采用树形目录结构,凡是得到某级目录的用户就可以得到该级目录所属的全部目录和文件,按目录中规定的存取权限使用目录或文件。
由于对文件主、组和其它用户都有读、写、执行的权限设置,因此每个文件共有9个权限参数,通过命令“ls -l”就能看到各个文件的权限设置,文件的权限设置在列出的数据中的第一列显示。
第一列中的第1个位置表示文件类型:Linux 系统中的文件类型标识符
文件类型 | 标识符 | 说明 |
---|---|---|
普通文件 | - | |
目录文件 | d | directory |
符号链接文件 | l | link |
块设备文件 | b | b:block device,随机访问 |
字符设备文件 | c | c:character device,线性访问 |
管道文件 | p | pipe |
套接字文件 | s | socket |
第一列第2-4个位置表示属主的权限;
第一列第5-7个位置表示属组的权限;
第一列第8-10个位置表示其它用户的权限;
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 usertest2 usertest1:x:6694:6696::/home/usertest1:/bin/bash usertest2:x:6695:6697::/home/usertest2:/bin/bash [root@Rocky8 ~]# groupadd grouptest1 [root@Rocky8 ~]# groupadd grouptest2 [root@Rocky8 ~]# getent group grouptest1 grouptest2 grouptest1: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 root 10 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 f3 data/: total 0 drwxr-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
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 f4
data/:
total 0
drwxr-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 f4
data/:
total 0
drwxr-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
chmod命令来自于英文词组”change mode“的缩写,其功能是用于改变文件或目录权限的命令。默认只有文件的所有者和管理员可以设置文件权限,普通用户只能管理自己文件的权限属性。设置权限时可以使用数字法,亦可使用字母表达式。
#语法: chmod [OPTION]... MODE[,MODE]... FILE... chmod [OPTION]... OCTAL-MODE FILE... chmod [OPTION]... --reference=RFILE FILE... #字母表达式,#MODE who opt permisson who # u|g|o|a opt # +|-|= 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 0 drwxr-xr-x 3 usertest2 usertest1 18 Jan 31 11:10 data -rw-r--r-- 1 root root 0 Feb 2 23:59 file1 -rw-r--r-- 1 root root 0 Feb 2 23:59 file2 -rw-r--r-- 1 root root 0 Feb 2 23:59 file3 -rw-r--r-- 1 root root 0 Feb 2 23:59 file4 -rw-r--r-- 1 root root 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 ~]# ll total 0 drwxr-xr-x 3 usertest2 usertest1 18 Jan 31 11:10 data ---------- 1 root root 0 Feb 2 23:59 file1 -r---w---x 1 root root 0 Feb 2 23:59 file2 -rw-r----- 1 root root 0 Feb 2 23:59 file3 -rwxrwxrwx 1 root root 0 Feb 2 23:59 file4 -r-xr-xr-- 1 root root 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 0
drwxr-xr-x 3 usertest2 usertest1 23 Jan 31 11:10 test
#设定某个二进制命令文件上新增SUID特殊权限位
[root@Rocky8 ~]#chmod u+s /sbin/reboot
在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 ~]# umask
0022
[root@Rocky8 ~]# umask -p
umask 0022
[root@Rocky8 ~]# umask -s
-bash: umask: -s: invalid option
umask: usage: umask [-p] [-S] [mode]
[root@Rocky8 ~]# umask -S
u=rwx,g=rx,o=rx
#使组用户的写权限,其他用户的读、写和执行权限都被取消
[root@Rocky8 ~]#umask u=, g=w, o=rwx
在Linux中,除了rwx 这三种常⻅的权限之外,还有三个特殊权限,分别是SUID、SGID与SBIT的特殊权限位,可以与一般权限同时使用,以弥补一般权限不能实现的功能。
SUID:字符表示为s,八进制表示为4,如果原属主没有可执行权限,再加SUID权限,则显示为S
SGID:字符表示为s,八进制表示为2,如果原属组没有可执行权限,再加SGID权限,则显示为S
SBIT:字符表示为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+s
2 为 SGID = g+s
1 为 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 2022 /bin/passwd
#用户的登录密码是存放在/etc/shadow的文件中的,而这个文件的权限是“全0”,除了root用户能修改密码外,普通用户自己同样也能修改密码,为什么没有写入权限,还能修改密码,就是因为这个SUID功能,当某个用户执行/bin/passwd命令的时候,就拥有了root的权限了。
SUID权限设定:
chmod u+s FILE…
chmod 4xxx FILE
chmod u-s FILE…
[root@Rocky8 ~]# whoami root [root@Rocky8 ~]# su jett [jett@Rocky8 root]$ whoami jett [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 root Password: [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 DIR
chmod 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 /tmp
drwxrwxrwt. 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
Linux系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉。隐藏权限的专用设置命令是chattr,专用查看命令是lsattr,使用常规的ls命令是不能看到的。
#语法: chattr [ -RVf ] [ -v version ] [ -p project ] [ mode ] files... #常用选项 -p project #设置文件项目编号 -R #递归执行 -V #显示过程,并输出chattr 版本 -f #不输出错误信息 -v version #设置版本 #操作符 +attribute #添加该属性 -attribute #去掉该属性 =attribute #仅有该属性 #常用属性 a #对文件:可追加内容,不可被删除,不可被修改,不可被重命名;对目录,可新建,修改文件,但不可删除文件 A #不更新atime,节省IO c #文件会被压缩保存 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
在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
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 /etc
drwxr-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: root
user::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 /etc drwxr-xr-x. 94 root root 8192 Feb 4 11:52 /etc [root@Rocky8 ~]# su - jett Last login: Sat Feb 4 11:52:32 CST 2023 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 2023 on pts/0 [root@Rocky8 ~]# setfacl -Rm u:jett:rwx /root #普通用户单独设置一下文件访问权限ACL就可以了 [root@Rocky8 ~]# su - jett Last login: Sat Feb 4 12:13:46 CST 2023 on pts/0 [jett@Rocky8 ~]$ cd /root [jett@Rocky8 root]$ ls anaconda-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/shadow getfacl: Removing leading '/' from absolute path names # file: etc/shadow # owner: root # group: root user::--- 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 - jett Last login: Sat Feb 4 12:15:44 CST 2023 on pts/0 [jett@Rocky8 ~]$ cat /etc/shadow root:$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/shadow getfacl: Removing leading '/' from absolute path names # file: etc/shadow # owner: root # group: root user::--- 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: root user::rwx group::r-x other::r-x # file: etc//fstab # owner: root # group: root [root@Rocky8 ~]# setfacl --restore backupetc.ACL setfacl: etc/: No such file or directory setfacl: 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/shadow getfacl: Removing leading '/' from absolute path names # file: etc/shadow # owner: root # group: root user::--- 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 - jett Last login: Sat Feb 4 12:15:44 CST 2023 on pts/0 [jett@Rocky8 ~]$ cat /etc/shadow root:$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/shadow getfacl: Removing leading '/' from absolute path names # file: etc/shadow # owner: root # group: root user::--- 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: root user::rwx group::r-x other::r-x # file: etc//fstab # owner: root # group: root [root@Rocky8 ~]# setfacl --restore backupetc.ACL setfacl: etc/: No such file or directory setfacl: 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: root user::rwx group::r-x other::r-x [root@Rocky8 ~]# setfacl -m u:jett:rx datatest/ [root@Rocky8 ~]# getfacl datatest/ # file: datatest/ # owner: root # group: root user::rwx user:jett:r-x #用户jett对datatest/目录的权限 group::r-x mask::r-x #mask权限,指的是用户或群组能拥有的最大 ACL 权限 other::r-x #对比添加 ACL权限前后getfacl命令的输出信息,发现设置了ACL权限之后多了用户权限设置和mask权限设置。 #用户设置的ACL与mask“按位相与”运算,r-x没有超过mask的r-x权限,所以用户jett对datatest/目录具有r-x权限。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。