Linux一一第六章、文件与目录管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuanyin235/article/details/83026271

主要介绍进一步操作与管理文件及目录,包括在不同的目录间变换、创建与删除目录、创建与删除文件,还有寻找文件、查阅文件内容等等。

6.1 目录与路径

6.1.1 相对路径与绝对路径

绝对路径:路径的写法“一定由根目录/写起”,例如:/usr/share/doc这个目录

       如果是在写程序(shell scripts)来管理系统的情况下,务必使用绝对路径的写法。

绝对路径:路径的写法不是“不是由/写起”,例如由/usr/share/doc要到/usr/share/man下面时,可以写成:"cd ../man"这就是相对路径的写法,相对路径意指“相对于目前工作目录的路径!”

       相对路径在访问同级目录时显得更为方便。

6.1.2 目录的相关操作

注意:在所有目录下面都会存在的两个目录,分别是"."和".."分别代表此层与上层目录的意思。

根目录存在上述两个目录,另外我们发现根目录的上一层(..)与根目录自己(.)是同一个目录,如下所示:

目录操作的几个指令:

相应实例:

6.1.3 关于可执行文件路径的变量:$PATH

我们用指令来看一下不同身份下的环境变量PATH

6.2 文件与目录管理

6.2.1 文件与目录的检视:ls

推荐一个Linux命令查询网址:http://man.linuxde.net/

6.2.2 复制、删除与移动:cp,rm,mv

cp(复制文件或目录)

示例:

那个 -l 就是所谓的实体链接(hard link) ,至于 -s 则是符号链接(symbolic link) , 简单来说,bashrc_slink 是一个“捷径”,这个捷径会链接到bashrc去!所以你会看到文件名右侧会有个指向(->) 的符号!

例题:你能否使用 dmtsai 的身份,完整的复制/var/log/wtmp文件到/tmp下面,并更名为
dmtsai_wtmp呢?答:实际做看看的结果如下:

由于 dmtsai 的身份并不能随意修改文件的拥有者与群组,因此虽然能够复制wtmp的相关权限与时间等属性, 但是与拥有者、群组相关的,原本 dmtsai 身份无法进行的动作,即使加上 -a 选项,也是无法达成完整复制权限的!

复制时需要了解清楚以下问题:

       是否需要完整的保留来源文件的信息?
       来源文件是否为链接文件 (symbolic link file) ?
       来源文件是否为特殊的文件,例如 FIFO, socket 等?
       来源文件是否为目录?

 

rm(移除文件或目录)

mv(移动文件与目录,或更名)

6.2.3 取得路径的文件名称与目录名称

6.3 文件内容查阅

6.3.1 直接检视文件内容

可以使用cat/tac/nl这几个指令

6.3.2 可翻页检视

前面提到的nl与cat,tac等等,都是一次性的将数据一口气显示到屏幕上面,如果我们想一页一页观察数据,应该使用more与less

more(一页一页翻动)

比如我们要查看/etc/man_db.conf这个文件,可以如下操作:

在more这个程序的运行过程中,以下几个按键可以按的:

less(一页一页翻动)

less的用法比more更加有弹性:在more的时候,我们并没有办法向前翻,只能往后面翻,但若使用了less,就可以使用[pageup][pagedown]等按键功能来往前往后翻看文件。另外less不止可以向下搜寻,也可以向上搜寻。

空白键:向下翻动一页

6.3.3 数据攫取

取出前面几行(head)或后面几行(tail)文字的功能,不过需要注意的是,head与tail都是以“行”为单位来进行数据攫取的。

head(取出前面几行)

tail(取出后面几行)

6.3.4 非纯文本文件:od

之前上面指令都是查阅纯文本文件,对于非纯文本文件,由于可执行文件通常是binary file,使用上面的指令读取会出现乱码,我们需要使用od这个指令来读取。

6.3.5 修改文件时间或创建新文件:touch

三个主要的变动时间:

例如,我们需要查看/etc/man_db.conf这个文件的时间

默认情况下显示出来的是mtime

touch命令有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来;二是用来创建新的空文件。

其中"ll"等同于"ls -l"

至于执行的结果当中,我们可以发现数据的内容与属性是被复制过来的,因此文件内容时间(mtime) 与原本文件相同。 但是由于这个文件是刚刚被创建的,因此状态(ctime) 就变成现在的时间啦!那如果你想要变更这个文件的时间呢?可以这样做:

6.4 文件与目录的默认权限与隐藏权限

6.4.1 文件默认权限:umask

0002:第一组是特殊权限用的,后面三组表示权限,以符号形式出现,002对于文件代表664,则表示为rw-rw-r--,对于目录代表775,则表示rwx,rwx,r-x

umask的利用与重要性:专题制作

从上面我们看到一般用户的默认权限是002,那么root用户的权限是多少?我们通过运行发现是022,这样做是基于安全的考虑。

另外修改umask直接用来设置新建文件的权限,如下所示:

6.4.2 文件隐藏属性

除了基本r, w, x权限外,在Linux传统的Ext2/Ext3/Ext4文件系统下,我们还可以设置其他的系统隐藏属性, 这部份可使用 chattr 来设置,而以 lsattr 来查看,最重要的属性就是可以设置其不可修改的特性!让连文件的拥有者都不能进行修改! 这个属性可是相当重要的,尤其是在安全机制上面 (security) !比较可惜的是,在 CentOS 7.x 当中利用 xfs 作为默认文件系统, 但是 xfs 就没有支持所有的 chattr 的参数了!仅有部份参数还有支持而已!

chattr(设置文件隐藏属性)

lsattr (显示文件隐藏属性)

6.4.3 文件特殊权限:SUID,SGID,SBIT

我们查看如下文件权限:

发现除了rwx权限外还有s,t权限,这就是我们将要介绍的:

Set UID

举例:比如我们查看账户记录密码的文件/etc/shadow,如下所示:

我们发现这个文件仅有root可读且仅有root可以强制写入,那么如果一般用户是否可以修改自己的密码呢?答案是可以的,就是因为SUID的功能,我们可以查看/usr/bin/passwd这个程序的权限:

我们发现它拥有s这个权限,所以它在执行的过程中可以“暂时”获得root的权限,这样/etc/shadow就可以被一般用户jack所执行的passwd所修改。

对比cat指令,我们可以查看cat能否读取/etc/shadow,即读取密码,发现是不可以的,如下,cat指令不具有s权限:

两者过程示意图如下:

注意:SUID仅可用在binary program上,不能够用在shell script上面!

       这是因为 shellscript 只是将很多的 binary 可执行文件叫进来执行而已!所以 SUID 的权限部分,还是得要看shell script 调用进来的程序的设置, 而不是 shell script 本身。当然,SUID 对于目录也是无效的~这点要特别留意
 

Set GID

当s标志在文件拥有者的x项目为SUID,那s在群组的x时则称为Set GID

比如下面文件:

与 SUID 不同的是,SGID 可以针对文件或目录来设置!如果是对文件来说, SGID 有如下的功能:
      SGID 对二进制程序有用;
      程序执行者对于该程序来说,需具备 x 的权限;
      执行者在执行的过程中将会获得该程序群组的支持!

举例来说,上面的 /usr/bin/locate 这个程序可以去搜寻 /var/lib/mlocate/mlocate.db 这个文件的内容 (详细说明会在下节讲述) , mlocate.db 的权限如下:

与 SUID 非常的类似,若我使用 dmtsai 这个帐号去执行 locate 时,那 dmtsai 将会取得slocate 群组的支持, 因此就能够去读取 mlocate.db 啦!

当一个目录设置了 SGID 的权限后,他将具有如下的功能:
       使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
       使用者在此目录下的有效群组(effective group) 将会变成该目录的群组;
       用途:若使用者在此目录下具有 w 的权限(可以新建文件) ,则使用者所创建的新文件,该新文件的群组与此目录的群组相同


Sticky Bit
这个 Sticky Bit, SBIT 目前只针对目录有效,对于文件已经没有效果了。SBIT 对于目录的作用是:
        当使用者对于此目录具有 w, x 权限,亦即具有写入的权限时;
        当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件

换句话说:当甲这个使用者于 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示“甲使用者对该目录内任何人创建的目录或文件均可进行 "删除/更名/搬移" 等动作。” 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。
 

举例来说,我们的 /tmp 本身的权限是“drwxrwxrwt”, 在这样的权限内容下,任何人都可以在/tmp 内新增、修改文件,但仅有该文件/目录创建者与 root 能够删除自己的目录或文件。这个特性也是挺重要的啊!

你可以这样做个简单的测试:
1. 以 root 登陆系统,并且进入 /tmp 当中;
2. touch test,并且更改 test 权限成为 777 ;
3. 以一般使用者登陆,并进入 /tmp;
4. 尝试删除 test 这个文件!
测试如下,我们发现不能删除test这个文件,提示没有权限。

我们已经知道数字体态更改权限的方式为“三个数字”的组合, 那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了!
4 为 SUID
2 为 SGID
1 为 SBIT
假设要将一个文件权限改为“-rwsr-xr-x”时,由于 s 在使用者权限中,所以是 SUID ,因此,在原先的 755 之前还要加上 4 ,也就是:“ chmod 4755 filename ”来设置!

6.4.4 观察文件类型:file

如果想知道某个文件的基本数据,例如是属于ASCII或者是data文件,或者是binary,且其中有没有使用到动态链接库(share library)等等的信息,就可以利用file这个指令来检阅。

6.5 指令与文件的搜寻

6.5.1 指令文件名的搜寻

which(寻找“可执行文件”)

6.5.2 文件文件名的搜寻

一般我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻呦! 为什么呢?因为 whereis 只找系统中某些特定目录下面的文件而已,locate 则是利用数据库来搜寻文件名,当然两者就相当的快速, 并且没有实际的搜寻硬盘内的文件系统状态,比较省时间啦!

whereis(由一些特定的目录中寻找文件文件名)

whereis 主要是针对 /bin /sbin 下面的可执行文件, 以及 /usr/share/man 下面的 man page 文件,跟几个比较特定的目录来处理而已。所以速度当然快的多!不过,就有某些文件是你找不到的啦! 想要知道 whereis 到底查了多少目录?可以使用 whereis -l 来确认一下即可!

locate/updatedb

存在限制:当你新建起来的文件,却还在数据库更新之前搜寻该文件,那么locate会告诉你找不到,这个时候就需要手动更新数据库:执行updatedb指令。

updatedb:根据 /etc/updatedb.conf 的设置去搜寻系统硬盘内的文件名,并更新/var/lib/mlocate 内的数据库文件;
locate:依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字文件名。
 

find

其他find的用法:

6.6 极重要的复习:权限与指令间的关系

6.7 重点回顾

猜你喜欢

转载自blog.csdn.net/xuanyin235/article/details/83026271