ls-al格式化地输出了文件的详细信息,每个文件都有7列输出,下面详细介绍每列的含义。
第一列表示 文件的类别和权限
第一个字符可能的值 | 含义 |
---|---|
d | 目录 |
- | 普通文件 |
l | 链接文件 |
b | 块文件 |
c | 字符文件 |
s | socket文件 |
p | 管道文件 |
第二列代表“连接数”,除了目录文件之外,其他所有文件的连接数都是1,目录文件的连接数是该目录中包含其他目录的总个数+2,也就是说,如果目录A中包含目录B和C,则目录A的连接数为4。
第三列代表该文件的所有人,第四列代表该文件的所有组,第五列是该文件的大小,第六列是该文件的创建时间或最近的修改时间,第七列是文件名
chmod
从前面内容可知,Linux下的每个文件都定义了文件拥有者(user)、拥有组(group)、其他人(others)的权限,我们使用字母u、g、o来分别代表拥有者、拥有组、其他人,而对应的具体权限则使用rwx的组合来定义,增加权限使用+号,删除权限使用-号,详细权限使用=号。表中用一些例子说明了如何使用chmod来改变文件的权限。
作用 | 命令 |
---|---|
给某用户添加用户权限 | chmod u+r somefile |
给某用户删除用户权限 | chmod u-r somefile |
添加某用户对某文件的读写执行权限 | chmod u+rwx somefile |
给某文件设定用户拥有读写执行权限 | chmod u=rwx somefile |
如果要给用户组或其他人添加或删除相关权限,只需要将上面的u相应地更换成g或o即可。但是正如大家看到的,这种方式同一时刻只能给文件拥有者、文件拥有组或是其他所有人设置权限,如果要想同时设置所有人的权限就需要使用数字表示法了,我们定义r=4,w=2,x=1,如果权限是rwx,则数字表示为7,如果权限是r-x,则数字表示为5。
假设想设置一个文件的权限是:拥有者的权限是读、写、执行(rwx),拥有组的权限是读、执行(r-x),其他人的权限是只读(r–),那么可以使用命令chmod 754 somefile来设置。如果需要修改的不是一个文件而是一个目录,以及该目录下所有的文件、子目录、子目录下所有的文件和目录(即递归设置该目录下所有的文件和目录的权限),则需要使用-R参数,也就是chmod-R 754 somedir
默认值与umask
既然说Linux系统对每个文件都有严格的权限控制,但是似乎并没有太细致地设置文件权限,而且在新创建文件的时候,也没有特意设置过权限。事实上,所有的文件在创建时就都是有权限的了,那么这些权限是怎么来的呢?也许你会想到是系统采用了默认权限的方法,也就是当我们创建文件的时候,系统套用默认权限来设置了
文件。下面使用root用户登录系统来看一下:
注意,创建的root_file1、root_file2文件的权限都是644;创建的root_dir1、root_dir2目录的权限都是755。到这里似乎可以得出一个结论:文件的权限默认是644,目录的默认权限是755。但是实际情况是这样的吗?让我们使用普通用户来操作一下,如下所示:
这里创建的wsp_file1、wsp_file2文件的权限都是664;创建的john_dir1、john_dir2目录的权限都是775。
可以给出一个结论:对于root用户,文件的默认权限是644,目录的默认权限是755;对于普通用户,文件的默认权限是664,目录的默认权限是775。到这里似乎可以结束关于默认权限的讨论了。但是,有两个疑问请考虑一下:
- 这个默认权限是从哪里来的呢?
- 为什么root用户和普通用户的默认权限不同呢?
要想回答上面的问题,就需要引入umask概念,中文翻译为:遮罩。在Linux下,定义目录创建的默认权限的值是“umask遮罩777后的权限”,定义文件创建的默认权限是“umask遮罩666后的权限”。
系统在/etc/profile文件中,通过第51行至55行的一段代码设置了不同用户的遮罩值。
if [ $UID -gt 99 ] && [ "`id -gn`" = "`id -un`" ]; then
umask 002
else
umask 022
fi
从上面的代码中可以看出,UID大于99的用户设置了umask为002,否则为022。所以umask值对于root用户是022,对于普通用户是002,这也就造成了上面我们看到的root用户和普通用户创建出来的文件和目录默认权限不一样,那么如何使用遮罩计算权限呢?
777用字符串表示为:rwxrwxrwx,如果遮罩值是022,用字符串表示为:----w–w-,那么前者第五位和第八位的w被遮罩掉,权限变为rwxr-xr-x,用数字表示就是755。如果遮罩值是002,用字符串表示为:-------w-,那么第八位的w被遮罩掉,权限变为rwxrwxr-x,用数字表示就是775。666用字符串表示为:rw-rw-rw-,如果遮罩值是022,用字符串表示为:----w–w-,那么前者第五位和第八位的w被遮罩掉,权限变为rw-r–r–,用数字表示就是644。如果遮罩值是002,用字符串表示为:-------w-,那么第八位的w被遮罩掉,权限变为
rw-rw-r–,用数字表示就是664。
特别强调一下,网络上有很多关于计算umask遮罩后权限值的讲解,比较主流但是错误的讲解方式是使用“同位相减”的做法来计算遮罩后的值,比如说777-022同位相减得到755,666-022同位相减得到644,这种看似正确的结果其实只是一种巧合,并不是了解遮罩的正确方式。假设有个文件的权限为666,在遮罩值为011的情况下,采用该“同位相减”的方法计算出的权限值为655,但实际上正确的权限值应该是666。