Linux下有两种用户,一种是超级用户root(只有一个超级用户),其它的为普通用户(很多)。两种用户的权限不同,root的权限更大,一般情况下root甚至不受权限的限制。
为什么要有身份切换的概念?
例如普通用户的一些权限被限制,而超级用户的权限是不被限制的,这时我们可通过身份切换去完成我们想做的事情。
通过指令 su 可以对身份进行任意切换。
由普通用户变为超级用户
要想由完成这种身份切换我们还需要root的密码才可以,另外我们这里看到即使身份切换了,但是它所处的目录仍是原目录,这时因为这种切换只是暂时的去让你有能力做超级用户能做的事情。
由超级用户变为普通用户
这里可以看到由超级用户变为普通用户的时候甚至都不需要密码,这种方式只是暂时的让用户身份切换,要想退出时可通过Ctrl+d或者输入exit进行退出,返回到原身份。
普通用户转到另一个普通用户
su和su -是有区别的
su指令
我们可以看到su之后还是在原家目录,su-之后家目录也发生改变了
为什么要对文件访问者分类?
因为对于文件创建者而言,他希望这个文件可以被一部分人看到,又不想让另一部分人看到。这样文件的访问者就被分为了三类,一类是文件创建者我们称他为所有者—user,对于不想让看到的那部分被称为其他用户----other,对于想让看到的那部分人被称为用户组----group。
我们接下来对上面显示出来的参数进行讲解
第一个字符表示的是文件类型,上面的-和d是两种常见的文件类型,-代表的是普通文件,d代表的是目录文件,除此之外还有管道文件,字符设备文件(例如屏幕等串口设备),软链接(类似Windows的快捷方式),等文件类型。
我们重点要了解的是后面的9个字符的含义,这9个字符三三为一组分别代表的是拥有者,所属组,其他人的权限。
我们以文件test1.c为例
它的9个字符为rw-rw-r–,三三为一组也就是拥有者的权限为1-3个字符rw-,所属组的权限为rw-,其他人的权限为r–,现在我们知道了这些访问者的权限,那么这些字符分别代表什么意思呢?
r代表的是read就是功能读,w代表的是write就是写,我们看到目录d1中还有个x权限这个就是execute表示访问者可以运行这个文件,相反对应的-就是不可读或不可写或不可运行。
文件test1.c拥有者对应的权限为rw-就表示可读可写不可运行,所属组权限为rw-也表示可读可写不可运行,其他人权限为r–表示可读不可写不可运行。
后面的2,1暂时不考虑。
接下来我们看后面的两个参数为Linux1 Linux1,第一个参数表示的是这个文件的拥有者是谁,第二个表示这个文件的所属组有谁。你可能会好奇为什么这里没有其他人,因为其它人太多了,除了拥有者和所属组之外的都是其他人,所属组也可以有多个但是有限。
后面的参数就是文件大小,最近一次修改的时间以及文件名。
上面我们初步了解了权限,那么对于这些权限要怎么修改呢?
1.通过指令chmod对文件的访问权限进行修改
后面有两个参数第一个为对应的访问者+或-某一个权限,第二个为要被修改文件
上面的u+x就是给拥有者加上可以运行的权限
给所属组去掉写权限
给其他人加上写权限
解释一下对应字母的含义u,g,o就是user,group,other对应的字母开头,然后通过chmod指令对这三个访问者权限进行去修改。
除了通过上述方式还有可以通过二进制的方式来对文件的权限进行修改,对于权限就两种可能要么有要么没有,那么我们此时就可以通过二进制的0或1来表示对应的访问者是否有权限。
因为权限对应的字符三三为一组对应的二进制返回就是0-7,上述中第一位数字7就是拥有者对应的二进制111,表示可读可写可运行,6表示所属组对应二进制为110,表示所属组成员可读可写不可运行,5对应二进制011表示其他人不可读可写可运行。
除了有上述需求外又是后我们还需要对这个文件的拥有者,所属组身份进行修改进行,例如要把test1.c的拥有者改为Linux2要怎么修改呢?
2.修改拥有者的指令chown和修改所属组的指令chgrp
把这个文件或目录给别人是要征求别人同意的,所以我们只能通过root来强制给,我自己是给不了的
此时就完成了对d1拥有者和d2所属组的更改,改成了Linux2。
先给出结论:
读®:Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
写(w):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
执行(x):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
接下来我们一一进行解释:
要想进入目录就要有x权限,你可能会有疑问x权限不是是否执行权限吗?对于普通文件来说确实是这个文件是否可以执行,但是对于目录来说,目录里面放的文件,是目录不可以被执行的,所以目录中的x就是代表用户是否可以进入该目录。
此时用户Linux1不具有进入该目录的权限
对用户Linux1执行+x之后,我们可以看到它就可以进入该目录了,但是只是可以进入该目录,我们并不能查看目录中有哪些文件。
进入该目录还不够我还想看看目录下的文件要具有什么权限呢?
对目录执行+r指令之后我们进入目录执行ll指令就可以查看该目录下的文件了。
此时我们想要在该目录下对文件进行删除、创建和移动是否可以呢?
我们可以看到此时并不可以对目录下的文件进行删除,移动以及创建新文件,但是可以对文件进行拷贝。
要给目录什么权限才可以做到上述操作呢?
此时可以看到对目录执行+w写的权限之后,就可以对目录下的文件进行删除,移动以及创建新文件。
我们先去掉文件的所有权限,以便于我们接下来观察验证
查看文件内容
此时并没有查看文件内容的权限,那么由谁来决定用户是否有权限查看呢?
只需给当前用户加上读权限r就可以了
读了还不够我还想对文件内容进行写入或者修改
只需加上写权限w即可
给test.c也加上读写权限方便用来验证是否可以被执行权限
是否可以被编译执行
生成了可执行文件a.out
为什么test.txt加上可执行权限之后没有生成可执行文件?
是和文件后缀有关吗?不是说Linux下是否可以被执行与后缀名没有关系吗?
Linux下确实是这样,但是我们这里用的是gcc编译器,对于Linux中的编译软件还是要看后缀的。
大多数情况下我们只是想把文件分享给别人看,但是不想让他有删除这个文件的权利,要怎么办呢?
上面在演示验证时给了其他用户进入Linux1这个用户的目录和查看目录下文件的权限,现在我们把它恢复,因为在一般情况下我们不能轻易地对用户目录的权限进行修改。
改回正常状态时,你会发现现在Linux2连进入Linux1目录的权限都没有了,又何谈共享呢?
要想实现文件的共享就不能让这个文件在某一个用户的目录下,我们这里选择在root用户的根目录下创建一个共享目录,并且它会默认其它普通用户对这个目录有进入和查看文件的权限。
为了更大限度的让这个目录下的文件进行共享我们把这个目录的权限进行全部公开
**注意家目录和根目录的区别。**家目录是根目录下面的目录。家目录就是普通用户的家目录,家目录都是由根目录创建的。
因为是共享目录且其他用户对它都有rwx权限,所以然后其中一个用户在这个目录下创建共享文件,其它用户也可以对这个文件进行访问。
普通用户Linux1访问根目录的的shared目录在其下创建一个普通文件
在另一个普通用户中进行访问共享目录
此时我们会发现一个问题,Linux2不仅能够访问Linux1在根目录中创建的共享文件,而且还能删除它,因为它对shared目录有写权限,所以可以删除目录下的文件,即使这个文件是对其用户没有读权限的,因为是否能删除这个文件并不由文件本身决定而是由它所处的目录的写权限决定。我们显然是不想让这种情况发生的,那么要怎么解决这个问题呢?
如果我们把目录的写权限去掉,别人确实是不能删除了,但是这也使得我不能在这个共享目录下创建文件了。
我们可以通过粘滞位来解决这个问题:
修改共享目录的权限
此时用户Linux2不能对Linux1在共享目录下创建的文件进行删除和修改了,但是可以查看
这个权限t就叫做粘滞位
粘滞位:一般是共享目录,用户可以在目录下对各自创建的文件进行增删改查,只允许文件拥有者或者root删除这个文件,其他人都不被允许,t是一种特殊的x权限。
你有没有想过为什么新创建的目录和文件都有它的权限,且权限还不一样
目录:rwxrwxr-x 0775
文件:rw-rw-r-- 0664
新建目录的默认权限为:0777
新建文件的默认权限为:0666
掩码为0002
展开就是0000000001对应拥有者、所属组和其它用户的权限
在创建文件时我们要求掩码值不能不出现在新创建的目录或文件的权限中
举例目录权限0777是怎么变为0775的
假设默认权限是mask(这里的目录就是0777),则实际创建的出来的文件权限是:
mask & (~umask) (默认掩码umask这里为0002)
umask先按位取反再和mask进行按位与运算符操作
~0002 = 1 111111101(0 = 000,2 = 010)
1 111111101 & 0111111111 = 0 111111101 = 0775
umask可以修改但是不建议
修改: