前几篇博客总结了linux中不痛不痒的基础操作,这篇博客开始总结Linux中的文件和目录,涉及Linux中的用户权限相关内容。对应《鸟哥的Linux私房菜》第五章
关于用户和用户组的概念,实在不想絮叨,《鸟哥的Linux私房菜》一书中的一个图其实解释的非常不错
以王二毛为例,文件的而所有者是王二毛,王二毛属于王大毛家这个用户组,而张小猪相对于王二毛,只是系统的其他人而已。对于所有的文件,还存在一个用户root,这个就对应图中的天神。关于用户的账号权限设置,这个我们后续会单独总结,这里只是先抛出这个概念,然后在这些概念的基础上梳理文件的相关权限知识。
默认情况下,所有用户的账号都是记录在/etc/passwd这个文件内,所有用户的密码都是记录在/etc/shadow这个文件下,此外Linux的所有组名,都是记录在/etc/group这个文件内,针对这三个文件的作用,我们后面会介绍。
可以看到具体的文件信息,这些详情信息书中也有介绍
从左到右,依次表示文件类型权限,文件连接数,文件所有者,文件所属组群,文件大小,文件最后修改时间,文件名。
第一个字符代表文件类型,常用的文件类型如下
字符 | 类型 |
---|---|
d | 表示是文件夹 |
- | 表示是文件 |
l | 表示是链接(link) |
b | 表示块设备 |
c | 表示字符设备 |
后续的三个字符为一组,且均为[rwx]的三个参数组合。r表示可读,w代表可写,x代表可执行。这三个权限的位置不会改变,如果没有该权限,则用减号[-]代替。这个分为三组,第一组为文件拥有者可具备的权限,第二组为加入此群组账号的权限,第三组为除文件所有者和本群组之外的其他用户的所有权限。
后面的一个数字表示当前文件的硬链接数。
之后的两列,分别表示当前文件的所有者和所属组群。最后三列分别表示文件大小、文件最后修改时间和文件名。
权限对于文件而言至关重要,在修改Linux文件和目录的属性之前,一定要搞清楚,什么数据是可变的,什么是不可变的。
这里重点介绍三个命令,chgrp,chown,chmod三个命令。在此之前,还是需要知道如何由普通用户切换成root用户以及如何新增用户。
sudo命令,暂时以root身份运行命令
sudo su 命令,可以在当前会话内一直成为root用户
su 和 su - ,sudo -i 能达到同样的效果
[coderman@linux-start ~]$ sudo su
[root@linux-start coderman]#
[coderman@linux-start ~]$ su
Password:
[root@linux-start coderman]# exit
exit
[coderman@linux-start ~]$ su -
Password:
Last login: Wed Feb 23 19:52:39 CST 2022 on pts/0
[root@linux-start ~]# exit
logout
[coderman@linux-start ~]$ sudo -i
useradd命令可以新增用户,前提是用root权限操作该用户
[root@localhost ~]# useradd thomas
[root@localhost ~]# ls /home
coderman thomas
[root@localhost ~]# passwd thomas
Changing password for user thomas.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@localhost ~]# ls -l /home
total 4
drwx------. 16 coderman coderman 4096 Apr 30 10:16 coderman
drwx------. 3 thomas thomas 78 Apr 30 10:30 thomas
用户新增完之后,会默认增加一个同名称的组群。
chown命令是修改文件的所有者,用法很简单,后接新的所有者的用户名,再接新文件名。如果连目录下的所有次目录文件需要同时变更所有者的话,则需要加上-R选项。
##在root用户的home目录下切换到thomas用户
[root@localhost ~]# su thomas
##由于thomas用户没有权限,/root目录访问被拒
[thomas@localhost root]$ ls
ls: cannot open directory .: Permission denied
##进入到当前用户(thomas)用户的home目录
[thomas@localhost root]$ cd
##创建thomas文件
[thomas@localhost ~]$ touch thomas.txt
[thomas@localhost ~]# ls -al
total 12
drwx------. 5 thomas thomas 125 Apr 30 10:36 .
drwxr-xr-x. 4 root root 36 Apr 30 10:30 ..
-rw-r--r--. 1 thomas thomas 18 Apr 1 2020 .bash_logout
-rw-r--r--. 1 thomas thomas 193 Apr 1 2020 .bash_profile
-rw-r--r--. 1 thomas thomas 231 Apr 1 2020 .bashrc
drwxrwxr-x. 3 thomas thomas 18 Apr 30 10:35 .cache
drwxrwxr-x. 3 thomas thomas 18 Apr 30 10:35 .config
drwxr-xr-x. 4 thomas thomas 39 Apr 29 19:29 .mozilla
-rw-rw-r--. 1 thomas thomas 0 Apr 30 10:35 thomas.txt ##这里可以看到,这个文件所属的组默认是thomas的同名用户组
## 切换到root用户用chown改变用户所有者,如果不是root用户组的用户,chown命令会被拒绝
[thomas@localhost ~]$ chown coderman thomas.txt
chown: changing ownership of ‘thomas.txt’: Operation not permitted
[thomas@localhost ~]$ su root
Password:
[root@localhost thomas]# chown coderman thomas.txt
[root@localhost thomas]# ls -al
total 12
drwx------. 5 thomas thomas 125 Apr 30 10:36 .
drwxr-xr-x. 4 root root 36 Apr 30 10:30 ..
-rw-r--r--. 1 thomas thomas 18 Apr 1 2020 .bash_logout
-rw-r--r--. 1 thomas thomas 193 Apr 1 2020 .bash_profile
-rw-r--r--. 1 thomas thomas 231 Apr 1 2020 .bashrc
drwxrwxr-x. 3 thomas thomas 18 Apr 30 10:35 .cache
drwxrwxr-x. 3 thomas thomas 18 Apr 30 10:35 .config
drwxr-xr-x. 4 thomas thomas 39 Apr 29 19:29 .mozilla
-rw-rw-r--. 1 coderman thomas 0 Apr 30 10:35 thomas.txt ##文件所有者已经变更。
ps:上述操作是直接在thomas用户的home目录下操作的,目前即使通过root用户将指定文件的所有者变更为coderman用户了,但是coderman用户依旧无法访问到该文件,因为coderman用户依旧没有访问thomas用户home目录的权限。
##切换到root用户
[thomas@localhost ~]$ su root
Password:
[root@localhost thomas]# ls
thomas.txt
##将thomas用户目录下的thomas文件移动到coderman用户目录下,并重命名为coderman.txt
[root@localhost thomas]# mv thomas.txt ../coderman/coderman.txt
[root@localhost thomas]# cd ../coderman/
[root@localhost coderman]# ll coderman.txt
-rw-rw-r--. 1 thomas thomas 25 Apr 30 10:46 coderman.txt
## 然后切换到coderman用户
[root@localhost coderman]# su coderman
## 访问用户,发现还是thomas的用户,并且用户组还是thomas的
[coderman@localhost ~]$ ll coderman.txt
-rw-rw-r--. 1 thomas thomas 25 Apr 30 10:46 coderman.txt
## 切换到root,修改用户组,修改文件所有者
[root@localhost coderman]# chgrp coderman coderman.txt
[root@localhost coderman]# chown coderman coderman.txt
[root@localhost coderman]# ll
total 8
-rw-rw-r--. 1 coderman coderman 27 Apr 30 10:57 coderman.txt
其实chown命令也是可以修改文件的用户群组的
[root@localhost coderman]# chown thomas:thomas coderman.txt
[root@localhost coderman]# ll
total 8
-rw-rw-r--. 1 thomas thomas 27 Apr 30 10:57 coderman.txt
改变文件的读写权限,就是通过这个chmod命令。设置权限的方式有两种,可以通过数字也可以通过符号来进行权限的变更。Linux文件的基本权限有9个,分别是/owner/group/others三种身份各有自己的/read/write/execute权限。
1、通过数字类型改变文件权限
每种身份各自的三个权限数值是累加的,比如当前权限为[rwxrwx—],则
owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others = — = 0+0+0 = 0
## 切换到root用户
[coderman@localhost ~]$ su root
Password:
[root@localhost coderman]# chmod 770 coderman.txt
[root@localhost coderman]# ll
total 8
-rwxrwx---. 1 thomas thomas 27 Apr 30 10:57 coderman.txt
如果要将权限变成[rwxr-xr-x],则通过chmod 754 即可。
2、通过符号改变文件权限
可以籍由u,g,o来代表三种身份的权限,此外a代表all即全部的身份
[root@localhost coderman]# ll
total 8
-rwxrwx---. 1 thomas thomas 27 Apr 30 10:57 coderman.txt
## 通过u-x,删除文件所有者的执行权限
[root@localhost coderman]# chmod u-x coderman.txt
[root@localhost coderman]# ll
total 8
-rw-rwx---. 1 thomas thomas 27 Apr 30 10:57 coderman.txt
## 通过g-x,删除所有者
[root@localhost coderman]# chmod g-x coderman.txt
[root@localhost coderman]# ll
total 8
-rw-rw----. 1 thomas thomas 27 Apr 30 10:57 coderman.txt
除此之外,还有多种写法
chmod go-r file ## 文件file的群组和其他用户组均移除读权限
chmod +x file ## 文件file的所有用户增加运行权限
chmod u=rwx,g=r,o=- file ## 文件file的所有者分配rwx权限,文件组其他用户分配读权限,其他用户不分配任何权限。
以上三个命令中,除了chmod命令之外,其他两个命令都需要切换到root用户运行。
文件权限对于一般文件与文件目录还是有所差异的。
对于文件而言:r(read)权限可以读取文件的实际内容,但不能修改。w(write)权限可以编辑、新增或者修改文件内容(但不能删除该文件)。x(execute)该文件可以被系统执行。但是针对目录而言,这三个权限又有所不同。
对文件夹而言:
r权限——标示具有读取目录结构列表的权限,这个时候目录下的文件名和数据可以通过ls等命令列出来
w权限——这个可以说是文件夹的最高权限,可以在文件夹下建立新的文件和目录,也可以删除已经存在的文件和目录,修改目录下的文件名,移除该目录内的文件等。
x权限——具有x权限的用户表示用户可以进入到该目录。可以通过cd命令,进入到目录中
没有x权限,无法进入到指定目录文件中,如果在某个目录下不具有x权限,那么就无法切换到该目录下,也就无法执行该目录下的任何指令,即使你具有该目录的r或者w权限。因此对于目录而言,如果要让其他用户能浏览指定文件夹下的文件,至少也要基于其他用户该目录的r和x权限。
## coderman用户创建test文件夹
[coderman@localhost ~]$ mkdir test
[coderman@localhost ~]$ ls
coderman.txt Documents Music Public Templates Videos
Desktop Downloads Pictures share test
## 修改用户权限,取消test文件的x权限
[coderman@localhost ~]$ chmod u-x test/
##直接访问test文件夹被拒,都无法进入到test文件夹 这个时候虽然有r权限,但都进不去,r相当于是无用的
[coderman@localhost ~]$ cd test
bash: cd: test: Permission denied
没有w权限,无法修改目录列表下的文件
## 取消w权限
[coderman@localhost ~]$ chmod 575 test/
[coderman@localhost ~]$ ll
total 8
-rw-rw----. 1 thomas thomas 27 Apr 30 10:57 coderman.txt
drwxr-xr-x. 2 coderman coderman 6 Apr 29 19:39 Desktop
drwxr-xr-x. 2 coderman coderman 6 Apr 29 19:39 Documents
drwxr-xr-x. 2 coderman coderman 6 Apr 29 19:39 Downloads
drwxr-xr-x. 2 coderman coderman 6 Apr 29 19:39 Music
drwxr-xr-x. 2 coderman coderman 6 Apr 29 19:39 Pictures
drwxr-xr-x. 2 coderman coderman 6 Apr 29 19:39 Public
drwxrwx---. 1 root vboxsf 4096 Mar 18 20:08 share
drwxr-xr-x. 2 coderman coderman 6 Apr 29 19:39 Templates
dr-xrwxr-x. 2 coderman coderman 22 Apr 30 16:52 test
drwxr-xr-x. 2 coderman coderman 6 Apr 29 19:39 Videos
## 成功进入test目录
[coderman@localhost ~]$ cd test/
## 梳理读取相关文件列表
[coderman@localhost test]$ ls
test.txt
## 但是由于没有w权限,故而不能移动文件
[coderman@localhost test]$ mv test.txt test-new.txt
mv: cannot move ‘test.txt’ to ‘test-new.txt’: Permission denied
## 删除,也不行
[coderman@localhost test]$ rm -f test.txt
rm: cannot remove ‘test.txt’: Permission denied
##新建,也不允许
[coderman@localhost test]$ touch new.txt
touch: cannot touch ‘new.txt’: Permission denied
没有r权限,无法通过ls读取test中的文件列表
[coderman@localhost ~]$ chmod 371 test/
##能顺利进入到test文件夹
[coderman@localhost ~]$ cd test/
[coderman@localhost test]$ ls
ls: cannot open directory .: Permission denied
《鸟哥的Linux私房菜》一书中,针对这三个权限有一个很好的实例来解释:一个目录好比一个抽屉。目录的X权限表示这个抽屉的钥匙,目录的r权限表示这个抽屉中会有个灯,方便用户查找文件。目录的w权限表示可以对这个抽屉中的文件进行拿取或者放入。
简单梳理了一下文件和目录的权限,下一小节梳理一下用户组的相关内容