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:
流程如下:
二、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中。
即,二号文件重定向到一号文件指向的位置。
管道则是对前面文件的输出内容作为后一个的输入内容: