文件是什么和文件权限的简单理解
首先我们要知道对于Linux中的文件而言一个文件 = 属性+内容。
并且对于一个操作系统的使用人员而言,一个文件具有三种权限,分别是可读,可写,可执行。并且操作系统对于每一个用户(除了root权限)对于一个文件而言会倍分成不同的组。对于文件的创建者而言,Linux会将这个用户设置为拥有者(Owner),对于和创建者同一组的人都会被认为是同一个所属组(Group),而除了所属组之外的所有用户,对于这个文件而言都是Other。
那么随机创建一个Linux的.c文件
可以看到这里我创建了一个test.c文件那么对于Owner而言对于这个test.c文件Owner具有可读和可写的权限,对于所属组成员而言一样是具有可读和可写权限的,但是对于Other而言只具有可读的权限。
Linux中的文件类型
其中除了第一个字符代表的是文件的类型,如果这个文件的第一个字符为_,那么代表这就是一个普通的文件,在Linux中源文件,源代码,可执行程序库等等都是普通文件。如果第一个开头字符为d代表这就是一个目录文件,如果第一个字符为c那这个文件为字符设备文件,b开头为块设备文件,l开头为链接文件,p开头为管道文件。首先显示器就是一个字符设备,为什么显示器是一个字符设备呢?首先如果我们想在显示器上显示一个123,其实在计算机底层是将字符123,给显示了出来。这也是为什么在c中要使用printf(格式化输出)来输出结果。这也是为什么显示器叫字符设备。一样以c中的输入为例子,假设我要给一个整型的int赋值,那么我首先要在键盘上输入我想要赋的值。但是通过键盘输入进去的其实是我想要值得字符版本,经过scanf(格式化输入)才转变成了int。那么为什么要将键盘和显示器例子呢?不要忘记了在Linux中一切皆文件,那么对于Linux而言显示器和键盘也是一个文件,它们就是字符设备文件。
这个文件得作用我暂时只知道一个那就是当你使用一个新用户登录到我的linux服务器上时,就会在
/dev/pts
这个文件中出现一个新的字符设备文件如果通过输出重定向往这个字符设备中传输文件,那么对应这个字符设备的用户显示器上就会显示你所输出的内容。其实对于这个文件还有其它的作用,但是我暂时还未学到所以就不继续写了。
那么什么是块设备文件呢?对于Linux而言,计算机中的磁盘,分区等都是块设备文件。
那么什么是链接文件呢?对于Linux而言,和windows一样的快捷方式就是一个链接文件。这个文件的作用就是能够让用户快速的打开某些文件,和windows中的快捷方式一样。
例如下面这种就是一个链接文件
最后以p开头的文件是管道文件,对于这个文件我现在了解还较少也就不写了。
那么除了第一个字符以外剩下的九个字符代表的就是拥有者,所属组和other所拥有的权限,
依旧以这个文件为例字,第一个字符代表这是一个普通文件,而rw-代表对于这个文件而言拥有者所具有的权限为可读可写,对于所属组而言为rw-代表所属组拥有的权限也是可读可写,对于other而言为r--代表对于other而言这个文件他只能读取。
那么对于Owner而言是可以改变一个文件的权限的。
改变文件权限的方法一
第一种改变文件权限的方法是使用chmod指令。下面我会使用这个指令去改变这个文件的可执行权限。当然是对于Owner而言。
chmod u+x test.c
那么在执行完这个指令之后,这个test.c文件的对于拥有者而言就增加了x权限。
那么如果我想让这个test.c文件对于拥有者而言去掉x和wr权限,那么可以执行下面的指令。
chmod u-rwx test.c
如果我想要让这个文件加上rw权限就需要执行下面的指令
chmod u+rw test.c
如果你需要改所属组的权限那就要将chmod 后面的那个字符改为g,如果想要修改所属组的权限那就需要将chmod后面的那个字符改为o。下面来详细解释不同权限的作用。至于这三种权限的作用和文件夹的权限不同,对于文件夹而言r权限如果没有那么在进入到文件夹里面之后,无法使用ls指令。对于一个普通文文件而言如果没有读权限,对应权限的用户就无法查看这个文件的内容。对于文件夹而言如果没有w权限,那么对应权限的用户就无法在文件夹中创建文件。对于普通文件而言,对应权限的用户就无法往文件中输入内容。对于文件夹而言如果没有x权限那么对应权限的用户就无法进入到这个文件夹中,对于普通文件而言没有没有x权限那么就无法执行这个文件,这个文件权限对于某些文件而言是非必须的。
当然如果你需要一次性去除所有用户的读写权限
那就使用下面的指令
chmod a-r test
当然对于一个文件只有文件的拥有者或者是root账号才有资格去修改一个文件不同用户的权限,对于other而言是没办法修改这个文件的。
还存在一个点,对于一个test文件如果我将这个文件拥有者的rw权限都删除了,但是所属组的rw权限都是留存的,在这种情况下对于文件拥有者而言还是不能打开这个文件,但是为什么呢?按照我们自己的理解虽然我将拥有者的读写权限都删除了,但是我拥有者应该还是存在于所属组中的啊,应该也可以继续打开这个文件啊。造成这个现象的原因是文件在匹配对应用户身份的时候,通常只会匹配一次。所以一个用户是只存在一种身份的不存在拥有多个身份的用户。
通过下面的指令后对于test文件所有用户的读权限就被删除了。
改变文件权限的方法二
依旧是这个例子我们来看属于拥有者的那三个权限表示
拥有者所具备权限是rw-那么如果将这三个字符所在的位置看作是一个01的二进制数串。存在权限看作是1不存在看作是0,那么这个文件对于拥有者他的权限就可以表示为110。同理对于所属组和other而言一样也可以使用这个方法表示他的权限。分别是110以及100。那么将这个文件对应的所有的权限都使用这个方法表示出来就可以得到一个二进制串。110110100然后对于每一个数都将其转化为8进制数字就变成了664。这也就是这个数既然使用3个八进制的数字,能够将一个文件的所有权限都表示清楚那么自然也就可以通过修改这个八进制的数子来达到修改权限的目的。
可以看到在我使用777来修改test.c之后test.c的文件权限就变成了全存在。如果你使用下面的指令:
chmod 666 <任意文件名>
那么所对应的那个文件的所有人的读写权限就全部存在了。如果你输入的是000那么这个文件的所有权限都会被删除。
权限掩码的作用
首先我们来比较一下,当我们新创建一个文件夹或是普通的文件时,这个文件夹或是普通文件的默认权限是什么。
可以看到对于文件夹而言默认权限为775,而一个普通文件664。那么这是为什么呢?为什么默认权限是775和664呢?在这里我们要知道对于文件夹而言他在一开始创建时的文件权限应该是777,而普通文件的起始权限为666。那么为什么我们创建的新的文件夹或是普通文件的默认权限为775和664呢?因为在Linux系统中存在一个权限掩码,对于Linux中的文件/文件夹而言最终的权限 = 默认的权限+删除权限掩码中存在的权限(如果默认权限中对应权限掩码中要删除的权限已经是0了,那就不要去处理这个0)。
在Linux中使用umask就可以查看当前系统的权限掩码。
可以看到我的系统中此时的权限掩码为0002其中第一个0不用管,后面的002是一个八进制数,将其转化为二进制数也就是000000010,这也就意味着我下面创建的文件中other的w权限都要将其删除。
以文件夹为例当111 111 111 当去除掉倒数第二个1之后就变成了111 111 101也就变成了,775。同样对于普通文件也是这样,普通文件的默认权限为110 110 110 当将倒数第二个1去除之后,也就变成了110 110 100也就是664,那么如何计算的呢?也很简单就是使用文件的默认初始化权限(文件夹为777)&~(文件掩码)【这里是对权限掩码的取反】。
修改文件的拥有者
如果我要将一个文件的拥有者(我自己现在是拥有者)修改了,那么可以使用chown来修改一个文件的拥有者权限。但是如果我要将一个文件给别人是需要别人的同意的。但是在现实生活中这未免会有不便捷的情况出现。那么为了避免这个情况我们就可以使用sudo来对我们自己的chown命令进行提权。
sudo chown root test.c
然后系统会提示你输入自己的密码,记住是自己的密码而不是root密码。输入成功后就会将这个命令进行提权,强行将这个文件的拥有者改为root,但是对于一个新创建的用户,会出现你输入了自己的密码,但是任然无法修改的情况,因为对于新创建的用户,Linux系统并没有将这个用户纳入到信任列表。对于不存在于信任列表的人,是无法执行sudo命令的。
要将新加入的用户增加到信任列表,可以按照以下步骤进行操作:
- 使用root用户登录到Linux系统。
- 打开终端,并切换到root用户的家目录下。
- 编辑信任列表文件,一般是/etc/sudoers文件,可以使用以下命令进行编辑:
vim sudoers
- 在打开的文件中,找到以"# User privilege specification"开头的部分。
- 在该部分下方添加一行,格式为:
username(新增加的用户的名字) ALL=(ALL) ALL
其中,username是要增加到信任列表的用户名。
- 保存文件并退出编辑器。
- 确认新用户已经被添加到信任列表中,可以使用以下命令进行确认:
sudo -l -U username
其中,username是要确认的用户名。
现在,新加入的用户已经被添加到信任列表中,可以使用sudo命令执行需要特权的操作
在修改完这些之后,就能够使用sudo去提权命令了。
Linux中的shell外壳
Linux的shell是一种命令行解释器,它是用户与操作系统内核进行交互的界面。Shell接受用户输入的命令,并将其转化为操作系统内核能够理解和执行的指令。它还提供了一些内置的命令和功能,用于管理文件、运行程序、设置环境变量等。
Linux中常见的shell有多种,其中最常用的是Bash(Bourne Again SHell)。Bash是GNU项目的一部分,它是Bourne shell的增强版本,提供了更多的功能和特性。除了Bash,还有其他一些常见的shell,如Csh、Ksh、Tcsh等。
Shell具有以下特点和功能:
- 命令行解释器:Shell通过命令行接受用户输入的命令,并将其解释为操作系统内核能够执行的指令。
- 脚本语言:Shell可以编写脚本,将多个命令组合在一起,实现复杂的操作和自动化任务。
- 管道和重定向:Shell支持管道和重定向操作,可以将一个命令的输出作为另一个命令的输入,或将命令的输出重定向到文件中。
- 变量和环境变量:Shell支持定义和使用变量,以及设置环境变量,用于存储和传递数据。
- 条件和循环:Shell提供了条件语句(如if、case)和循环语句(如for、while),可以根据条件执行不同的操作,或者重复执行一组命令。
- 命令补全和历史记录:Shell具有命令补全和历史记录功能,可以提供命令的自动补全和查看历史执行命令的能力。
总之,Linux的shell是一种强大的命令行解释器,提供了丰富的功能和特性,使用户能够方便地与操作系统进行交互和管理。总结而言shell外壳能够代替我们去和Linux的内核进行交流,这样既能保护Linux内核(因为可能会有一些无意义或是错误的命令),也能解决我们不善于和Linux内核打交道的问题。
对于Linux我也是刚开始学习,写的不好,如果存在任何错误,欢迎指出。