文件模式分成了三组,每组都有读权限,写权限,执行权限,每一组的权限如果用二进制的数字表示,可以写为111,1代表有该权限,0代表没有,权限设置为111-110-110则意味着文件拥有者拥有读,写和执行三个权限,而用户组成员和其他人只拥有对文件读和写的权限。但是用二进制来设定很麻烦,所以,实际使用数字设置权限的时候,使用八进制,比如设置一个文件的权限为只有拥有者可以读写,那么二进制写作110 000 000,在使用chmod命令的时候写作chmod 600。
我们看到,新建文件test的文件模式为rw- rw- r–
我们修改一下umask的值,再新建一个文件试试
umask显示的值是文件模式的掩码,是一个八进制的数字。先撇开掩码的第一位,初始后三位是002,变成二进制数就是000 000 010,这个掩码对应的权限就是rw- rw- r–,之后我们修改掩码,变为000 000 000,这时候掩码对应的权限就是rw- rw- rw-,是不是已经能看出倪端了?对,当我们将二进制格式的掩码某一位设置为0,实际上是打开了该位置的权限(但是执行权限无法开启,这也是处于安全考虑,新建的文件没有执行权限)
那么第一个八进制的0是什么含义?
除了常用的读权限,写权限和执行权限,还有一些特别的权限。
1:setuid位,他在掩码的第一位,如果开启,那么文件权限的掩码应该是4000。setuid有什么作用呢?如果某个文件开启了setuid位,那么该文件执行的时候,该文件具有文件所有者的权限,比如你是一个一般用户,你执行了一个root用户的文件,并且该文件设置了setuid位,那么文件执行的时候是拥有root权限的,所以对于setuid位的设置要慎重。
如何开启setuid位呢
chmod u+s 文件,表示开启setuid
2:和setuid位类似,他在掩码的第二位,开启的话,掩码的设置是2000。setgid表示操作一个文件的时候,操作文件的用户组会由当前组变为文件所在组的权限。对于文件所属组不是文件创造者所在组的情况,可能会带来权限的变化。
开启setgid
chmod g+s 文件,开启setgid位
3:sticky位,掩码中的第三位,开启时,掩码设置是1000,这个权限位通常用来限制访问,如果它开启,那么它能阻止用户删除或重命名文件,除非用户是这个文件所有者,或是超级用户。
开启sticky位
chmod +t 文件
如何确定某个文件是否开启了setuid位,segid位呢?当某个文件开启了某个特殊权限位,那么在对应的权限分组中,该组的执行权限会显示s。
比如某个文件开启了setuid位,那么他的权限是rws r– r–;开启了setgid位,则是rw- rws r–;sticky位则在其他人组中体现,rw- rw- rwt
su/sudo 身份的切换
除非是root用户,否则一般用户在很多情况下都会有对系统进行操作的限制。如果一个一般用户进行某个操作,比如执行某个文件,但是他没有这个文件的执行权限,那么该怎么办呢?最简单粗暴的方式就是注销,使用root用户登录进行操作。虽然可行,但是不可取,毕竟太不方便了。
su:使用替代用户执行命令
这个命令不太好记,全称是run a command with substitute user and group ID,看起来是substitute user的缩写。作用就是使用替代用户来执行操作。
示例:切换一个用户,如果不指定用户,那么默认切换到root
su [用户]
直接使用su之后,系统提示我们输入密码,注意,这里输入的是root用户的密码,而不是当前用户的密码。之后,我们会发现shell提示符酉“$”变成了“#”
有一个常用选项是”-l”(他有一个别名是“-”),添加“-l”会出现一个需要登录的shell,加载替代用户的shell环境。我们看到,添加“-l”之后登录,初始目录定位到了root用户的家目录
其实有时候我们并不需要切换用户,只是需要使用个别用户的权限来做一些操作罢了,还有一个常用选项是“-c”,执行一个命令。比如一个一般用户希望查看一下root用户的家目录
只执行单个命令,而不是启动一个新的可交互的 shell,使用“-c”选项,命令将传递到一个新的shell中执行,所以命令参数需要单引号引起作为一个参数。
sudo:使用替代用户去执行操作,但是提供灵活的配置
sudo和su类似,都是以另一个身份去执行某些操作,但是sudo允许管理员进行灵活的配置,比如某些操作只允许特定用户来执行,在经过配置之后,特定用户不需要管理员的密码,只需要输入自己的密码就可以使用管理员权限来执行特定操作。通常情况下,sudo并不会启动一个新的shell,也不会加载其他用户的shell环境。
除了切换当前的用户,获取root权限等,我们还需要更改文件的所有者,所属组
chown:更改文件的所有者和所属组
这个命令可以同时修改两个所属关系,也可以单独修改。
命令格式:chown [OPTION]… [OWNER][:[GROUP]] FILE…,这是文档的原话,我们添点料
最简单的使用:chown alvindu327 a.txt,把a.txt文件的所有者从原所有者变为alvindu327
然后,说一下比较全面的用法
1,同时变更所属用户和所属组。chown alvindu327: a.txt,刚才的命令我们可以看到,a.txt的所属组依然属于root,在所属用户之后添加“:”,意为着将文件原所属组变更为新用户登陆时的所属组
2,单独变更所属用户和所属组。
chown alvindu327:demonuser a.txt,将a.txt的所属用户变为alvindu327,所属组变更为demonuser
3,只变更所属组
chown :onlygrp a.txt,将a.txt的所属组变更为onlygrp,所属者不变
接下来还剩下不少命令需要了解,比如新建用户,新建组,修改密码等等,但是一一列举出来没什么意思,为什么不用apropos去模糊查询一下呢,新建用户,或许会是adduser吧,要不createuser?猜测和搜索也是很好的学习方式。
喔,最后几乎忘了一个重要的内容,虽然常用权限有读,写,和执行,看起来很简单,但是你真正明白他们的含义吗?
对于文件而言
- 读权限:表示可以查看这个文件的内容(可以使用cat,less,more等命令进行查看)
- 写权限:表示可以修改这个文件的内容(可以使用编辑器修改这个文件)
- 执行权限:表示该文件(可能是命令,或者脚本)可以执行
对于目录而言(虽然目录也是文件,但是这里做一个区分)
- 读权限:表示可以列出目录内的内容(使用ls可以查看文件的内容)
- 写权限:表示可以在目录中创建,删除文件(touch文件,mkdir目录,或者rm文件)
- 执行权限:表示可以进入到这个目录中
对于常用读写执行权限,我本来也和很多人一样,认为很简单,但是其中真的有几个误区需要扫盲:
*我对一个文件有写权限,我就可以删除这个文件吗?答案是否定的,写权限仅仅是修改文件的内容而已,如果你需要删除这个文件,你需要拥有对这个文件所在目录的写权限才行。
*我对一个目录有读权限,我就可以查看这个目录的内容吗(虽然听起来没什么不对)?答案是否定的,对一个目录有读权限,仅仅是让你能看到这个目录的存在,而查看目录的内容,你需要目录的执行权限,所以,目录的读权限和执行权限一般都是同时存在的,倘若一个目录只有读权限,那就是耍流氓,知道有,看不了;倘若只有执行权限,那就是特供情报,虽然“没有”,但是能查看…