Linux是一个多用户、多任务的系统,常常有多人同时使用一台机工作,为了保护每个人的隐私权,“文件所有者”的角色就显得相当重要了。当Linux用户登录系统之后,就会携带一个用户身份(User ID,UID)和一个用户组身份(Group ID,GID),相当于自己的名片。当需要访问文件或程序时,刷一下名片就能知道是否能读、写、执行了。
Linux文件权限的查看与解读
在根目录下输入ls -l 可看到如下信息:
[root@localhost /]# ls -l total 32 lrwxrwxrwx. 1 root root 7 Aug 18 21:27 bin -> usr/bin dr-xr-xr-x. 4 root root 4096 Aug 26 06:10 boot drwxr-xr-x. 20 root root 3160 Aug 27 23:44 dev drwxr-xr-x. 74 root root 8192 Aug 28 00:39 etc drwxr-xr-x. 3 root root 15 Aug 18 21:31 home lrwxrwxrwx. 1 root root 7 Aug 18 21:27 lib -> usr/lib lrwxrwxrwx. 1 root root 9 Aug 18 21:27 lib64 -> usr/lib64 drwxr-xr-x. 2 root root 6 Aug 12 2015 media drwxr-xr-x. 2 root root 6 Aug 12 2015 mnt drwxr-xr-x. 2 root root 6 Aug 12 2015 opt dr-xr-xr-x. 364 root root 0 Aug 27 23:43 proc dr-xr-x---. 2 root root 4096 Aug 18 21:31 root drwxr-xr-x. 21 root root 620 Aug 28 00:39 run lrwxrwxrwx. 1 root root 8 Aug 18 21:27 sbin -> usr/sbin drwxr-xr-x. 2 root root 6 Aug 12 2015 srv dr-xr-xr-x. 13 root root 0 Aug 27 23:43 sys drwxrwxrwt. 7 root root 4096 Aug 28 00:30 tmp drwxr-xr-x. 13 root root 4096 Aug 18 21:27 usr drwxr-xr-x. 19 root root 4096 Aug 27 23:43 var
每条记录由7部分组成,以lrwxrwxrwx. 1 root root 7 Aug 18 21:27 bin -> usr/bin为例,按照顺序,具体代表的含义是:
- lrwxrwxrwx. 代表的是文件类型和权限
- 1 代表文件连接数
- root 代表拥有者
- root 代表所属用户组
- 7 代表文件大小(以K为单位)
- Aug 18 21:27 代表文件最后修改时间
- bin -> usr/bin 文件名
先来拆分下 lrwxrwxrwx. 这串字符,其中第一个字符用来描述文件的类型,可选值为:
- – 代表普通文件
- d 代表目录
- l 代表这个是软连接或硬连接
- b 代表块设备,如磁盘等保存大块数据的设备
- c 代表字符设备,如鼠标、键盘等需要连续串行读写的设备
- s 代表套嵌字(socket)文件
- p 代表命名管道文件
文件名与文件类型
Linux文件名的规则与Windows 9x中的基本上是相同的。它同样是由字母、数字、下画线、圆点组成,最大的长度是255个字符。
Linux文件系统一般包括5种基本文件类型,即普通文件、目录文件、链接文件、设备文件,和管道文件。
- 普通文件:计算机用户和操作系统用于存放数据、程序等信息的文件,一般又分为文本文件和二进制文件,例如C语言源代码、Shell脚本、二进制的可执行文件等。
- 目录文件:目录文件是文件系统中一个目录所包含的目录项组成的文件,包括文件名、子目录名及其指针。用户进程可以读取目录文件,但不能对它们进行修改。
- 链接文件:链接文件又称符号链接文件,通过在不同的文件系统之间建立链接关系来实现对文件的访问,它提供了共享文件的一种方法。
- 设备文件:在Linux系统中,把每一种I/O设备都映射成为一个设备文件,可以像普通文件一样处理,这就使得文件与设备的操作尽可能统一。
- 管道文件:主要用于在进程间传递数据。Linux对管道的操作与文件操作相同,它把管道作为文件进行处理。管道文件又称先进先出(FIFO)文件。
从对文件内容处理的角度而言,无论是哪种类型的文件,Linux都把它们看作是无结构的流式文件,即把文件的内容看作是一系列有序的字符流。
这个文件 l,则代表是一个软连接或硬连接。紧接的9个字符,需要三个三个的看,分别代表着:
- 拥有者的权限
- 所属组的权限
- 其他用户的权限
顺序为 rwx,对应的是Read(读)、Write(写)、eXecute(执行)的权限,如果不具有某项权限,则使用 – 表示。
最后一个 . 可能让人很疑惑,是用来做什么的,查询了下,资料显示这个点表示的是存在“SELinux的安全标签”!,如果关闭了selinux,则不过出现该点。
rwx权限详解
rwx 作用到文件 [r]代表可读(read):可以读取,查看 [w]代表可写(write):可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是该文件所在目录有写权限 [x]代表可执行(execute):可以被执行 rwx 作用到目录 [r]代表可读(read):可以读取,查看 [w]代表可写(write):可以修改,目录内创建+删除+重命名目录 [x]代表可执行(execute):可以进入该目录
另外注意到最后的这次演示的最后的文件名,存在着一个-> 代表则软连接或硬连接,接下来就来学习下软连接和硬连接的区别。
- 软连接(也称作符号链接——symbolic link, symlink orsoft link),是一类特殊的文件,其包含有一条以绝对路径或者相对路径的形式指向其它文件或者目录的引用。有点类似于windows的快捷方式。创建方式是:ln -s source dist
硬连接,指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止”误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。创建方式是:ln source dist
通过一些梳理,可以知道软连接与硬连接的一些异同:
- 使用时差别不大,都相当于一个文件具有不同的路径或文件名
- 输入删除文件连接的目标文件,软连接会失效,硬连接仅是”连接数-1″
- 软链接可以创建在任何位置,包括网络,而硬连接必须在同一磁盘上
关于软连接和硬连接的详细介绍到整理inode相关知识点的时候再做介绍。
文件扩展名
基本上,Linux的文件是没有所谓的『扩展名』,一个Linux文件能不能被执行,与x有关,与文件名根本一点关系也没有。这个观念跟Windows的情况不相同!在Windows底下,能被执行的档案扩展名通常是.com.exe.bat等,而在Linux底下,只要你的权限当中具有x的话,例如[-rwx-r-xr-x]即代表这个文件可以被执行!
但是能执行与能执行成功是不同的。虽然扩展名不起作用但是我们还是希望可以由扩展名了解此文件是什么东西。所以。。。
- .sh:脚本或者批处理文件(scripts)
- .Z.tar.tar.gz.zip.tgz:经过打包的压缩文件。
- .html.php:网页相关文件。
Linux文件权限的修改
接下来学习的是修改文件的属性和权限,首先学习的是修改所属用户或用户组。命令格式:chown [-R] username:group filename (其中-R在修改文件夹的时候使用,代表的是递归修改。)
修改读写权限共有两种方法:
数字法
权限rwx对应的是4,2,1,实际为3位的二进制,如果只要读权限就是4,如果用户有读写权限,那么就是4+2=6,以此类推。
chmod 700 filename 执行的是设定用户有读写执行的权限,用户组、其他用户都没有权限。
# | 权限 | rwx | 二进制 |
---|---|---|---|
7 | 读+写+执行 | rwx | 111 |
6 | 读+写 | rw- | 110 |
5 | 读+执行 | r-x | 101 |
4 | 只读 | r– | 100 |
3 | 写+执行 | -wx | 011 |
2 | 只写 | -w- | 010 |
1 | 只执行 | –x | 001 |
0 | 无 | — | 000 |
文字法
文字法首先要引入四个字母:u、g、o、a,其中u代表user,g代表group,o代表other,a代表all。另外需要学习三个符号:+、-、=,分别代表增加、减去和设定,如:chmod ug+w filename ,意味着给filename的用户及用户组添加写权限。
补充内容
掩藏文件
刚开始的ls -l 其实并没有把目录下的所有文件都显示出来,可以使用ls -al 将所有的信息显示出来:
[root@localhost ~]# ls -al total 32 dr-xr-x---. 2 root root 4096 Aug 18 21:31 . dr-xr-xr-x. 17 root root 4096 Aug 18 21:31 .. -rw-------. 1 root root 1141 Aug 18 21:31 anaconda-ks.cfg -rw-r--r--. 1 root root 18 Dec 29 2013 .bash_logout -rw-r--r--. 1 root root 176 Dec 29 2013 .bash_profile -rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc -rw-r--r--. 1 root root 100 Dec 29 2013 .cshrc -rw-r--r--. 1 root root 129 Dec 29 2013 .tcshrc
可以看到root的home目录下有很多前面带.的文件,这些文件就是Linux中的掩藏文件,在Linux中将文件在文件名前面加一.即可将文件掩藏。
特殊目录
Linux下有几个特殊的目录:”.”、”..”、”-“、”~”
- “.”当前目录
- “..”上层目录
- “-“上一个工作目录
- “~”当前用户的home目录
特殊文件权限
Linux的文件除了rwx以外,还有s、t这两个特殊的权限。平时用的不多,不做深入学习。
chmod:更改文件权限
语法: chmod <选项> <参数> 选项: -c或--changes #效果类似"-v"参数,但仅回报更改的部分 -f或--quiet或--silent #不显示错误信息 -R或--recursive #递归处理,将指令目录下的所有文件及子目录一并处理 -v或--verbose #显示指令执行过程 --reference=<参考文件或目录> #把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同 参数: 权限模式 #指定文件的权限模式 文件 #要改变权限的文件 实例: #第一种方式:+、-、=变更权限 #u:所有者 g:所有组 o:其他人 a:所有人(u、g、o总和) chmod u=rwx,g=rx file #表示该文件者拥有读、写、执行权限,同一用户组拥有读、执行权限,其他人未设置拥有之前的权限 chmod g+w file #表示该文件在原权限上添加同一用户组可写权限 chmod a-x file #表示该文件在原权限上取消所有人的执行权限 #第二种方式:通过数字变更权限 #r=4 w=2 x=1 -=0 如:rwx=4+2+1=7 chmod 755 file #相当于 chmod u=rwx,g=rx,o=rx file
chown:更改文件所有者
语法: chown <选项> <参数> 选项: -c 或 --changes #效果类似“-v”参数,但仅回报更改的部分 -f 或 --quite 或 --silent #不显示错误信息 -h 或 --no-dereference #只对符号连接的文件作修改,而不更改其他任何相关文件 -R 或 --recursive #递归处理,将指定目录下的所有文件及子目录一并处理 -v 或 --version #显示指令执行过程 --dereference #效果和“-h”参数相同 --reference=<参考文件或目录> #把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同 参数: 用户:组 #指定所有者和所属工作组。当省略“:组”,仅改变文件所有者 文件 #指定要改变所有者和工作组的文件列表。支持多个文件和目标,支持shell通配符 实例: chown tom file #改变文件的所有者 chmod tom:group file #改变用户的所有者和所有组
chgrp:更改文件所在组
语法: chgrp <选项> <参数> 选项: -c 或 --changes #效果类似“-v”参数,但仅回报更改的部分 -f 或 --quite 或 --silent #不显示错误信息 -h 或 --no-dereference #只对符号连接的文件作修改,而不更改其他任何相关文件 -R 或 --recursive #递归处理,将指定目录下的所有文件及子目录一并处理 -v 或 --version #显示指令执行过程 --reference=<参考文件或目录> #把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同 参数: 组 #指定新工作名称 文件 #指定要改变所属组的文件列表。多个文件或者目录之间使用空格隔开 实例: chgrp group file #改变文件的所有组