通过命令ls-l就可以获得文件的权限、属主与属组等信息:
ls-l/etc/hosts-rw-r--r--1rootroot186Aug2718:31/etc/hosts这些信息表示为:
对于每个文件来说,权限被分配给三种不同类别的用户:
关于第一个字母表示的文件类型:
举个例子,-rwxr-r--表示这是一个普通文件,属主拥有读取r(ead)、写入w(rite)及执行x(ecute)权限,而属组和世界(其他用户)均有读取但没有写入和执行权限。
你可能对属组还不是很明白,举个例子有这么一个目录:
drwxr-x---3awww4096Mar3015:30wwwroot属主是用户a,属组是www。这时用户b没有权限的,因为其他用户权限是---。但让用户b加入到名为www到用户组就可以拥有权限r-x。
思考
那么当一个文件的属主没有写入权限而属组有写入权限时,如:
-----w----2user1group14.0KAug2308:45README注意user1用户属于group1用户组,这时可以写入吗?
这是一个权限冲突的问题,属主权限是---,属组权限是-w-,当遇到这样的情况时以属主权限为准,即便该用户属于有写入权限的用户组。
**文件和目录只有其属主或root用户通过chmod(ChangeMode)命令修改文件或目录的文件模式(权限)。
chmod命令有八进制表示法和符号表示法两种模式表示方式。
举个例子:
mkdirDocuments&&ls-ldrwxr-xr-x2connersconners4096Apr811:32Documents这里新建了一个名为Documents的目录,并且可以看到权限是rwxr-xr-x。
按照八进制表示法就是755,也就是依照3个八进制数位表示属主、属组与其他用户的权限。
755usergroupworldr+w+xr+xr+x4+2+14+0+14+0+1=755那么如果想要将其他用户的权限禁止掉,即修改为rwxr-x---就可以使用八进制表示法:
#chmod<八进制表示法><目标文件或目录>chmod750Documents符号表示法符号含义u属主(user缩写)g属组(group缩写)o其他用户(other缩写)a所有(all缩写,等同于u、g、o一起设置)+添加权限-移除权限=只赋予指定权限并移除其他权限举几个例子:
#为指定文件或目录的属组添加写入权限chmodg+w<目标文件>#移除属主、属组与其他用户的写入权限#可以进一步简写为-w省去achmoda-w<目标文件>#可以同时添加多个权限,如为属组同时添加写入与执行权限chmodg+wx<目标文件>#等号会移除其他权限#如下,为属组与其他用户设置为仅有读取与执行权限,如果原有写入权限会被禁用chmodgo=rw<目标文件>#一次性为属主、属组与其他用户设置不同权限时,可用英文逗号隔开chmodu+x,go=rx<目标文件>可以使用-v选项得出修改前后的差别及八进制表示:
#chmod--reference=<被复制权限文件><复制权限文件>chmod--reference=a.shb.sh如上,文件b.sh就拥有了和a.sh一样的文件权限。
chmod还可以使用-R选项以递归的方式更新目录内所有文件的权限。但注意目录下的内容及子目录未必都是相同的属性,比如有的是可执行文件有的是文本文件。
在使用chmod-R进行执行权限调整需要谨慎,它不会去管执行权限对目录和普通文件有不同的含义。前面说过对于目录x表示进入目录,对于普通文件x表示执行。
针对这个问题,也就是如果只想对文件进行一个递归设置,但目录不要进行相应权限设置,可以搭配find命令:
find~-typef-execchmod640{}\;上面这条命令表示使用fimd查找主目录(~)下的普通文件(-typef),执行命令(-exec),命令为chmod640,针对查找到的文件({}),命令结束(\;)
使用chown和chgrp命令可以用于改变文件的属主和属组。
只有root用户可以改变文件的属主,普通用户只有在拥有该文件并且只能更改为其所属的组时才能更改该文件的属组,而root用户可以更改所有文件的属组。
修改文件的属主:
sudochown<目标用户><文件名>在用户组前加上冒号即为修改文件的属组,属主不变:
chown:<目标群组><文件名>将两者结合,修改目录wwwroot的属主为nginx,属组为web:
#-R选项用于递归修改目录下的子文件及子目录sudochown-Rnginx:webwwwroot除了使用chown:<目标属组><文件名>,使用chgrp命令也可以达到相同效果:
sudochgrp<目标群组><文件名>特殊权限除了读取、写入、执行权限之外还有其他一些较少用到的特殊权限设置。
但只是普通用户权限的我们是如何得以修改/etc/shadow文件的?答案是setuid。
setuid位(八进制表示为4000),如果将其应用于可执行文件,会将有效用户ID(effectiveuserID)从真实用户(实际执行程序的用户)ID更改为程序属主的有效用户ID。
大多数情况下,少数超级用户的程序才会做此设置。当普通用户执行setuidroot程序时,该程序将以超级用户的权限来执行,可以访问普通用户通常被禁止访问的文件和目录。这显然会带来安全隐患,因此允许设置setuid位的程序数量必须控制在最小范围内。
chmodu+s<程序文件名>#八进制法表示为chmod4755<程序文件名>权限:-rwsr-xr-x,注意属主的s。
setgid位类似于setuid位,它会将有效组ID(effectivegroupID)从真实用户的真实组ID(realgroupID)更改为文件属主的有效组ID。
如果对目录设置setgid位,那么在该目录下新创建的文件将由该目录的属组所有,而非文件创建者的属组所有。
这在共享目录中非常有用,当一个共同属组的成员需要访问目录中的所有文件时,不用管文件属主的属组是什么。
chmodg+s<目录名>#八进制法表示为chmod2775<目录名>权限:drwxrwsr-x,注意属组的s。
粘滞(sticky)位来自「远古」Unix的遗留产物,用于将可执行文件标记为「不可交换」。
Linux会忽略文件上设置的粘滞位,如果对目录设置了粘滞位,则能够阻止用户删除或者重命名其中的文件,除非用户是该目录的属主,或者是文件的属主,又或者是超级用户。
粘滞位常用来控制对共享目录(如/tmp)的访问。
chmod+t<目录名>#八进制法表示为chmod1777<目录名>权限:drwxrwxrwt,注意最后的t。
一般来说Linux上的文件或目录使用一组默认的权限进行创建,umask命令可用于查看或设置创建新文件的时的默认权限。
不带任何选项参数的情况下使用umask命令就是查看当前的掩码值:
umask0022可以看到当前的掩码值是0022,在一些发行版中也常见为0002
然后使用touch和mkdir创建一个文件和目录再看看它们的权限是怎样的:
touchfile.txtmkdirdirls-ldrwxr-xr-x2toortoor4096Sep214:46dir-rw-r--r--1toortoor0Sep214:46file.txt也就是说这些权限是默认值减去umask掩码值得到的:
此时我想要更改默认权限,就可以反推一下进行设置掩码值,如:
umask0002#之前是0022touchtest.txtls-ltest.txt-rw-rw-r--1toortoor0Sep214:52test.txt可以看到新创建的文件默认权限已经变成了664(rw-rw-r--)
使用umask掩码值并不会改变之前文件的权限,而且仅临时生效于当前shell会话,如果想要永久生效需要修改shell的配置文件。
ConnersHua
不折腾,无生活。
显示名称*
网站
介绍了Systemd的单元类型、单元文件的位置和编辑方法,以及如何使用systemctl命令管理服务的状态和依赖关系