1.权限
复习一下之前提到过的基本指令。
Linux是一个多人协助的操作系统,不同的用户可以使用同一个Linux操作系统。因此在Linux中有关账户的相关指令也有很多,主要用到的指令有:
- “useradd”:创建新用户账户
- “passwd”:设置或更改用户账户的密码,“passwd username”会提示你输入新的密码来更改"username"用户账户的密码
- “usermod”:修改用户账户的属性。“usermod -aG groupname username”会将用户"username"添加到"groupname"用户组中
- “userdel”:删除用户账户。“userdel username”会删除名为"username"的用户账户(请小心使用此指令,删除用户账户也会删除用户的文件和目录)
- “su”:切换用户身份。“su username”可以将当前用户切换为"username"用户
- “sudo”:以管理员权限执行命令
现在让我们来学习一下Linux下的权限概念。
1.1.对用户来说
1.1.1.账户分类
Linux是多用户操作系统,用户可以分为普通用户和root用户
- 普通用户:存在多个用户,其受到权限的约束
- root:只有一个root,其具有linux下的最高权限
不同的用户最好用不相同的密码。
1.1.2.用户身份
- 拥有者(owner):文件属于哪一个用户
- 所属组(group):文件属于哪一个组
- 其他人(other):不属于上面任何一个的就是other
1.2.对文件来说
1.2.1.权限的概念
Linux下的指的是文件权限。
权限 = 用户(用户自己的权限) + 文件属性(文件天然就有的权限) 权限 = 用户(用户自己的权限) + 文件属性(文件天然就有的权限) 权限=用户(用户自己的权限)+文件属性(文件天然就有的权限)
例如有的文件天然就不能被执行,您说纯文本文件怎么能够被执行起来呢?
1.2.2.文件的属性
一个文件/目录具有三个属性:读取®、修改(w)、执行(x)。
“ll”命令显示的第一列字符串就显示了一个文件的三属性。
其中有三组字符串,分别对应owner、group、other三种用户身份,字符串的显示权限就是每个身份的权限,“-”表示没有对应的权限。
除了字符串表示法,还可以使用二进制来完整表述文件/目录的权限。
- 对于文件来说三属性代表:可读取文件®、可编辑/复制/移动/删除文件(w)、可运行文件,但是不一定真的可以执行,只是具有执行的权力(x)
- 对于目录来说三属性代表:可展开读取目录的自文件或目录列表®、可创建/修改/移动/删除文件或目录(w)、可进入该目录并访问其中的内容(x)
1.2.3.文件的类型
在Linux下不以文件后缀来区分文件类型,虽然我们可以加上后缀来区分文件类型,但是这在系统层面来说是没有意义的,仅仅方便用户显示罢了。
如果开头为“r”表示目录、“-”表示普通文件、“p”表示管道文件(用作通信操作)、“b”表示块设备(最典型的块设备就是磁盘设备)、“c”字符设备(最典型的就是键盘设备和显示器设备)、“l”链接文件(类似Windows的快捷键)……
如果使用“ll”命令显示的第一个字符就显示了一个文件的类别。
但是注意,为什么有的时候文件的后缀会影响效果呢?比如:使用gcc编译包含C程序的后缀为.txt的文件时,会发现提示文件格式错误。
这是因为对于gcc来说,它是一个Linux下的软件,Linux系统的确是没有对文件有后缀要求,但是不排除某些软件对文件有后缀要求。
1.3.文件的属性操作
文件的属性操作分为:修改用户身份、修改文件属性。
1.3.1.修改用户身份
默认情况下,如果当前终端用户直接使用mkdir和touch指令后,得到的用户身份是:“所属者为自己”和“用户组为自己”。
- 使用“chown”指令可以修改用户的身份为“某所属者”,“sudo chown 所属者 文件/目录”
- 使用“chgrp”指令可以修改用户的身份为“某用户组”,“sudo chgrp 所属者 文件/目录”
- 还可以同时设置“某所属者”和“某所属组”,“sudo chown 所属者:所属组 文件/目录”
- “other”身份是不确定的,也不需要设置,是相对改变的
需要注意的是,要赋予别人身份是需要经过别人同意的。同理,拿回身份也需要别人同意。都是可以使用“root强迫同意”或者使用“sodu强迫同意(sodu使得后续执行命令以root权限级别来执行,但是只是使用权限,是一种临时提升权限的方式,但是这个命令只有添加到信任列表“/etc/sudoers”的用户才可以执行sudo指令,而添加信任列表的操作只有root才可以做到)”。
1.3.2.修改文件属性
默认情况下,如果当前终端用户直接使用mkdir和touch指令后,得到的目录权限和文件权限如是:“rwxrwxr-x”和“-rw-rw-r–”。
- 对拥有者:“chmod u+权限,u-权限 文件/目录”
- 对所属组:“chmod g+权限,g-权限 文件/目录”
- 对其他人:“chmod o+权限,o-权限 文件/目录”
- 或者一次设置三种身份的权限:chmod u+/-权限,g+/-权限,o+/-权限 文件/目录”
- 或者同步所有身份的权限:“chmod a+/-权限 文件/目录”
但是对于root来说,上面的权限设置完全没有任何限制。
还有一种修改方法,是使用二进制修改,有无权限代表两种状态.
比如“(111 111 111)2 = (777)8”则对应“chmod 777 test.txt”
比如“(000 000 000)2 = (000)8”则对应“chmod 000 test.txt”
比如“(111 110 100)2 = (761)8”则对应“chmod 761 test.txt”
1.3.3.一些奇怪的问题
- 如果一个文件的拥有者权限是“-wd”,而所属组是“rwd”那么拥有者是否能读取这个文件呢?答案是不能,因为权限只能认证一次,只要看过所属者的权限,就不再考虑后续的权限设置。
- 为什么Linux默认:一个目录被创建后起始权限从777开始,一个普通文件被创建后起始权限是666开始。(默认情况下,如果当前终端用户直接使用mkdir和touch指令后,得到的用户身份是:“所属者为自己”和“用户组为自己”。默认情况下,如果当前终端用户直接使用mkdir和touch指令后,得到的目录权限和文件权限如是:“rwxrwxr-x”和“-rw-rw-r–”。)但是为什么最后我们发现是“775”和“666”呢?答案是受了umask的影响。
- 如果别人在我的目录下创建了一个文件,我没有任何的权限,但是我依旧是可以把它删除掉。为什么呢?因为删除文件不是文件本身的属性,而是目录的属性,如果别人进都进不来,更别谈删除什么文件了。但是,这依旧会引发一个问题:如果我是需要和别人在某个特殊的路径下共同协作呢?虽然我可以设置这个文件的读写执行权限,但是我不能阻止别人删除呀!(例如tmp文件就是所用用户共享的文件,包含几乎所有人的临时文件)其实这也简单,让root控制这个目录,将其other权限设置为“o-w”,这样对于root来说,其他用户都是other,都无法删除别人的文件和目录。但是这就又产生了一个问题:other用户们发现不仅不能删除别人的文件,还不能删除自己的,甚至连创建文件都没办法做到。于是我们来到最终的解决方案:粘滞位。
2.umask权限掩码
凡是在umask中出现的权限,都不应该在最终权限中出现。
如果我们输入umask,则出现默认掩码“0002”,我们现在只研究后三个即可。
这个掩码的计算如下:
我们可以通过“umask”指令自己设置对应的八进制掩码。
umask掩码的存在可以使得创建文件或目录的时候自动设置默认权限,增加系统安全性或隐私性。
3.粘滞位
粘滞位是一个特殊的权限位,该权限的设置命令为:“chmod +t 某个目录”。
粘滞位是为了解决前面第三个问题的,请注意,只有目录才能设置粘滞位,对于文件本身是没有该标志的。
这个时候就会发现other权限变成了一个“t”字符权限,该权限的表现方式是:
这样每个用户都可以给自己创建和删除文件,但是不能删除别的用户的文件。
并且,粘滞位一般是谁设置谁取消(除了root)。
另外,粘滞位的设置可以通过使用chmod命令并在权限位中添加数字1(例如,chmod 1777 某目录)来完成。取消粘滞键可以使用“chmod -t 某目录”或者“chmod 0777 某目录”。