Linux文件系统权限
linux系统中文件通常归文件的创建者所有。文件具有三种用户权限类别:用户,组,系统中的非用户和非所属组的其他成员。
最具体的权限具有最高的优先权,即,用户权限覆盖组权限,而后者又覆盖其他权限。解释:userA 属于组 groupA,groupA 对 B 文件仅有 r 权限,userA对 B 文件具有 rwx 权限,则userA对文件具有 rwx 权限。
权限对目录和文件的影响
权限 | 对文件的影响 | 对文件的影响 |
---|---|---|
r | 可以读取文件内容 | 可以列出文件的内容(文件名) |
w | 可以更改文件内容 | 可以创建或者删除目录中的任意文件 |
x | 可以作为命令执行文件 | 目录可以成为当前工作目录(也就是你可以cd它,但是 还需要r权限才可以列出里面的文件) |
对于一个文件,拥有 文件所在目录 的所有权或者写入权限的 任何人 都可以删除此文件,不管此文件本身的所有权或者权限为何。
默认权限:在Linux系统中,root用户和普通用户创建的文件的默认权限是有所不同的。
当root用户创建一个.txt文件时,该文件的默认权限通常是rw-r–r–(也就是,110 100 100,644)。这意味着root用户具有读写权限,而所属组和其他用户只有读取权限。
而当普通用户创建一个.txt文件时,默认权限通常是rw-rw-r–(也就,110 110 100,664)。这表示创建该文件的普通用户和同一所属组的用户具有读取和写入权限,而其他用户只有读取权限。
查看文件和目录的所有权及所有权
[root@#test ~]# ls -l /tmp
总用量 24
-rw-r--r-- 1 root root 20 10月 10 14:44 helloandtime.txt
-rw-r--r-- 1 root root 17 9月 28 23:35 hellohello
长列表的第一个字符代表文件类型,- 为普通文件,d为目录文件,l为软链接,(b或c)代表硬件设备,(p和s代表其他特殊用途的文件)
权限解读
rwxr-xr-x 是一个文件权限模式,对应755,表示了文件的访问权限。每个字符串中的字符代表着不同的权限。
解读每个字符的含义如下:
第一个字符 r:表示所有者(Owner)拥有读取(Read)权限。
第二个字符 w:表示所有者拥有写入(Write)权限。
第三个字符 x:表示所有者拥有执行(Execute)权限。
第四个字符 r:表示所属组(Group)拥有读取权限。
第五个字符 -:表示所属组没有写入权限。
第六个字符 x:表示所属组拥有执行权限。
第七个字符 r:表示其他用户(Others)拥有读取权限。
第八个字符 -:表示其他用户没有写入权限。
第九个字符 x:表示其他用户拥有执行权限。
权限之后的数字是链接数,其后的第一个字符串是文件所有者,第二个名称是拥有该文件的组。
命令行管理文件的权限
通过符号法修改权限
格式
chmod whowhatwhich file|directory
who:指u,g,o,a(用户,组,其他,全部)
what:指+,-,=(添加,删除,精确设置)
which:指r,w,x
例如
chmod +x script.sh # 添加执行权限
通过数值修改文件的权限
格式如下,###代表三个数字
chmod ### file|dir
从左到右的三个数值依次代表用户,组和其他的权限。数值的计算方法:将所要的权限的值相加,4代表r,2代表w,1代表x。
7:rwx
6:rw-
5:r-x
4:r–
3:-wx
例如
chmod 644 file.txt # 设置文件权限为644
chmod -R 755 dir/ # 递归设置目录及其内容的权限为755
更改文件和目录的用户和或组所有权
chown
chown [选项] 用户:组 文件/目录
-R 递归的更改整个目录树的所有权
chown root:users file.txt # 设置文件所有者为root,所属组为users
chown :users file.txt # 仅仅设置文件的所属组为users
chown -R admin:admin dir/ # 递归设置目录及其内容的所有者和所属组为admin
chgrp仅用于更改组所有权
chgrp [选项] 组 文件/目录
chgrp users file.txt # 设置文件所属组为users
chgrp -R staff dir/ # 递归设置目录及其内容的所属组为staff
一些别的命令
chattr
chattr [选项] <标志> 文件/目录
chattr +i file.txt # 将文件设置为不可修改
chattr +a log.txt # 将文件设置为只附加
chattr -i file.txt # 解除文件的不可修改标志
chattr -R +i directory/ # 递归设置目录及其内容为不可修改
lsattr 命令可查看文件被chattr设置成的状态
[root@#test ~]# lsattr abc.txt
----i----------- abc.txt
[root@#test ~]# rm -f abc.txt
rm: 无法删除"abc.txt": 不允许的操作
管理默认权限和文件访问
特殊权限
特殊权限是除用户,组和其他之外的第四种权限类型,他提供了一些特殊的权限。
特殊权限对文件或目录的影响。
特殊权限 | 对文件的影响 | 对目录的影响 |
---|---|---|
u+s | 会以文件所有者的身份执行文件而不是命令的执行者身份 | 无影响 |
g+s | 会以 拥有文件的组 的身份执行文件 | 在目录中新创建的文件会将其组所有者设置为目录的组所有者,而非文件的所有者 |
o+s | 无影响 | 用户在目录中仅可删除自己所有的文件,无法删除或者追加后强制保存到其他用户所有者的文件 |
对可执行文件的setuid权限表示将以拥有文件的用户身份运行文件,而不是运行命令的用户身份,以passwd文件为例,在列表中可以通过s来辨别setuid权限,该处通常是x。此外,如果文件的所有者也不具有文件的执行权限,此处的s将会被替换成大写S。
u+s
[root@#test ~]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
对目录的特殊权限setgid表示在此目录中新建文件的组所有者将继承自组目录的组所有者,而非默认的用户的组。这通常用于创建组协作目录,将文件默认的专有组更改为共享组,或者当目录中的文件始终应设置为特定组时。/run/log/journal目录就是这样的实例。当文件的所有组也没有执行权限时,用大写S替换小写s。
[root@#test ~]# ls -l /run/log/journal/
总用量 0
drwxr-s---+ 2 root systemd-journal 60 10月 14 08:18 3a01eefb73074a559f6c32fa40336991
最后,对系统的粘滞位,将对文件的删除设置特殊限制。只有文件所有者以及root可以删除该目录只能怪的文件。
[root@#test ~]# ls -ld /tmp
drwxrwxrwt. 10 root root 4096 10月 14 09:32 /tmp
设置特殊权限
符号: setuid=u+s,setgid=g+s,sticky=o+t
数值(第四位):setuid=4;setgid=2;sticky=1
chmod g+s dir
chmod 2770 dir #第四位在最左边
默认权限
修改默认权限
实验中发现,每次创建目录的权限都是drwxr-x—,即为750,文件的权限都是-rw-r-----即为640。我们能想到的必定这是个默认权限,那这个默认权限由谁来控制?答案是:umask。
首先,我们要了解的是,Linux文件的最大权限是666,目录的最大权限是777,为何目录要比文件权限大?因为目录需要有执行权(x)才能够进入到目录中。
umask的作用是在用户登录Linux系统环境下,设置用户创建目录和文件的初始化权限。
一般umask的值可以在/etc/profile文件中定义。
默认情况下,每个用户都有一个默认的umask 值,通常为 022(以八进制表示)。这意味着在创建新文件时,会屏蔽掉其他用户的写权限和执行权限,将权限设置为 644。在创建新目录时,会屏蔽掉其他用户的写权限和执行权限,将权限设置为 755。
实际权限值=权限值-umask值。
修改用户的umask值即可修改文件的默认权限。
umask值修改
暂时修改
暂时修改的方式,可以通过umask命令来更改,比如计算出权限对应的umask值要改为027,则直接用该用户登录Linux系统后,使用命令umask 027即可。但是,一旦用户退出登录后,umask将恢复默认值,刚才设置的将会失效。所以,这种umask命令方式,只是适合当前会话。
永久修改
除了使用umask命令进行当前会话的用户默认权限设置外,我们还可以对该用户永久性修改umask值。针对某个用户修改,需要用该用户登录Linux,然后修改/etc/profile文件中的umask值。