linux系统是一个多用户多任务的系统,多任务指的是能同时执行多个任务,比如能一边用音乐播放器听歌一边用编辑器写代码。而多用户指的是,多个人一起登录和使用这个系统,这就会引出一个问题。多个人使用一个系统的时候,A必定不希望B能修改他的文件,比如辛辛苦苦写的代码如果给改了或删除了,那必定会吐血不止。
所有这时候就要引入文件权限的概念,来限制用户访问或修改某些文件。
文件权限
在linux系统中,每个文件都不同的权限,如读、写、执行 。可以用以下命令来查看
ls -l Desktop/
然后会显示以下的输出结果:
drwxr-xr-x 2 pete penguins 4096 Dec 1 11:45
下面来分析显示的信息:
第一部分:
由10个字符组成 drwxr-xr-x,第一个字符d代表文件类型,代表目录(directory),一般情况下还有“-”,表示为普通文件。
剩下的9个字符rwxr-xr-x,分别代表用户,组,和其他用户的读写执行权限,
- r(readable),代表可读,
- w(writable),代表可写入
- x(excutable),代表可执行
- -,权限为空
所以第一部分drwxr-xr-x表示的是,该文件是目录,用户具有读写执行的权限,组拥有读和执行的权限,其他用户也是拥有读和执行的权限
第二部分:
2, 表示硬链接(hard link)个数,linux下的链接有点类似window下的快捷方式,不同的是,原文件修改的时候,链接也会跟着修改。
第三部分:
表示文件的拥有者, pete表示该文件属于pete用户的
第四部分:
表示文件所属的组
penguins表示该文件属于penguins组的
剩下的部分:
剩下的4096 Dec 1 11:45代表文件的大小和修改时间
修改文件权限
上面提到了,每个文件都拥有不同的权限,比如有的文件只具有可读的权限,却不具备可写入权限。这样的文件是没办法编辑保存的,而有时候又希望更改文件的内容,那怎么办呢?
可以用过chmod命令来修改权限,比如想给myfile添加可写入的权限,完整的命令如下:
chmod u+w myfile
chmod是(change mode)的简称,翻译过来就是改变模式。
如果要给文件添加执行的权限,命令如下:
chmod u+x myfile
u+x代表给用户添加可写入的权限,如果你希望给所属组添加的话,将参数改为g+x。
很自然的“+”号代表添加权限,那“-”自然就代表删除权限了。如果你想删除用户的可执行权限,可以改为u-x.
除此之外,还可以用8进制的形式修为文件的权限,比如通过这种方式赋予文件可执行的权限,可以用这个命令:
chmod 744 myfile
这种方式用起来确实简单一些,4表示可读,2表示可写入,1表示可执行,所以4+2+1=7,表示赋予用于可读可写可执行的权限。
剩下的44表示赋予组和其他用户可读的权限
修改文件拥有者
上面提到了,每个文件都有对应的用户、所属组、其他用户,除了能修改文件的权限以为,还可以修改文件的拥有者。通过命令chown来实现,chown全称为(change owner),即改变拥有者的意思。
比如我想修改myfile文件的拥有者为jack,可通过以下命令:
chown jack myfile
文件初始权限
每个文件被创建的时候,都拥有初始的权限,如读和写的权限。如果你想修改文件初始权限可以通过 umask命令来实现
比如我想将文件的初始文件改为:拥有者(允许所有权限)、所属组(剥夺写入权限)、其他用户(剥夺执行权限)
umask 022
umask后面对应的数字,是剥夺相应的权限:
- 0:空
- 1:执行权限
- 2:写入权限
- 4:可读权限
三种特殊的权限
SUID
前面提到了,每个文件都用对应的读写执行的权限,但是当运行以下命令时
ls -l /usr/bin/passwd
如果你注意看的话,会发现用户权限中多出来一个权限位,s
-rwsr-xr-x 1 root root 47032 Dec 1 11:45 /usr/bin/passwd
这个s的权限位的作用是什么呢?它允许所有运行这个程序的用户,都具有文件的所有者的权限。
这个文件的拥有者是root用户,即所有用户运行这个程序时,都具有管理员用户的权限
为文件添加SUID
有两种方法可以为文件添加SUID
第一种通过符号的方式:
sudo chmod u+s myfile
第二种通过8进制数字的方式:
sudo chmod 4744 myfile
SGID
很自然的,有了SUID,SUID允许任何运行程序的用户,都拥有程序所有者的权限。那就应该有一个SGID,允许任何运行程序的用户,拥有所属组的权限
当你运行以下命令时,如果注意看的话,会发现所属组的权限中多了一个s位
$ ls -l /usr/bin/wall
-rwxr-sr-x 1 root tty 19024 Dec 14 11:45 /usr/bin/wall
为文件添加SGID
也是两种方式:
$ sudo chmod g+s myfile
$ sudo chmod 2555 myfile
sticky bit
还有最后一个要介绍的就是sticky bit,它的作用就是允许任何用户修改文件,但只允许文件的拥有者和管理员用户删除它
$ ls -ld /tmp
drwxrwxrwxt 6 root root 4096 Dec 15 11:45 /tmp
如果注意看的话,权限位的最后多出了一个t,即代表sticky bit。
为文件添加sticky bit
$ sudo chmod +t mydir
$ sudo chmod 1755 mydir