用户组群与文件目录权限管理
文章目录
3.1 用户账户
3.1.2.用户账户密码文件
1.用户账户管理文件–/etc/passwd
/etc/passwd是一个账户管理文件,这个文件可以实现对用户的管理,每个用户在该文件中都对应一行,其中记录了该用户的相关信息。
passwd文件中的每一行代表一个用户的资料,可以看到第一个用户是root,其后是一些标准账户,每行由7个字段的数据组成,字段之间用":"符号分隔,其格式如下。
账户名称:密码: UID:GID:用户信息:主目录:命令解释器(登录Shell)
其中,数字段的内容可以是空的,但任需要使用":"符号进行占位来表示该字段
[root@tjy ~]# cat -n /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
14 tss:x:59:59:Account used for TPM access:/:/sbin/nologin
15 systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
16 dbus:x:81:81:System message bus:/:/sbin/nologin
17 polkitd:x:998:996:User for polkitd:/:/sbin/nologin
18 avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
19 colord:x:997:995:User for colord:/var/lib/colord:/sbin/nologin
20 rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
21 pipewire:x:996:992:PipeWire System Daemon:/var/run/pipewire:/sbin/nologin
22 clevis:x:995:991:Clevis Decryption Framework unprivileged user:/var/cache/clevis:/usr/sbin/nologin
23 sssd:x:994:990:User for sssd:/:/sbin/nologin
24 geoclue:x:993:989:User for geoclue:/var/lib/geoclue:/sbin/nologin
25 flatpak:x:992:988:User for flatpak system helper:/:/sbin/nologin
26 setroubleshoot:x:991:987:SELinux troubleshoot server:/var/lib/setroubleshoot:/usr/sbin/nologin
27 libstoragemgmt:x:985:985:daemon account for libstoragemgmt:/:/usr/sbin/nologin
28 systemd-oom:x:984:984:systemd Userspace OOM Killer:/:/usr/sbin/nologin
29 gdm:x:42:42::/var/lib/gdm:/sbin/nologin
30 cockpit-ws:x:983:982:User for cockpit web service:/nonexisting:/sbin/nologin
31 cockpit-wsinstance:x:982:981:User for cockpit-ws instances:/nonexisting:/sbin/nologin
32 gnome-initial-setup:x:981:980::/run/gnome-initial-setup/:/sbin/nologin
33 sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/sbin/nologin
34 chrony:x:980:979:chrony system user:/var/lib/chrony:/sbin/nologin
35 dnsmasq:x:979:978:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/usr/sbin/nologin
36 tcpdump:x:72:72::/:/sbin/nologin
37 tang:x:1000:1000:tang:/home/tang:/bin/bash
[root@tjy ~]#
2.用户密码文件–/etc/shadow
在/etc/passwd文件中,有一个字段用来存放经过加密后的密码。先来查看/etc/passwd文件的权限。
[root@tjy ~]# ls -l /etc/passwd
-rw-r--r--. 1 root root 2100 3月 15 20:04 /etc/passwd
[root@tjy ~]#
查看/etc/shadow文件的权限。
[root@tjy ~]# ls -l /etc/shadow
----------. 1 root root 1141 4月 1 09:47 /etc/shadow
[root@tjy ~]#
可以看到/etc/shadow和/etc/passwd文件的内容类似,前者中的每一行都和后者的每一行对应,每个用户的信息在/etc/shadow文件中占用一行,并用":"符号分隔9个字段。其格式如下。
账户名称: 密码: 最后一次修改时间: 最小时间间隔: 最大时间间隔: 警告时间: 不活动时间: 失效时间: 标志字段
其中,少数字段的内容是可以为空的,但仍然需要使用":"符号进行占位来表示该字段。
[root@tjy ~]# cat -n /etc/shadow
1 root:$6$fShl0hM0RL9lmPBz$hL6yMYi2C8FcrkAkDaUOYSFoEJ3Xausn4JQsEdcSTZZBnpLx.CaEX95JitcU2n1GdnzKOT3dxcco81vfOeK.5.:19814:0:99999:7:::
2 bin:*:19347:0:99999:7:::
3 daemon:*:19347:0:99999:7:::
4 adm:*:19347:0:99999:7:::
5 lp:*:19347:0:99999:7:::
6 sync:*:19347:0:99999:7:::
7 shutdown:*:19347:0:99999:7:::
8 halt:*:19347:0:99999:7:::
9 mail:*:19347:0:99999:7:::
......
37 tang:$6$e4/.cToBFI4I0ap5$54cjpQKt.VUuAfS99fRUEZ3cdNXJVGYC1GPoZnFy0k5DK7ioNPyIWd6v9aD8X.o3o5KkyACufNbwmb/cBsu071:19797:0:99999:7:::
[root@tjy ~]#
3.1.3.用户账户管理
用户账户管理包括建立用户、设置账户密码和用户账户维护等内容。
1.useradd(adduser)命令–建立用户账户
在Linux操作系统中可以使用useradd或者adduser命令来建立用户账户。
其命令格式如下。
useradd [选项] 用户名user
【实例3.1】使用useradd命令,新建用户user01,UID为2000,用户主目录为/home/user01,用户的Shell为/bin/bash,用户的密码为admin@123,,用户账户用户不过期。执行命令如下。
[root@tjy ~]# useradd -u 2000 -d /home/user01 -S /bin/bash -p admin@123 -f -1 user01
[root@tjy ~]# tail -1 /etc/passwd
user01:x:2000:2000::/home/user01:/bin/bash
[root@tjy ~]#
如果新建用户已存在,那么执行useradd命令时,系统会提示该用户已经存在。
[root@tjy ~]# useradd user01
useradd:用户“user01”已存在
[root@tjy ~]#
2.passwd命令–设置账户密码
passwd命令可以修改用户账号的密码,超级用户可以为自己和其他的用户设置密码,而普通用户账户只能为自己设置密码。其命令格式如下。
passwd [选项] 用户名
【实例3.2】使用passwd命令,修改用户root和用户user01的密码。执行命令如下。
[root@tjy ~]# passwd //用户root修改自己的密码,直接按"Enter"键即可
更改用户 root 的密码 。
新的密码:
无效的密码: 密码是一个回文 //提示无效的密码,密码位数不少于8个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。
[root@tjy ~]# passwd user01 //修改用户user01的密码
更改用户 user01 的密码 。
新的密码:
无效的密码: 密码是一个回文
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。
[root@tjy ~]#
3.chage命令–修改用户账户口令属性
chage命令也可以修改用户账户的口令等相关属性。其命令格式如下。
chage [选项] 用户名
【实例3.3】使用chage命令,设置用户user01的最短口令存活期为10天,最长口令存活期为90天,口令到期前3天提醒用户修改口令,设置完成后查看各属性值。执行命令如下。
[root@tjy ~]# chage -m 10 -M 90 -W3 user01
[root@tjy ~]# chage -l user01
最近一次密码修改时间 :4月 02, 2024
密码过期时间 :7月 01, 2024
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :10
两次改变密码之间相距的最大天数 :90
在密码过期之前警告的天数 :3
[root@tjy ~]#
4.usermod命令–修改用户账户
usermod命令用于修改账户的属性。其命令格式如下。
usermod [选项] 用户名
Linux操作系统中的一切都是文件,因此在其中创建用户的过程中就是修改配置文件的过程,用户的信息保存在/etc/passwd文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用usermod命令修改已经创建的用户信息,如用户的UID、用户组、默认终端等。
【实例3.4】使用usermod命令,维护用户账户、禁用和恢复用户账户。
先来看一下用户user01的默认信息。
[root@tjy ~]# id user01
用户id=2000(user01) 组id=2000(user01) 组=2000(user01)
[root@tjy ~]#
将用户user01加入root用户组,这样扩展组列表中会出现root用户组的字样,而基本组不会受影响。
[root@tjy ~]# usermod -G root user01
[root@tjy ~]# id user01
用户id=2000(user01) 组id=2000(user01) 组=2000(user01),0(root)
[root@tjy ~]#
可以使用-u参数修改用户user01的UID,操作命令如下。
[root@tjy ~]# usermod -u 5000 user01
[root@tjy ~]# id user01
用户id=5000(user01) 组id=2000(user01) 组=2000(user01),0(root)
[root@tjy ~]#
修改用户user01的主目录为/var/user01,把启动Shell修改为/bin/tabs,完成后恢复初始状态,操作命令如下。
[root@tjy ~]# usermod -d /var/user01 -s /bin/tabs user01
[root@tjy ~]# tail -2 /etc/passwd
tang:x:1000:1000:tang:/home/tang:/bin/bash
user01:x:5000:2000::/var/user01:/bin/tabs
[root@tjy ~]# usermod -d /var/user01 -s /bin/bash user01
[root@tjy ~]#
如果需要暂时禁用和恢复用户user01,则可以使用以下三种方法实现。
(1)使用passwd命令
使用passwd命令禁用用户user01,利用tail命令进行查看,可以看到/etc/shadow文件中被锁定的账户密码栏前面会加上"!!"
[root@tjy ~]# passwd -l user01
锁定用户 user01 的密码 。
passwd: 操作成功
[root@tjy ~]# tail -1 /etc/shadow
user01:!!$6$B4qpKRu9d5113cSA$.BAusD5spLE.0UD0rIAkCHHdgCoLytU8jhZ4qVf1K2cea0Apg8moCgJwlpzplCTk87HFKG0hNGCc4BMOyMeGL0:19815:10:90:3:::
[root@tjy ~]# tail -1 /etc/passwd
user01:x:5000:2000::/var/user01:/bin/bash
[root@tjy ~]# passwd -u user01 //解除用户user01的锁定
解锁用户 user01 的密码。
passwd: 操作成功
[root@tjy ~]#
(2)使用usermodm命令。
使用usermod命令禁用用户user01,利用tail命令进行查看,可以看到/etc/shadow文件中被锁定的账户密码栏前面会加上"!"。
[root@tjy ~]# usermod -L user01
[root@tjy ~]# tail -1 /etc/shadow
user01:!$6$B4qpKRu9d5113cSA$.BAusD5spLE.0UD0rIAkCHHdgCoLytU8jhZ4qVf1K2cea0Apg8moCgJwlpzplCTk87HFKG0hNGCc4BMOyMeGL0:19815:10:90:3:::
[root@tjy ~]# tail -1 /etc/passwd
user01:x:5000:2000::/var/user01:/bin/bash
[root@tjy ~]# usermod -U user01 //解除用户user01的锁定
[root@tjy ~]#
(3)直接修改用户账户配置文件
可以在/etc/passwd或/etc/shadow文件中关于用户user01的passwd域的第一个字符前面加上一个"*“,以达到禁用账户的目的,在需要恢复的时候只需要删除字符” *"即可。
5.userdel命令–删除用户账户
要想删除一个用户账户,可以直接删除/etc/passwd和/etc/shadow文件中要删除的用户账户所对应的行,也可以使用userdel命令进行删除。其命令格式如下。
userdel [选项] 用户名
【实例3.5】使用userdel命令删除用户账户,先创建用户user02和user03,再查看用户目录相关信息,删除用户user03,并查看主目录的变化。
[root@tjy ~]# useradd -p 123456 user02 //新建用户user02,密码为123456
[root@tjy ~]# useradd -p 123456 user03 //新建用户user03,密码为123456
[root@tjy ~]# ls /home //查看目录情况
tang user01 user02 user03
[root@tjy ~]# tail -4 /etc/passwd //查看用户账户信息
tang:x:1000:1000:tang:/home/tang:/bin/bash
user01:x:5000:2000::/var/user01:/bin/bash
user02:x:5001:5001::/home/user02:/bin/bash
user03:x:5002:5002::/home/user03:/bin/bash
[root@tjy ~]# userdel -r user03 //删除用户user03
[root@tjy ~]# ls /home //查看目录情况
tang user01 user02
[root@tjy ~]#
3.2.组群管理
3.2.1.理解组群文件
1./etc/group文件
/etc/group文件用于存放用户的账户信息,任何用户都可以读取该文件的内容,每个组群账户在group文件中占一行,并用":"符号分隔4个字段。其格式如下。
组群名称:组群密码(一般为空,用x占位):GID:组群成员
group文件中显示的用户的组只有用户的附加组,用户的主组在这里是看不到的,它的主组在/etc/passwd文件中显示,一般情况下,管理员不必手动修改这个文件,系统提供了一些命令来完成组的管理。
【实例3.6】查看/etc/group文件的内容,相关命令如下。
[root@tjy ~]# useradd -p 123456 user03
[root@tjy ~]# usermod -G root user01 //加入root组
[root@tjy ~]# usermod -G bin user02 //加入bin组
[root@tjy ~]# usermod -G bin user03 //加入bin组
[root@tjy ~]# cat -n /etc/group //查看组群信息
1 root:x:0:user01
2 bin:x:1:user02,user03
3 daemon:x:2:
4 sys:x:3:
5 adm:x:4:
6 tty:x:5:
7 disk:x:6:
8 lp:x:7:
9 mem:x:8:
10 kmem:x:9:
11 wheel:x:10:tang
......
[root@tjy ~]# id user02 //查看user02用户相关组信息
用户id=5001(user02) 组id=5001(user02) 组=5001(user02),1(bin)
[root@tjy ~]#
2./etc/gshadow文件
/etc/gshadow文件用于存放组群的加密口令、组管理员等信息,该文件只有root用户可以读取,每个组群账户在给gshadow文件中占一行,并用":"符号分隔为4个字段。其格式如下。
组群名称:加密后的组群密码:组群的管理员:组群成员
【实例3.7】查看/etc/gshadow文件的内容,相关命令如下。
[root@tjy ~]# cat -n /etc/gshadow
1 root:::user01
2 bin:::user02,user03
3 daemon:::
4 sys:::
5 adm:::
6 tty:::
7 disk:::
8 lp:::
......
63 user03:!::
[root@tjy ~]#
3.2.2.组群维护与管理
1.groupadd命令–创建组群
groupadd命令用来在Linux操作系统中创建用户组,只要为不同的用户组赋予不同的权限,再将不同的用户加入不同的组,用户即可获得所在族群拥有的权限,这种方法在Linux操作系统中有许多用户时使用非常方便。其命令格式如下。
groupadd [选项] 组群名
【实例3.8】使用groupadd命令创建用户组,相关命令如下。
[root@tjy ~]# ls /home
tang user01 user02 user03
[root@tjy ~]# groupadd workgroup //创建用户组workgroup
groupadd:“workgroup”组已存在
[root@tjy ~]# tail -5 /etc/group
tang:x:1000:
workgroup:x:1001:
user01:x:2000:
user02:x:5001:
user03:x:5002:
[root@tjy ~]# tail -5 /etc/gshadow
tang:!::
workgroup:!::
user01:!::
user02:!::
user03:!::
[root@tjy ~]#
2.groupdel命令–删除组群
groupdel命令用来在Linux操作系统中删除组群,如果该族群中任包括某些用户,则必须先使用userdel命令删除这些用户,才能使用groupdel命令删除组群;如果有任何一个组群的使用者在线上,则不能移除该组群。其命令格式如下。
groupdel [选项] 组群名
【实例3.9】使用groupdel命令删除组群,相关命令如下。
[root@tjy ~]# groupadd workgroup-1 //新建组群workgroup-1
[root@tjy ~]# groupadd workgroup-2 //新建组群workgroup-2
[root@tjy ~]# tail -6 /etc/group //尾部显示6条group文件的内容
workgroup:x:1001:
user01:x:2000:
user02:x:5001:
user03:x:5002:
workgroup-1:x:5003:
workgroup-2:x:5004:
[root@tjy ~]#
[root@tjy ~]# groupdel workgroup-2 //删除组群workgroup-2
[root@tjy ~]# tail -6 /etc/group //尾部显示6条group文件的内容
tang:x:1000:
workgroup:x:1001:
user01:x:2000:
user02:x:5001:
user03:x:5002:
workgroup-1:x:5003:
[root@tjy ~]#
3.groupmod命令–更改组群识别或名称
groupmod命令用来Linux操作系统中更改组群识别码或名称。其命令格式如下。
groupmod [选项] 组群名
【实例3.10】使用groupmod命令更改组群识别码或名称,将workgroup-1组群ID修改为3000,同时将组群名称修改为workgroup-student,并显示相关结果,相关命令如下。
[root@tjy ~]# groupmod -g 3000 -n workgroup-student workgroup-1
[root@tjy ~]# tail -6 /etc/group
tang:x:1000:
workgroup:x:1001:
user01:x:2000:
user02:x:5001:
user03:x:5002:
workgroup-student:x:3000:
[root@tjy ~]#
4.gpasswd命令–管理组群
gpasswd命令用来在Linux操作系统中管理组群,可以将用户加入组群,也可以删除组群中的用户、指定管理员、设置组群成员列表、删除密码等。其命令格式如下。
gpasswd [选项] 组群名
【实例3.11】使用gpasswd命令管理组群,相关命令如下。
[root@tjy ~]# ls /home
tang user01 user02 user03
[root@tjy ~]# tail -6 /etc/group
tang:x:1000:
workgroup:x:1001:
user01:x:2000:
user02:x:5001:
user03:x:5002:
workgroup-student:x:3000:
[root@tjy ~]# gpasswd -a user01 workgroup-student //添加组中用户
正在将用户“user01”加入到“workgroup-student”组中
[root@tjy ~]# gpasswd -a user02 workgroup-student //添加组中用户
正在将用户“user02”加入到“workgroup-student”组中
[root@tjy ~]# tail -6 /etc/group
tang:x:1000:
workgroup:x:1001:
user01:x:2000:
user02:x:5001:
user03:x:5002:
workgroup-student:x:3000:user01,user02
[root@tjy ~]# gpasswd -d user02 workgroup-student //删除组中用户
正在将用户“user02”从“workgroup-student”组中删除
[root@tjy ~]# tail -6 /etc/group
tang:x:1000:
workgroup:x:1001:
user01:x:2000:
user02:x:5001:
user03:x:5002:
workgroup-student:x:3000:user01
[root@tjy ~]# gpasswd -A csg workgroup-student //配置组群指定管理员为csg
5.chown命令–修改文件的拥有者和组群
其命令格式如下。
chown [选项] 文件名
【实例3.12】使用chown命令修改文件的拥有者和组群,相关命令如下。
(1)将text01.txt文件的属主改为text用户。
[root@tjy ~]# useradd -p 123456 test //添加test用户
[root@tjy ~]# ls -l test01
-rw-r--r--. 1 root root 0 4月 4 12:09 test01
[root@tjy ~]# chown test:root test01.txt //修改属主为test用户
[root@tjy ~]# ls -l test01.txt
-rw-r--r--. 1 test root 0 4月 4 12:13 test01.txt
[root@tjy ~]#
(2)chown所接的新的属主和新的属组之间可以使用":“符号连接,属主和属组之一可以为空。如果属主为空,则应该是”: 属组";如果属组为空,则可以不用加":"符号
[root@tjy ~]# ls -l test01.txt
-rw-r--r--. 1 test root 0 4月 4 12:13 test01.txt
[root@tjy ~]# chown :tset test01.txt //修改属组为test用户组
[root@tjy ~]# ls -l test01.txt
-rw-r--r--. 1 test root 0 4月 4 12:13 test01.txt
[root@tjy ~]#
(3)chown也提供了-R参数,这个参数对目录改变属主和属组极为有用,可以通过添加-R参数来改变这个目录下的所有文件到新的属主或属组中。
[root@tjy ~]# mkdir testdir //新建文件夹
[root@tjy ~]# ls -ld testdir //查看文件夹默认属性
drwxr-xr-x. 2 root root 6 4月 4 14:09 testdir
[root@tjy ~]# touch testdir/test1.txt //新建文件test1.txt
[root@tjy ~]# touch testdir/test2.txt //新建文件test2.txt
[root@tjy ~]# touch testdir/test3.txt //新建文件test3.txt
[root@tjy ~]# ls -l testdir
总用量 0
-rw-r--r--. 1 root root 0 4月 4 14:11 test1.txt
-rw-r--r--. 1 root root 0 4月 4 14:12 test2.txt
-rw-r--r--. 1 root root 0 4月 4 14:12 test3.txt
[root@tjy ~]# chown -R test:test testdir //修改testdir及其下级目录和所有文件到新的用户与用户组中
[root@tjy ~]# ls -ld testdir
drwxr-xr-x. 2 test test 57 4月 4 14:12 testdir
[root@tjy ~]#
6.chgrp命令–修改文件与目录所属组群
其命令格式如下。
chgrp [选项] 组 文件名
【实例3.13】通过使用chgrp命令修改组群名称或组群识别码的方式改变文件或目录的所属组群,相关命令如下。
(1)改变文件的组群属性,将test01用户的所属组群属性由root更改为bin
[root@tjy ~]# ls -l test01
-rw-r--r--. 1 root root 0 4月 4 12:09 test01
[root@tjy ~]# chgrp -v bin test01 //改变文件的组群属性为bin
'test01' 的所属组已从 root 更改为 bin
[root@tjy ~]# ls -l test01
-rw-r--r--. 1 root bin 0 4月 4 12:09 test01
[root@tjy ~]#
(2)改变文件test01的组群属性,使得文件test01的组群属性和参考文件test01.txt的组群属性相同。
[root@tjy ~]# ls -l test01*
-rw-r--r--. 1 root bin 0 4月 4 12:09 test01
-rw-r--r--. 1 test root 0 4月 4 12:13 test01.txt
[root@tjy ~]# chgrp --reference=test01.txt test01
[root@tjy ~]# ls -l test01*
-rw-r--r--. 1 root root 0 4月 4 12:09 test01
-rw-r--r--. 1 test root 0 4月 4 12:13 test01.txt
[root@tjy ~]#
(3)改变指定目录及其子目录下的所有文件的组群属性
[root@tjy ~]# ls -l testdir/
总用量 0
-rw-r--r--. 1 test test 0 4月 4 14:11 test1.txt
-rw-r--r--. 1 test test 0 4月 4 14:12 test2.txt
-rw-r--r--. 1 test test 0 4月 4 14:12 test3.txt
[root@tjy ~]# chgrp -R bin testdir/ //锁定testdir下所有文件的属组为bin
[root@tjy ~]# ls -l testdir/
总用量 0
-rw-r--r--. 1 test bin 0 4月 4 14:11 test1.txt
-rw-r--r--. 1 test bin 0 4月 4 14:12 test2.txt
-rw-r--r--. 1 test bin 0 4月 4 14:12 test3.txt
[root@tjy ~]#
(4)通过组群识别码来改变文件组群属性。
[root@tjy ~]# tail -6 /etc/group
workgroup:x:1001:
user01:x:2000:
user02:x:5001:
user03:x:5002:
workgroup-student:x:3000:user01
test:x:5003:
[root@tjy ~]# chgrp -R 3000 test01 //指定为workgroup-student族群3000识别码
[root@tjy ~]# ls -l test01
-rw-r--r--. 1 root workgroup-student 0 4月 4 12:09 test01
[root@tjy ~]#
3.3.su和sudo命令使用
1.su命令
其命令格式如下。
su[选项] [-] [USER【参数】...]
【实例3.14】使用su命令进行用户切换,相关命令如下。
[root@tjy ~]# su user02
[user02@tjy root]$ su -
密码:
[root@tjy ~]# su - user03
[user02@tjy root]$ exit
exit
[root@tjy ~]#
su命令的优点:su为管理带来了方便,只要把root用户的密码交给普通用户,普通用户就可以通过su命令切换到root,以完成相应的管理工作任务。
su命令的缺点:root用户要把密码交给普通用户,这种方法存在安全隐患,如果系统有10个用户需要执行管理工作任务,则意味着要把root用户的密码告诉这10个用户,这在一定程度上对系统安全构成了威胁,因此su命令再多人参与的系统管理中不是最好的选择,为了解决该问题,可以使用sudo命令来实现。
2.sudo命令
其命令格式如下。
sudo [选项] [-s] [-u用户] command
(1)sudo的配置文件为sudoers文件,它允许系统管理员集中地管理用户的使用权限和使用的主机。
(2)不是所有的用户都可以使用sudo命令来执行管理权限,普通用户是否可以使用sudo命令执行管理权限是通过/etc/sudoers文件来设置的,在默认情况下,/etc/sudoers文件是只读文件,需要进行属性设置才能配置使用。
(3)sudu能够限制用户只在某台主机上运行某些命令。
(4)sudo提供了丰富的日志,详细地记录了每个用户都做了哪些操作,她能够将日志传递到中心主机或日志服务器中。
(5)sudo使用时间戳文件来执行类似"检票"的系统,当用户调用sudo命令并输入其密码时,用户会获得一张存活期为5min的"票",这个时间值可以在编译时修改。
3.4.文件和目录权限管理
3.4.1.理解文件和目录权限
Linux操作系统中的每一个文件或目录都包含访问权限,这些访问权限决定了哪些用户能访问和如何访问这些文件和目录,可以通过设定权限来实现访问权限的限制。
(1)只允许用户自己访问。
(2)允许一个预先指定的用户组中的用户访问。
(3)允许系统中的任何用户访问。
同时,用户能够控制一个给定的文件或目录的访问程度,一个文件或目录可目录的权限能有读、写及执行权限,当创建一个文件时,系统会自动赋予文件所有者读和写的权限,这样可以允许所有者显示文件内容和修改文件。文件或目录所有者可以将这些权限改变为任何其想要指定的权限一个文件或目录也许只有读权限,禁止任何修改;也可能只有执行权限,允许它像一个程序一样执行。
根据赋予权限的不同,不同的用户(所有者、用户组或其他用户)能够访问不同的文件或目录,所有者是创建文件的用户,文件的所有者能够授予所在用户组的其他成员以及系统中的除所属组之外的其他用户的文件访问权限。
每一个用户针对系统中的所有文件都有其自身的读、写和执行权限。
(1)第一套权限控制为访问自己的文件权限,即文件或目录所有
(2)第二套权限控制为用户组群访问其中一个用户的文件或目录权限。
(3)第三套权限控制为其他用户访问一个用户的文件或目录权限。
以上三套权限赋予了用户不同类型(所有者、用户组或其他用户)的读、写和执行权限,构成了一个有9种类型的权限组。
用户可以使用IS-I或者|命令来显示文件的详细信息,其中包括文件或目录的权限,命令显示如下。
[root@tjy ~]# vim file01.txt
[root@tjy ~]# cat file01.txt
aaaaaaa
bbbbbbb
[root@tjy ~]# ls -l
总用量 16
drwxr-xr-x. 2 root root 6 3月 18 20:08 公共
drwxr-xr-x. 2 root root 6 3月 18 20:08 模板
drwxr-xr-x. 2 root root 6 3月 18 20:08 视频
drwxr-xr-x. 2 root root 6 3月 18 20:08 图片
drwxr-xr-x. 2 root root 6 3月 18 20:08 文档
drwxr-xr-x. 2 root root 6 3月 18 20:08 下载
drwxr-xr-x. 2 root root 6 3月 18 20:08 音乐
drwxr-xr-x. 2 root root 6 3月 18 20:08 桌面
-rw-------. 1 root root 801 3月 15 20:02 anaconda-ks.cfg
-rw-r--r--. 1 root root 16 4月 14 14:30 file01.txt
-rw-r--r--. 1 root root 0 3月 24 15:21 history.txt
-rw-r--r--. 1 test root 0 4月 4 12:13 test01.txt
-rw-r--r--. 1 test root 0 4月 4 12:11 test0.1txt
drwxr-xr-x. 2 test bin 57 4月 4 14:12 testdir
drwxr-xr-x. 3 root root 38 3月 24 19:03 user01
-rw-r--r--. 1 root root 174 3月 24 18:52 user01.tar.gz
-rw-r--r--. 1 root root 0 4月 8 11:26 user05
-rw-r--r--. 1 root root 46 3月 24 22:13 welcome.txt
[root@tjy ~]#
3.4.2.详解文件和目录的属性信息
1.第一组表示文件/目录类型权限
每一行的第一个字符一般用来区分的文件的类型,一般取值为-、b、c、d、l、s、p。
【实例3.16】说明文件类型权限属性信息。
(1)-rw-rw-rw:该文件为普通文件,文件所有者、同组用户和其他用户对文件都只具有读、写权限,不具备执行权限。
(2)brwxr–r–:该文件为块设备文件文件所有者具有读、写和执行的权限,其他用户具有读取的权限。
(3)drwx–x–:该文件是目录文件,目录所有者具有读、写和执行的权限,其他用户能进入该目录,但无法读取任何数据。
(4)lrwxrwxrwx:该文件是符号链接文件,文件所有者、同组用户和其它用户对文件都具有读、写和执行权限。
每个用户都拥有自己的主目录,通常在/home目录下,这些主目录的默认权限为drwx------,对于执行mkdir命令所创建的目录,其默认权限为drwxr-xr-x,用户可以根据需要修改目录权限,相关命令如下。
[root@tjy ~]# mkdir /home/student
[root@tjy ~]# ls -l /home
总用量 4
drwxr-xr-x. 2 root root 6 4月 14 12:53 student
drwx------. 14 tang tang 4096 3月 15 20:47 tang
drwx------. 3 test test 78 4月 4 12:08 test
drwx------. 3 user01 user01 78 4月 1 19:13 user01
drwx------. 3 user02 user02 99 4月 8 11:33 user02
drwx------. 4 user03 user03 113 4月 8 11:35 user03
[root@tjy ~]#
2.第二组表示连接数
每个文件都会将其权限与属性记录到文件系统的i-node中,但这里使用的目录树却使用了文件记录,因此每个文件名会连接到一个i-node,这个属性记录的就是有多少个不同的文件名连接到一个相同的i-node。
3.第三组表示文件/目录拥有者
在Linux操作系统中,每个文件或目录都有属于自己的属主文件或目录,通常指的是文件或目录的创建者,即拥有者。
4.第四组表示文件/目录所属组群
在Linux操作系统中,用户的账户会附属到一个或多个组群中,例如,user01、user02、user0用户均属于workgroup组群,如果某个文件所属的组群为workgroup,且这个文件的权限为-rwxrwx—,则user01、user02、user03用户对于这个文件都具有读、写和执行的权限,但如果是不属于workgroup的其他账户,则其对于此文件不具有任何权限。
5.第五组表示文件/目录容量
此组信息显示了文件或目录的容量,默认单位为Byte。
6.第六组表示文件/目录最后被修改时间
此组信息显示了日期(月/日)及时间。如果这个文件被修改的时间距离现在太久了,那么时间部分会仅显示年份,如果想要显示完整的时间格式,则可以利用IS的选项,即Is-1-ful-time,执行命令如下。
[root@tjy ~]# ls -l --full-time
总用量 12
drwxr-xr-x. 2 root root 6 2024-03-18 20:08:18.457511378 +0800 公共
drwxr-xr-x. 2 root root 6 2024-03-18 20:08:18.457511378 +0800 模板
drwxr-xr-x. 2 root root 6 2024-03-18 20:08:18.457511378 +0800 视频
drwxr-xr-x. 2 root root 6 2024-03-18 20:08:18.457511378 +0800 图片
drwxr-xr-x. 2 root root 6 2024-03-18 20:08:18.457511378 +0800 文档
drwxr-xr-x. 2 root root 6 2024-03-18 20:08:18.456511367 +0800 下载
drwxr-xr-x. 2 root root 6 2024-03-18 20:08:18.457511378 +0800 音乐
drwxr-xr-x. 2 root root 6 2024-03-18 20:08:18.456511367 +0800 桌面
-rw-------. 1 root root 801 2024-03-15 20:02:48.519957494 +0800 anaconda-ks.cfg
-rw-r--r--. 1 root root 0 2024-03-24 15:21:30.532627880 +0800 history.txt
-rw-r--r--. 1 root workgroup-student 0 2024-04-04 12:09:20.333995092 +0800 test01
-rw-r--r--. 1 test root 0 2024-04-04 12:13:25.654879041 +0800 test01.txt
-rw-r--r--. 1 test root 0 2024-04-04 12:11:53.756798699 +0800 test0.1txt
drwxr-xr-x. 2 test bin 57 2024-04-04 14:12:25.785724464 +0800 testdir
drwxr-xr-x. 3 root root 38 2024-03-24 19:03:17.851443316 +0800 user01
-rw-r--r--. 1 root root 174 2024-03-24 18:52:49.198814934 +0800 user01.tar.gz
-rw-r--r--. 1 root root 0 2024-04-08 11:26:22.673485536 +0800 user05
-rw-r--r--. 1 root root 46 2024-03-24 22:13:55.111141781 +0800 welcome.txt
[root@tjy ~]#
7.第七组表示文件/目录名称
文件泪录最后一项属性的信息为其名称,比较特殊的是,如果文件/录名称之前多了一个“.“符号,则代表这个文件为隐藏文件,可以使用1和1S-a命令来查看隐藏文件,执行命令如下。
[root@tjy ~]# ls
公共 图片 音乐 history.txt test0.1txt user01.tar.gz
模板 文档 桌面 test01 testdir user05
视频 下载 anaconda-ks.cfg test01.txt user01 welcome.txt
[root@tjy ~]# ls -a
. 图片 anaconda-ks.cfg .cache .local test0.1txt .viminfo
.. 文档 .bash_history .config .ssh testdir welcome.txt
公共 下载 .bash_logout .cshrc .tcshrc user01
模板 音乐 .bash_profile history.txt test01 user01.tar.gz
视频 桌面 .bashrc .lesshst test01.txt user05
[root@tjy ~]#
3.4.3数字表示法修改文件和目录的权限
在文件建立时,系统会自动设置文件的权限,如果这些默认权限无法满足需要,则可以使用chmod命令来修改文件权限。通常,在权限修改时可以用两种方法来表示权限类型:数字表示法和文字表示法。
chmod命令的格式如下。
chmod[选项]文件
【实例3.17】使用chmod命令修改文件和目录的权限,为 文件/mnt/testO1设置权限,其默认权限为rw-r–r–,要求赋予拥有者和组群成员读取和写入权限,而其他用户只有读取权限,应该将权限设置为rw-rw-r–,而该权限的数字表示法为664,进行相关操作,相关命令如下。
[root@tjy ~]# touch /mnt/test01
[root@tjy ~]# ls -l /mnt
总用量 0
-rw-r--r--. 1 root root 0 3月 24 18:37 a01.txt
-rw-r--r--. 1 root root 0 3月 24 18:37 a02.txt
drwxr-xr-x. 2 root root 6 4月 14 13:05 test01
drwxr-xr-x. 2 root root 6 3月 24 18:37 test02
[root@tjy ~]# chmod 664 /mnt/test01
[root@tjy ~]# ls -l /mnt
总用量 0
-rw-r--r--. 1 root root 0 3月 24 18:37 a01.txt
-rw-r--r--. 1 root root 0 3月 24 18:37 a02.txt
drw-rw-r--. 2 root root 6 4月 14 13:05 test01
drwxr-xr-x. 2 root root 6 3月 24 18:37 test02
[root@tjy ~]#
如果想要使用隐藏文件,tcshrc,则需要对这个文件所有的权限设定启用,即执行如下命令。
[root@tjy ~]# ls -al .tcshrc
-rw-r--r--. 1 root root 129 8月 11 2021 .tcshrc
[root@tjy ~]# chmod 777 .tcshrc
[root@tjy ~]# ls -al .tcshrc
-rwxrwxrwx. 1 root root 129 8月 11 2021 .tcshrc
[root@tjy ~]#
3.4.4 文字表示法修改文件和目录的权限
1.文字表示法
使用权限的文字表示法时,系统以4种字母来表示不同的用户。
(1)u:user,表示所有者。
(2)g:group,表示属组。
(8)o:others,表示其他用户。
(4) a:al,表示以上3种用户。
使用以下3种字符的组合表示法设置操作权限。
(1)r:read,表示可读取。
(2)wwrite,表示可写入。
(3)xiexecute,表示可执行。
操作符号包括以下几种。
(1)+:表示添加某种权限。
(2)-,表示减去某种权限。
(3)=:表示赋予给定权限并取消原来的权限。
以文字表示法修改文件权限时,使用chmod命令后,设置权限的命令如下。
[root@tjy ~]# cat /mnt/test01
aaaaaaaa
bbbbbbbb
[root@tjy ~]# ls -l /mnt/test01
-rw-r--r--. 1 root root 18 4月 14 14:53 /mnt/test01
[root@tjy ~]# chmod u=rwx,g=rw,o=rx /mnt/test01 //修改文件权限
[root@tjy ~]# ls -l /mnt/test01
-rwxrw-r-x. 1 root root 18 4月 14 14:53 /mnt/test01
[root@tjy ~]#
修改目录权限和修改文件权限的方法相同,都是使用chmod命令,但不同的是,要使用通配符来表示目录中的所有文件。
【实例3.18】修改/mnt/test的权限时,要同时将/mnt/test目录下的所有文件权限都设置为所有人可以读取及写入,在/mnt/test目录下新建文件test01.txt、test02.txt、test03.txt,设置相关权限操作,执行相关命令如下。
[root@tjy ~]# touch /mnt/test/test01.txt /mnt/test/test02.txt /mnt/test/test03.txt
[root@tjy ~]# ls -l /mnt/test
总用量 0
-rw-r--r--. 1 root root 0 4月 14 15:04 test01.txt
-rw-r--r--. 1 root root 0 4月 14 15:04 test02.txt
-rw-r--r--. 1 root root 0 4月 14 15:04 test03.txt
[root@tjy ~]# chmod a=rw /mnt/test/* //设置为所有人都可以读取及写入
[root@tjy ~]# ls -l /mnt/test
总用量 0
-rw-rw-rw-. 1 root root 0 4月 14 15:04 test01.txt
-rw-rw-rw-. 1 root root 0 4月 14 15:04 test02.txt
-rw-rw-rw-. 1 root root 0 4月 14 15:04 test03.txt
[root@tjy ~]#
如果目录中包含其他子目录,则必须使用一R(Recursive)参数来同时设置所有文件及子目录的权限,在/mnt/test 目录下新建子日录/aaa和leb,同时在子目录/aaa中新建文件user01.txt,在子目录/bb中新建文件user02.txt,设置/mnt/test子目录及文件的权限为只读,设置相关权限操作,执行相关命令如下。
[root@tjy ~]# mkdir /mnt/test/aaa
[root@tjy ~]# mkdir /mnt/test/bbb
[root@tjy ~]# touch /mnt/test/aaa/user01.txt
[root@tjy ~]# touch /mnt/test/bbb/user02.txt
[root@tjy ~]# ls -l /mnt/test
总用量 0
drwxr-xr-x. 2 root root 24 4月 14 15:18 aaa
drwxr-xr-x. 2 root root 24 4月 14 15:18 bbb
-rw-rw-rw-. 1 root root 0 4月 14 15:04 test01.txt
-rw-rw-rw-. 1 root root 0 4月 14 15:04 test02.txt
-rw-rw-rw-. 1 root root 0 4月 14 15:04 test03.txt
[root@tjy ~]# chmod -R a=r /mnt/test //设置test子目录及文件的权限为只读
[root@tjy ~]# ls -l /mnt/test
总用量 0
dr--r--r--. 2 root root 24 4月 14 15:18 aaa
dr--r--r--. 2 root root 24 4月 14 15:18 bbb
-r--r--r--. 1 root root 0 4月 14 15:04 test01.txt
-r--r--r--. 1 root root 0 4月 14 15:04 test02.txt
-r--r--r--. 1 root root 0 4月 14 15:04 test03.txt
[root@tjy ~]#
【实例3.19】使用文字表示法的相关操作,当要设定一个文件的权限为-rwxrw-rw-时,其所表述的含义如下。
(1)user(u):文件具有可读、写入及可执行的权限。
(2)group与other(g与0):文件具有可读、写入的权限,但不具有执行的权限。
执行相关命令如下。
[root@tjy ~]# ls -l aa.txt
-rw-r--r--. 1 root root 0 4月 14 15:52 aa.txt
[root@tjy ~]# chmod u=rwx,go=rw aa.txt //u=rwx,go=rw直接没有任何空格
[root@tjy ~]# ls -l aa.txt
-rwxrw-rw-. 1 root root 0 4月 14 15:52 aa.txt
[root@tjy ~]#
如果要设定一个文件的权限为-rwxrw-r–,则应该如何操作呢?此时,可以通过chmod u=rwx g=rw,o=r filename命令来设定。另外,如果不知道原先的文件属性,而想增加文件的所有者均有写入的权限,则应该如何操作呢?设定/mnt/bbb.txt文件,执行相关命令如下。
[root@tjy ~]# ls -l /mnt
总用量 4
-rw-r--r--. 1 root root 0 3月 24 18:37 a01.txt
-rw-r--r--. 1 root root 0 3月 24 18:37 a02.txt
dr--r--r--. 4 root root 82 4月 14 15:17 test
-rwxrw-r-x. 1 root root 18 4月 14 14:53 test01
drwxr-xr-x. 2 root root 6 3月 24 18:37 test02
[root@tjy ~]# chmod a+w /mnt/bbb.txt //设定/mnt/bbb。txt文件的权限
[root@tjy ~]# ls -l /mnt
总用量 4
-rw-r--r--. 1 root root 0 3月 24 18:37 a01.txt
-rw-r--r--. 1 root root 0 3月 24 18:37 a02.txt
drwxrwxrwx. 2 root root 6 4月 14 16:00 bbb.txt
dr--r--r--. 4 root root 82 4月 14 15:17 test
-rwxrw-r-x. 1 root root 18 4月 14 14:53 test01
drwxr-xr-x. 2 root root 6 3月 24 18:37 test02
[root@tjy ~]#
如果要将文件的权限去掉而不改动其他已存在的权限,则应该如何操作呢?例如,要想去掉所有人的可执行权限,则可以执行如下命令。
[root@tjy ~]# ls -al .bashrc
-rw-r--r--. 1 root root 429 8月 11 2021 .bashrc
[root@tjy ~]# chmod a-x .bashrc
[root@tjy ~]# ls -al .bashrc
-rw-r--r--. 1 root root 429 8月 11 2021 .bashrc
[root@tjy ~]#
2.文件系统高级权限
(1)SET位权限。
SET位权限也称特殊权限,一般文件权限是rwx,在某些特殊场合中可能无法满足要求,为了方便普通用户执行一些特权命令,可以通过设置SUID、SGID权限,允许普通用户以root用户的身份暂时执行某些程序,并在执行结束后恢复身份。因此,Linux操作系统提供了一些额外的权限,只要设置了这些权限,就会具有一些额外的功能。chmod u+s 命令就是为某个程序的所有者授予SUID,SGID权限,使其可以像root用户一样进行操作。
使用chmod命令设置特殊权限时,其命令格式如下。
chmod u+s 可执行文件
关于SET位权限命令设置的几点说明如下。
①设置对象:可执行文件。
完成设置后,此文件的使用者在使用文件的过程中会临时获得该文件的属主身份及部分权限。
②设置位置:Set UID附加在文件属主的×权限位上,表示对属组中的用户增加SET位权限;Set GID附加在属组的×权限位上,表示对属组中的用户增加SET位权限。
③设置后的变化:此文件属主的×权限位会变为S。
【实例3.20】设置/usr/bin/mkdir文件的SUID权限,相关命令如下。
[root@tjy ~]# ls -l /usr/bin/mkdir
-rwxr-xr-x. 1 root root 69752 1月 6 2023 /usr/bin/mkdir
[root@tjy ~]# chmod u+s /usr/bin/mkdir //设置mkdir文件的SUID权限
[root@tjy ~]# ls -l /usr/bin/mkdir
-rwsr-xr-x. 1 root root 69752 1月 6 2023 /usr/bin/mkdir
[root@tjy ~]# su - user02 //切换user02用户登录
[user02@tjy ~]$ pwd
/home/user02
[user02@tjy ~]$ mkdir test01
[user02@tjy ~]$ ls -l
总用量 0
drwxr-xr-x. 2 root user02 6 4月 15 08:50 test01
[user02@tjy ~]$ exit
注销
[root@tjy ~]#
特殊权限也可以采用数字表示法,SUID、SGID 和sticky 权限分别以4、2和1来表示,使用chmod 命令设置文件权限时,可以在普通权限的数字前面加上一位数字来表示特殊权限。例如,设置/mnt/testO1文件的特殊权限,相关命令如下。
[root@tjy ~]# ls -l /mnt/test01
-rwxrw-r-x. 1 root root 18 4月 14 14:53 /mnt/test01
[root@tjy ~]# chmod 6664 /mnt/test01
[root@tjy ~]# ls -l /mnt/test01
-rwSrwSr--. 1 root root 18 4月 14 14:53 /mnt/test01
[root@tjy ~]#
(2)粘滞位权限。
在通常情况下,用户只要对某个目录具备写入权限,就可以删除该目录下的任何文件,而不论这些文件的权限是什么,这是非常不安全的。粘滞位权限就是针对此种情况设置的,当目录被设置了粘滞位权限之后,即便用户对该目录拥有写入权限,也不能删除该目录下其他用户的数据,而只有该文件的属主和root用户才有权限将其删除,保持了一种动态的平衡,即允许用户在目录下任意写入、删除数据,但是禁止其随意删除其他用户的数据。
使用chmod命令设置粘滞位权限时,其命令格式如下。
chmod o+t 可执行文件
关于粘滞位权限命令设置的几点说明如下。
①设置对象:可执行文件。
完成设置后,此文件的使用者在使用文件的过程中会临时获得该文件的属主身份及部分权限。
②设置位置:SetUID附加在文件属主的×权限上。
③设置后的变化:此文件属主的×权限位会变为S。
【实例3.21】设置粘滞位权限,相关命令如下。
[root@tjy ~]# cd /
[root@tjy /]# chmod 777 mnt
[root@tjy /]# ls -l |grep mnt
drwxrwxrwx. 5 root root 91 4月 14 16:00 mnt
[root@tjy /]# chmod o+t mnt
[root@tjy /]# ls -l |grep mnt
drwxrwxrwt. 5 root root 91 4月 14 16:00 mnt
[root@tjy /]#
[root@tjy /]# su user02
[user02@tjy /]$ touch /mnt/aaa.txt
[user02@tjy /]$ exit
exit
[root@tjy /]# su user03
[user03@tjy /]$ cd ~
[user03@tjy ~]$ touch /mnt/bbb.txt
[user03@tjy ~]$ ls /mnt
a01.txt a02.txt aaa.txt bbb.txt test test01 test02
[user03@tjy ~]$ ls -l /mnt
总用量 4
-rw-r--r--. 1 root root 0 3月 24 18:37 a01.txt
-rw-r--r--. 1 root root 0 3月 24 18:37 a02.txt
-rw-r--r--. 1 user02 user02 0 4月 15 09:13 aaa.txt
drwxrwxrwx. 2 root root 6 4月 15 09:14 bbb.txt
dr--r--r--. 4 root root 82 4月 14 15:17 test
-rwSrwSr--. 1 root root 18 4月 14 14:53 test01
drwxr-xr-x. 2 root root 6 3月 24 18:37 test02
[user03@tjy ~]$ rm aaa.txt
rm: 无法删除 'aaa.txt': 没有那个文件或目录
[user03@tjy ~]$
3.4.5修改文件和目录的默认权限与隐藏权限
文件和目录的权限包括读取(r)、写入(w)、执行(x)等。决定文件和目录类型的属性包括目录(d)、文件(一)、连接(1)等,修改权限时可以通过使用chmod、chown、chgrp命令来实现,在Linux的ext2、ext3、ext4文件系统中,除基本的读取(r)、写入(W)、执行(x)权限外,还可以设定系统隐藏属性。设置系统隐藏属性可以使用chattr 命令,而使用Isattr命令可以查看隐藏属性。另外,基于安全机制方面的考虑,可以设定文件不可修改的特性,即文件的拥有者也不能修改文件,这也是非常重要的。
1.文件预设权限umask
其命令格式如下。
umask[-p][-S][模式]
建立文件或目录时,如何知道文件或目录的默认权限是什么?实际上,默认权限与umask有着密的关系,umask指定的就是用户在建立文件或目录时的默认权限值,那么如何得知或设定umask?下面来使用umask命令查看默认权限值,执行相关命令如下。
user03@tjy ~]$ umask
0022
[user03@tjy ~]$ umask -S
u=rwx,g=rx,o=rx
[user03@tjy ~]$
查看默认权限的方式有两种:一种是直接输入umask,可以看到数字形态的权限设定;另一种是加入-S选项,即以符号类型的方式显示权限。但是umask会有4组数字,而不是3组数字,其中,第一组数字是特殊权限使用的,在复杂多变的生产环境中,单纯设置文件的rwx权限无法满足用户对安全性和灵活性的需求,因此便有了SUID、SGID与SBIT的特殊权限位,可以分别用4、2和1来表示,这是一种对文件权限进行设置的特殊方法,可以与一般权限同时使用,以弥补权限无法实现的功能。
目录与文件的默认权限是不一样的,我们知道,执行权限对于目录是非常重要的,但是一般文件的建立不应该有执行的权限,因为一般文件通常用于数据的记录,不需要执行的权限,因此,预设的情况如下。
(1)若使用者建立文件,则预设没有可执行(x)权限,即只有读取(r)和写入(w)这两个权限,亦即最大值为666,预设权限为-rw-rw-rw-。
(2)若使用者建立目录,则由于执行与是否可以进入此目录有关,因此默认所有权限均开放,即为777,预设权限为drwxrwxrx。
umask 的分值指的是该默认值需要减掉的权限(F、W、×分别对应的是4、2、1),具体情况如下。
(1)去掉读取的权限时,umask的分值为4。 (2)去掉写入的权限时,umask的分值为2。 (3)去掉执行的权限时,umask的分值为1。
(4)去掉读取和写入的权限时,umask的分值为6。 (5)去掉读取和执行的权限时,umask的分值为5。 (6)去掉执行和写入的权限时,umask的分值为3。
从以上执行结果可以看到 umask的值为0022,所以用户并没有被去掉任何权限,但group与other的权限被去掉了2,即写入(w)的权限被去掉了,那么使用者的权限是多少呢?
(1)建立文件是(-rw-rw-rw-)-(----w–w-))=-rw-r–r^–。(2)建立目录是(drwxrwxrwx)-(d----w–w-)=drwxr-xr-x。执行以下命令,测试并查看结果。
[user03@tjy ~]$ umask
0022
[user03@tjy ~]$ touch user01-text.txt //新建文件
[user03@tjy ~]$ mkdir user01-dir //新建目录
[user03@tjy ~]$ ll -ld user01* //查看目录和文件详细信息
drwxr-xr-x. 2 root user03 6 4月 15 09:42 user01-dir
-rw-r--r--. 1 user03 user03 0 4月 15 09:42 user01-text.txt
[user03@tjy ~]$
2.使用umask
当某人和自己的团队进行同一个项目专题的时候,其账号属于相同的组群,且/home/team01目录是项目专题目录,想象一下,对于此人所制作的文件,有没有可能其团队成员无法编辑呢?如果这样,应该如何解决呢?
这样的问题可能经常发生,以上面的实例为例,userO1用户的权限是644,也就是说,如果umask的值为022,那么新建的数据只有用户自己具有写入(w)的权限,同组群的人只有读取(r)的权限,他们肯定无法修改文件,这样怎么可能共同制作项目专题呢?
因此,当需要新文件能被同组群的使用者共同编辑时,umask的组群就不能被去掉2这个写入(w)的权限了,此时,umask的值应该是002,这样才能使新建的文件的权限是-rw-rw-r–。那么,如何设定umask的值呢?直接在umask后面输入002即可,执行命令如下。
[user03@tjy ~]$ umask 002
[user03@tjy ~]$ umask
0002
[user03@tjy ~]$ mkdir /home/team01 //新建目录team01
[user03@tjy ~]$ touch /home/team01/user01-test1.txt //新建文件user01-test1.txt
[user03@tjy ~]$ ls -ld /home/team01 //查看目录详细信息
drwxrwxr-x. 2 root user03 30 4月 15 09:56 /home/team01
[user03@tjy ~]$ ls -l /home/team01/user01-test1.txt
-rw-rw-r--. 1 user03 user03 0 4月 15 09:56 /home/team01/user01-test1.txt
[user03@tjy ~]$
当umask的值为003时,建立的文件与目录的权限是怎样的呢?
umask的值为003,所以去掉的权限为--------Wx,因此相关的权限如下。
(1)建立文件是(-rw-rw-rw-)-(--------wx)=-rw-rw-r–。
(2)建立目录是(drwxrwxrx)-(--------wx)=drwxnwxr–
3.设置文件隐藏属性
(1)chattr命令——修改文件属性。
其命令格式如下。
chattr [-RV][-v<版本编号>][+/-/=<属性>][文件或目录….]
【实例3.22】在/home/testO1目录下,新建文件testO1.txt,使用chattr命令进行相关操作,执行命令如下。
[user03@tjy ~]$ mkdir /home/test01
[user03@tjy ~]$ touch /home/test01/test01.txt
[user03@tjy ~]$ ls -l /home/test01/test01.txt
-rw-rw-r--. 1 user03 user03 0 4月 15 10:12 /home/test01/test01.txt
[root@tjy /]# chattr +i /home/test01/test01.txt
[root@tjy /]# ls -l /home/test01
总用量 0
-rw-rw-r--. 1 user03 user03 0 4月 15 10:12 test01.txt
[root@tjy /]# rm /home/test01/test01.txt
rm:是否删除普通空文件 '/home/test01/test01.txt'?y
rm: 无法删除 '/home/test01/test01.txt': 不允许的操作
[root@tjy /]#
从以上操作可以看出,即使是root用户也没有删除此新建文件的权限,将该文件的i属性取消后即可进行删除操作,执行命令如下。
[root@tjy /]# chattr -i /home/test01/test01.txt
[root@tjy /]# rm /home/test01/test01.txt
rm:是否删除普通空文件 '/home/test01/test01.txt'?y
[root@tjy /]# ls -l /home/test01/
总用量 0
[root@tjy /]#
在chattr 的相关属性中,最重要的是+i和+a两个属性,尤其是在系统的数据安全方面,如果是日志文件,则需要启用+a属性,即能增加但不能修改与删除旧有数据,这一点非常重要,由于这些属性是隐藏的,所以需要使用Isattr 命令来显示文件隐藏属性。
(2)Isattr命令——显示文件隐藏属性。
其命令格式如下。
Isattr[选项]文件
【实例3.23】在/home/testO1目录下,新建文件testO1.txt,使用Isattr命令进行相关操作,执行命令如下。
[root@tjy /]# touch /home/test01/test01.txt
[root@tjy /]# chattr +aiS /home/test01/test01.txt
[root@tjy /]# lsattr -a /home/test01/test01.txt
--S-ia---------------- /home/test01/test01.txt
[root@tjy /]#
3.4.6文件访问控制列表
为了更直观地看到ACL对文件的权限控制的强大效果,可以先切换到普通用户,再尝试进入root用户的主目录,在没有针对普通用户对root用户的主目录设置ACL之前,执行命令如下。
[root@tjy /]# ls -ld
dr-xr-xr-x. 18 root root 235 4月 14 13:26 .
[root@tjy /]#
root@tjy /]# su - user03
[user03@tjy ~]$ cd /root
-bash: cd: /root: 权限不够
[user03@tjy ~]$ exit
注销
[root@tjy /]#
1.setfacl命令——设置 ACL权限
setfacl命令用于管理文件的ACL权限。其命令格式如下。
setfacl [选项] 文件名
针对特殊用户设置命令的格式如下。
setfacl[选项][u:用户名:权限(rwx)]目标文件名
权限为rwx的组合形式,如果用户账户列表为空,则代表为当前文件所有者设置权限. 文件的ACL提供的是在所有者、所属组、其他人的读取、写入、执行权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读取、写入、执行权限的控制。其中,针对目录文件需要使用-R递归参数;针对普通文件可以使用-m参数;如果想要删除某个文件的ACL,则可以使用-b参数。
【实例3.24】使用setfacl命令管理ACL权限,执行命令如下。
[root@tjy /]# mkdir /home/share01
[root@tjy /]# ls -ld /home/share01
drwxr-xr-x. 2 root root 6 4月 15 11:33 /home/share01
[root@tjy /]#
[root@tjy /]# setfacl -Rm u:user04:rwx /home/share01 //设置ACL权限
怎么查看文件是否设置了ACL呢?常用的Is命令看不到ACL的信息,但可以看到文件权限的最后一个“”变成了“+”,这就意味着文件已经设置了ACL。
[root@tjy /]# ls -ld /home/share01
drwxr-xr-x. 2 root root 6 4月 15 11:33 /home/share01
[root@tjy /]#
2.getfacl命令——显示ACL权限
getfacl命令用于显示ACL权限。其命令格式如下。
getfacl[选项]文件名
【实例3.25】使用getfacl命令显示ACL权限,执行命令如下。
[root@tjy /]# getfacl /home/share01/ //显示目录share01的ACL权限
getfacl: Removing leading '/' from absolute path names
# file: home/share01/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
[root@tjy /]# setfacl -x u:user04 /home/share01 //删除ACL权限
[root@tjy /]# getfacl -c /home/share01 //不显示注释表头
getfacl: Removing leading '/' from absolute path names
user::rwx
group::r-x
other::r-x
[root@tjy /]#
3.5文件权限管理实例配置
1.需求分析及情境应用
假设系统中有两个用户账户,它们分别是user-stu01与user-stu02,这两个用户账户除了支持自己的组群外,还要共同支持一个名为stu 的组群。这两个用户账户需要共同拥有/home/share-stu目录的项目开发权限,且该目录不许其他账户进入查阅,该目录的权限应该如何设定?下面先以传统的权限进行说明,再以特殊权限SGID的功能进行解析。
2.解决方案
多个用户账户支持同一组群,且共同拥有目录的使用权限,最好将项目开发权限目录设定为SGID
的权限,需要使用root用户身份执行chmod、chgrp等命令,以帮助用户账户设定其开发环境,这也是管理员的重要任务之一。
(1)添加user-stu01与user-stu02用户账户及其属组,执行命令如下。
[root@tjy /]# groupadd stu //新建工作组群
[root@tjy /]# useradd -p 123456 -G stu user-stu01 //新建用户并加入stu组群
[root@tjy /]# useradd -p 123456 -G stu user-stu02
[root@tjy /]# tail -3 /etc/group //查看组群信息
stu:x:5004:user-stu01,user-stu02
user-stu01:x:5005:
user-stu02:x:5006:
[root@tjy /]# tail -3 /etc/passwd //查看用户信息
test:x:5003:5003::/home/test:/bin/bash
user-stu01:x:5004:5005::/home/user-stu01:/bin/bash
user-stu02:x:5005:5006::/home/user-stu02:/bin/bash
[root@tjy /]# id user-stu01 //查看用户账户的属性
用户id=5004(user-stu01) 组id=5005(user-stu01) 组=5005(user-stu01),5004(stu)
[root@tjy /]# id user-stu02
用户id=5005(user-stu02) 组id=5006(user-stu02) 组=5006(user-stu02),5004(stu)
[root@tjy /]#
(2)建立所需要的开发项目目录,执行命令如下。
[root@tjy /]# mkdir /home/share-stu //新建目录share-stu
[root@tjy /]# ls -ld /home/share-stu //显示目录属性
drwxr-xr-x. 2 root root 6 4月 15 11:56 /home/share-stu
[root@tjy /]#
从以上输出结果可以看到用户账户user-stu01与user-stu02都不能在/home/share-stu目录下建立文件,因此需要进行权限与属性的修改。
(3)修改/home/share-stu目录的属性,且其他人均不可进入此目录,该目录的组群应该为stu,权限应为770才合理,执行命令如下。
[root@tjy /]# ls -ld /home/share-stu
drwxr-xr-x. 2 root root 6 4月 15 11:56 /home/share-stu
[root@tjy /]# chgrp stu /home/share-stu //修改目录属组属性为stu
[root@tjy /]# chmod 770 /home/share-stu //修改目录访问权限
[root@tjy /]# ls -ld /home/share-stu //显示目录属性信息
drwxrwx---. 2 root stu 6 4月 15 11:56 /home/share-stu
[root@tjy /]#
从上面的权限来看,由于用户账户user-stu01与user-stu02均支持stu,因此问题似乎得到了解决,但结果是这样吗?
(4)分别以用户账户user-stu01与user-stu02来进行测试,情况会怎样呢?先使用用户账户user-stu01建立文件testO1.txt,再使用用户账户user-stu02进行处理,执行命令如下。
[root@tjy /]# umask
0022
[root@tjy /]# su - user-stu01 //以用账户user-stu01登录
[user-stu01@tjy ~]$ cd /home/share-stu
[user-stu01@tjy share-stu]$ touch test01.txt //新建文件test01.txt
[user-stu01@tjy share-stu]$ exit //退出user-stu01
注销
[root@tjy /]# su - user-stu02 //以用户账户user-stu02登录
[user-stu02@tjy ~]$ cd /home/share-stu
[user-stu02@tjy share-stu]$ ls -l
总用量 0
-rw-r--r--. 1 user-stu01 user-stu01 0 4月 15 12:02 test01.txt
[user-stu02@tjy share-stu]$ echo "welcome" >test01.txt //追加文件内容
-bash: test01.txt: 权限不够
[user-stu02@tjy share-stu]$ exit
注销
[root@tjy ~]#
从以上输出结果可以看出,用户账户新建文件testO1.txt的属组为 user-stuO1,而组数user-stu02并不支持,对于文件testO1.txt而言,user-stu02应该是其他人,只具有r权限,若纯使用传统的rwx权限,则对user-stu01建立的文件testO1.txt而言,user-stu02可以删除它但不能编辑它,若要达到目标结果,则需要用到特殊权限。
(5)加入SGID的权限,并进行结果测试,执行命令如下。
[root@tjy ~]# chmod 2770 /home/share-stu //设置SGID写入权限
[root@tjy ~]# ls -ld /home/share-stu //查看目录详细信息
drwxrws---. 2 root stu 24 4月 15 12:02 /home/share-stu
[root@tjy ~]#
(6)结果测试,先使用用户账户user-stu01建立文件 testO2.txt,再使用用户账户user-stu02进行处理,使用用户账户user-Stu02建立文件testO3.txt,执行命令如下。
[root@tjy ~]# su - user-stu01 //以用户账户user-stu01登录
[user-stu01@tjy ~]$ cd /home/share-stu
[user-stu01@tjy share-stu]$ touch test02.txt //新建文件test02.txt
[user-stu01@tjy share-stu]$ ls -l //显示文件详细信息
总用量 0
-rw-r--r--. 1 user-stu01 user-stu01 0 4月 15 12:02 test01.txt
-rw-r--r--. 1 user-stu01 stu 0 4月 15 18:29 test02.txt
[user-stu01@tjy share-stu]$ exit
注销
[root@tjy ~]# su - user-stu02
[user-stu02@tjy ~]$ cd /home/share-stu
[user-stu02@tjy share-stu]$ echo "welcome" >test01.txt
-bash: test01.txt: 权限不够
[user-stu02@tjy share-stu]$ echo "welcome" >test02.txt //修改文件内容
[user-stu02@tjy share-stu]$ cat test02.txt welcome //显示文件内容
[user-stu02@tjy share-stu]$ touch test03.txt //新建文件test03.txt
[user-stu02@tjy share-stu]$ ls -l
总用量 0
-rw-r--r--. 1 user-stu01 user-stu01 0 4月 15 12:02 test01.txt
-rw-r--r--. 1 user-stu01 stu 0 4月 15 18:29 test02.txt
-rw-r--r--. 1 user-stu02 stu 0 4月 15 18:41 test03.txt
[user-stu02@tjy share-stu]$ exit
注销
[root@tjy ~]# ls -ld /home/share-stu //查看目录share-stu的权限信息
drwxrws---. 2 root stu 60 4月 15 18:41 /home/share-stu
[root@tjy ~]#
通过以上配置,可以看到,用户账户user-stu01与user-stu02建立的文件所属组群都是stu,由于这两个用户账户均属于stu组群,且umask都是002,所以这两个用户账户可以相互修改对方的文件,最终的结果显示,/home/share-stu的权限最好是2770,文件所有者为root用户,至于组群,则必须两个用户账户共同为stu才可以。
~]# su - user-stu01 //以用户账户user-stu01登录
[user-stu01@tjy ~]$ cd /home/share-stu
[user-stu01@tjy share-stu]$ touch test02.txt //新建文件test02.txt
[user-stu01@tjy share-stu]$ ls -l //显示文件详细信息
总用量 0
-rw-r–r–. 1 user-stu01 user-stu01 0 4月 15 12:02 test01.txt
-rw-r–r–. 1 user-stu01 stu 0 4月 15 18:29 test02.txt
[user-stu01@tjy share-stu]$ exit
注销
[root@tjy ~]# su - user-stu02
[user-stu02@tjy ~]$ cd /home/share-stu
[user-stu02@tjy share-stu]$ echo “welcome” >test01.txt
-bash: test01.txt: 权限不够
[user-stu02@tjy share-stu]$ echo “welcome” >test02.txt //修改文件内容
[user-stu02@tjy share-stu]$ cat test02.txt welcome //显示文件内容
[user-stu02@tjy share-stu]$ touch test03.txt //新建文件test03.txt
[user-stu02@tjy share-stu]$ ls -l
总用量 0
-rw-r–r–. 1 user-stu01 user-stu01 0 4月 15 12:02 test01.txt
-rw-r–r–. 1 user-stu01 stu 0 4月 15 18:29 test02.txt
-rw-r–r–. 1 user-stu02 stu 0 4月 15 18:41 test03.txt
[user-stu02@tjy share-stu]$ exit
注销
[root@tjy ~]# ls -ld /home/share-stu //查看目录share-stu的权限信息
drwxrws—. 2 root stu 60 4月 15 18:41 /home/share-stu
[root@tjy ~]#
通过以上配置,可以看到,用户账户user-stu01与user-stu02建立的文件所属组群都是stu,由于这两个用户账户均属于stu组群,且umask都是002,所以这两个用户账户可以相互修改对方的文件,最终的结果显示,/home/share-stu的权限最好是2770,文件所有者为root用户,至于组群,则必须两个用户账户共同为stu才可以。