【LINUX】【北邮】第七章 文件和目录权限、shell的基本机制

LINUX第七章 文件和目录权限、shell的基本机制

一、文件和目录权限

文件的权限:

文件的权限是用于控制进程对系统中的文件和目录的访问。权限中的写很特殊:不可写但是可以被删除。因为删除文件并不需要写文件。
在这里插入图片描述
可执行文件一般分为两类:程序文件和脚本文件。程序文件实际上就是CPU指令的集合,例如现在使用的LS等命令实际上就是一些可执行文件。脚本文件存的不是指令,那CPU就不能执行。具体运行的时候是每读取一行就进行一次解释
在这里插入图片描述

目录的权限

写权限指的是文件的内容可不可写,而非文件可不可写。例如在目录中添加文件是不允许的,但是更改具体文件的内容是可行的。
在这里插入图片描述
目录有执行权限是在于分析路径名中可以检索该目录。
在这里插入图片描述
粘着位(sticky),对常驻的、重要的文件需要加粘着位提高效率,但是现在不经常使用。而在目录中则更重要:对于公共目录,如果用户1和2都不能写,那就无法创建新文件,则用户体验很差;如果都有写权限,则可能导致用户之间删除彼此的文件,而被删除的文件的主人并不希望这样的事情发生。因此创建了目录的粘着位,即只允许文件主人对自己的目录下的文件进行修改,而不允许其他用户修改。
在这里插入图片描述
对文件和目录权限的验证,LINUX采取了如下的内容进行操作。例中的含义是,文件权限为文件主人不可读不可写不可执行,但同组用户可读,这似乎是不太符合情理的,但是这仍然是成立的。即,如果uid和gid对应时,只看文件主人的权限。
在这里插入图片描述

权限相关命令

(1)ls命令
ls -l 可以查询当前目录下所有文件和子目录的权限
ls -ld 中的d是现实当前目录中的权限,例如ls -ld . 是列出‘.’这个目录的权限,而非目录内的权限。
(2) chmod 更改权限
分两组形式,字母形式和数字形式
在这里插入图片描述
其中的±=就是加上、减去的意思,例如第一个例子,就是对所有的c语言源程序文件,同组和其他用户都不可读、不可写、不可执行。第二个则是对batch文件,对所有用户均可执行。
在这里插入图片描述
(3)umask:控制文件/目录的初始权限
例如使用vi、重定向创建文件,或者创建新目录,umask则是针对这些新创建文件的权限。
在这里插入图片描述
umask指令还可以加上数字进行执行:umask 022,022换成二进制为000 010 010 即创建的文件或者目录的同组和其他用户的读权限。若为umask 077,则是000 111 111,即屏蔽掉组和其他用户的所有权限。一般会将umask放到shell的自动批处理文件中,例如profile文件,这样在启动的时候就可以自动对创建的新文件、新目录设置初始权限。当然,打开新文件时的权限则受到open和umask的两次制约:
在这里插入图片描述

修改文件和目录的权限

本部分内容是对上述命令的实操:其中的>是创建文件,而>>则是追加内容,即写文件。
在这里插入图片描述
这里的目录写权限仅针对目录项(考虑一下inode表),而对目录中的文件进行操作则是无关的。例如可以向目录中的文件进行写操作。覆盖的操作也是如此。
在这里插入图片描述
chmod 755 .是不可行的,因为需要读取当前目录 . 文件,而当前没有读的权限,故不可访问。可以从home目录进行访问。
在这里插入图片描述
在这里插入图片描述

SUID

通过上面的学习,我们知道,如果一个用户对文件内容的访问,要么全部都有权限,要么就无法访问。在有的情况下不方便。例如一张表,包含了很多人的信息,但此时我只想让每个人可以访问每个人的信息,而不能看到和修改他人的信息,此时就很难办到。如果将很多人的信息都分成不同的文件,对操作者来说有十分琐碎和不便于管理。
例如:
在这里插入图片描述
此时的解决方法就是,操作系统提供接口,而具体如何划分的规则则由用户来制定。
在这里插入图片描述
即操作者增加了query文件,该文件包含了如何读取的规则,且该文件其他用户可以执行,因此其他用户可以提供执行该文件得到类似于文件主人的权限。
UID用来进行权限判断。
在这里插入图片描述
例如现在给出一段程序query.c:
在这里插入图片描述
流程如下:ss在这里插入图片描述

二、shell的基本机制

关于shell

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

输入重定向

输入重定向分为三种:<,<<,<<<.
< filename:
从后面所给的文件得到内容输入。例如:
sort < file.txt 即将file.txt的内容作为输入给sort命令。
<< word:
从shell脚本文件中获取数据,知道再次遇到定界符end。例如下面的程序,shell脚本中的定界符为TOAST,则执行后将其中的内容输入cat直到遇到定界符位置。也可以看到,后面的pwd并没有被输入进cat,也就说明了定界符的作用。
在这里插入图片描述
如果不希望将shell脚本内的内容用变量等方式替换,则给定界符加单引号。
在这里插入图片描述

<<<:
从命令行获取信息作为标准输入。例如:
cat <<< 114514,那么键盘输入的114514就是作为cat命令的输入。

输出重定向和管道

标准输入和输出的句柄如下:
在这里插入图片描述
注意,以下两种方式都是对标准输出stdout的输出,而不是stderr。
在这里插入图片描述

对于标准错误流的输出也有两种方式:这里的句柄2就是指标准错误流。
在这里插入图片描述
关于为什么设立标准错误流:处理数据时有可能会出错,我们希望出现的错误可以打印出来给使用者看,故设立了stderr。

实例
对于如下的一段程序:
在这里插入图片描述
运行结果为:从结果我们无法判断标准输出和标准错误。
在这里插入图片描述
但如果我们做重定向:

./stda > stda.out

得到的结果则为:

string2
string2
string2
...#循环十次

即,我们重定向得到的都是标准输出流的内容,而标准错误的内容没有得到重定向,则打印在屏幕上。然后我们通过两次重定向,分别定向到不同的文件,再使用cat命令进行查看,就可以得到下面的结果:

./stda > stda.out 2 > stda.err

在这里插入图片描述
对于将标准错误的内容重定向到文件中,有两种做法。以编译程序再将产生的错误重定向到文件中为例:

gcc try.c 2 > stda.err
#上面的写法,即将二号文件的内容进行重定向
gcc try.c > rpt 2>&1
#将1和2号文件均存在rpt中。

在这里插入图片描述
即,二号文件重定向到一号文件指向的位置。
管道则是对前面文件的输出内容作为后一个的输入内容:
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值