Linux(四):文件权限与目录配置

1. 介绍

linux是多用户多任务的系统,磁盘上的文件,如果想要保密,则需要设定文件的权限。linux文件的身份分为三类 owner/group/others,每个身份可以划分的权限有 read/write/execute

2. 文件属性

[root@study ~]# ls -al
total 48
dr-xr-x---.  5    root     root    4096  May 29 16:08 .
dr-xr-xr-x. 17    root     root    4096  May  4 17:56 ..
-rw-------.  1    root     root    1816  May  4 17:57 anaconda-ks.cfg
-rw-------.  1    root     root     927  Jun  2 11:27 .bash_history
-rw-r--r--.  1    root     root      18  Dec 29  2013 .bash_logout
-rw-r--r--.  1    root     root     176  Dec 29  2013 .bash_profile
-rw-r--r--.  1    root     root     176  Dec 29  2013 .bashrc
drwxr-xr-x.  3    root     root      17  May  6 00:14 .config                
drwx------.  3    root     root      24  May  4 17:59 .dbus
-rw-r--r--.  1    root     root    1864  May  4 18:01 initial-setup-ks.cfg   
[    1    ][  2 ][   3  ][  4 ][    5   ][    6     ] [       7          ]
[  权限   ][链接][拥有者][群组][文件大小][ 修改日期 ] [      文件名        ]

文件和目录都可以作为一个文件来看待,上面列出了文件的属性组成,包括类型,权限,群组等。

对于上面的权限操作,我们一共会涉及到 chgrp,chown,chmod三个命令,同时对于文件和目录的权限组成也是具有不同的作用。

查看文件的属性可以通过 ls命令,用这个命令的选项 -al列出所有文件的权限与属性。下面是一个详细的介绍:
在这里插入图片描述

  • 第一栏: 文件类型与权限
    在这里插入图片描述

    1. 这一栏一共有10个字符,第一个字符表示文件类型,比如目录,文件或者链接文件等

      d表示是目录

      **-**表示是文件

      l表示是链接

      b表示是设备文件中存储的一类,通常存在与/dev下面,表示硬盘这一类

      c表示是设备文件中的序列埠设备,例如键盘、鼠标(一次性读取设备)

    2. 接下来的字符,三个为一组,且是 rwx的组合,分别表示文件拥有者,群组和其他人对文件的权限操作。

    • 第一组为“文件拥有者可具备的权限”,以“initial-setup-ks.cfg”那个文件为例, 该文件的拥有者可以读写,但不可执行;
    • 第二组为“加入此群组之帐号的权限”;
    • 第三组为“非本人且没有加入本群组之其他帐号的权限”
  • 第二栏: 多少文件名链接到此节点(i-node)

    每个文件都会将他的权限与属性记录到文件系统的i-node中,不过,我们使用的目录树却是使用文件名来记录, 因此每个文件名就会链接到一个i-node啰!这个属性记录的,就是有多少不同的文件名链接到相同的一个i-node号码去就是了。 关于i-node的相关数据我们会在第七章谈到文件系统时再加强介绍的。

  • 第三栏:这个文件或者目录的拥有者账号

  • 第四栏: 表示这个文件所属的群组
    在Linux系统下,你的帐号会加入于一个或多个的群组中。举刚刚我们提到的例子,class1, class2, class3均属于projecta这个群组,假设某个文件所属的群组为projecta,且该文件的权限如图5.2.2所示(-rwxrwx—), 则class1, class2, class3三人对于该文件都具有可读、可写、可执行的权限(看群组权限)。 但如果是不属于projecta的其他帐号,对于此文件就不具有任何权限了。

  • 第五栏为这个文件的容量大小,默认单位为Bytes;

  • 第六栏为这个文件的创建日期或者是最近的修改日期

  • 第七栏为这个文件的文件名

**例题:**假设test1, test2, test3同属于testgroup这个群组,如果有下面的两个文件,请说明两个文件的拥有者与其相关的权限为何?

-rw-r--r--  1 root     root          238 Jun 18 17:22 test.txt
-rwxr-xr--  1 test1    testgroup    5238 Jun 19 10:25 ping_tsai

**答:**文件text.txt的拥有者是root,群组是root,对于root用户,可以对文件进行读写操作,root群组的y用户只可以读取文件,文件不可以被执行。

​ 文件ping_tsai,可以被任何人读取到,能被text1用户和群组执行,但是修改只能是test1用户。

**例题:**承上一题如果我的目录为下面的样式,请问testgroup这个群组的成员与其他人(others)是否可以进入本目录?

drwxr-xr--   1 test1    testgroup    5238 Jun 19 10:25 groups/

答:groups的文件类型是d,即目录,该目录的权限是所有者可以读取文件目录,修改目录和进入目录,群组用户可以读取目录和进入目录,其他人只可以读取目录。

所以,群组用户可以进入目录,一般用户无法进入目录。

  • 文件拥有者test1[rwx]可以在本目录中进行任何工作;
  • 而testgroup这个群组[r-x]的帐号,例如test2, test3亦可以进入本目录进行工作,但是不能在本目录下进行写入的动作;
  • 至于other的权限中[r–]虽然有r ,但是由于没有x的权限,因此others的使用者,并不能进入此目录!

3.更改文件属性与权限

我们先介绍几个常用于群组、拥有者、各种身份的权限之修改的指令,如下所示:

  • chgrp: 改变文件所属于的群组
  • chown: 改变文件所属的所有者,也可以更改群组
  • chmod: 改变文件的权限。
-R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件、目录
     都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况。
1. chgrp

改变一个文件的群组是很简单的,但是必须是root身份更改,而且更改的群组是必须存在的。命令就是:

chgrp 群组名 文件名

范例:
[root@study ~]# chgrp users initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 root users 1864 May  4 18:01 initial-setup-ks.cfg
[root@study ~]# chgrp testing initial-setup-ks.cfg
chgrp: invalid group:  `testing' <== 发生错误讯息啰~找不到这个群组名~
2. chown

同样更改文件的所有者也是简单的,要求也是必须是root用户,并且存在要更改的用户,

chown 用户名 文件名或目录

范例:将 initial-setup-ks.cfg 的拥有者改为bin这个帐号:
[root@study ~]# chown bin initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 bin  users 1864 May  4 18:01 initial-setup-ks.cfg

范例:将 initial-setup-ks.cfg 的拥有者与群组改回为root:
[root@study ~]# chown root:root initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 root root 1864 May  4 18:01 initial-setup-ks.cfg

可以使用 用户名:群组名 来完成同时修改用户和群组,也可以用.代替用户名,只需要修改群组 的作用。

知道如何改变文件的群组与拥有者了,那么什么时候要使用chown或chgrp呢?

当我们复制文件给其他用户时,文件的属性和权限也会被一块复制的,因此就需要修改所有者和群组了。

cp a.txt b.txt  #复制a文件为b文件

#更改文件所有权,让user2用户享有所有权,user2在的群组是user
chown user2:user b.txt
3. chmod

我们通过chmod改变文件的权限,格式如下:

chmod 权限值  文件名

这里的权限制一共有两种设置方式:

  • 数字类型改变文件权限

    将对文件的权限操作,对应数字,将数字的和作为权限的设定,r=4,w=2, x=1,设定的指令就是:

    chmod xyz 文件或者目录
    选项与参数:
    xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
    -R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件都会变更
    

    举例就是:将text.txt所有的权限都进行启用:

    mahao@localhost ~]$ ll
    总用量 4
    -rw-------. 1 mahao mahao 137 12月 15 22:21 text.txt
    
    [mahao@localhost ~]$ chmod 770 text.txt #将文件设定为全权限,除了other
    [mahao@localhost ~]$ ls -al text.txt 
    -rwxrwx---. 1 mahao mahao 137 12月 15 22:21 text.txt
    

    通过数字的组合,我们就可以确定文件的权限,比如文件不让别人看到,就可以设定为 chmod 740, 如果要将该文件变成可可执行文件,并且不要让其他人修改此一文件的话, 那么就需要-rwxr-xr-x这样的权限,此时就得要下达:“ chmod 755 test.sh ”的指令啰!

  • 符号类型改变文件权限。

    权限设定是针对三种用户,u,g和o,所以,我们为这三个用户设定不同类型。么我们就可以借由u, g, o来代表三种身份的权限!此外, a 则代表 all 亦即全部的身份!那么读写的权限就可以写成r, w, x啰!也就是可以使用下面的方式来看:

    chmod u/g/o/a +/-/= r/w/x 文件或者目录
    

    设定text.txt文件为 -rwxr-xr--,即用户有所有权限,群组是不可修改,其他是只能读取。

    chmod u=rwx,g=rx,o=r text.txt
    

    假如我们要“设置”一个文件的权限成为“-rwxr-xr-x”时,基本上就是:

    chmod  u=rwx,go=rx  .bashrc #go是在一块的,指定两个身份
    

    如果我们不事先知道一个文件的属性,而采用追加或者减少权限的方式,则可以通过+/-1权限来实现;

    chmod u+x text.txt #给文件加上执行的权限
    
    chmod go-w text.txt  #减掉群组和其他人对文件的修改权
    
    chmod a+rx text.txt #给所有的用户添加上读取和执行权限。
    

    知道 +, -, = 的不同点了吗?对啦! + 与 – 的状态下,只要是没有指定到的项目,则该权限“不会被变动”, 例如上面的例子中,由于仅以 – 拿掉 x 则其他两个保持当时的值不变!

4. 更改目录权限与目录权限的意义

上面说到了,如何修改文件的权限,改变所属文件的群组或者用户等,目录的权限和所属者同样可以使用上面的三个命令,通过 chgrp改变群组,chown改变拥有者和群组,chmod改变权限。但是,权限对于文件和目录的限制是不同的。尤其是 x权限,这个是表示目录是否可以进入(cd可以进入到目录中),在文件中则表示是否可执行。

  • 1.权限对文件的重要性

    文件是实际含有数据的地方,包括一般文本文件、数据库内容档、二进制可可执行文件(binary program)等等。 因此,权限对于文件来说,他的意义是这样的:

    • **读(read):**可读取文本的内容
    • w(write): 可以编辑,新增和删除文件的内容,但不是删除文件,或者更改文件名
    • **x (execute) : ** 该文件是否用于可以被执行的权限。

    那个可读(r)代表读取文件内容是还好了解,那么可执行(x)呢?这里你就必须要小心啦! 因为在Windows下面一个文件是否具有执行的能力是借由“ 扩展名 ”来判断的, 例如:.exe, .bat, .com 等等,但是在Linux下面,我们的文件是否能被执行,则是借由是否具有“x”这个权限来决定的!跟文件名是没有绝对的关系的!

    至于最后一个w这个权限呢?当你对一个文件具有w权限时,你可以具有写入/编辑/新增/修改文件的内容的权限, 但并不具备有删除该文件本身的权限!对于文件的rwx来说, 主要都是针对“文件的内容”而言,与文件文件名的存在与否没有关系喔!因为文件记录的是实际的数据嘛!

  • 2.权限对目录的重要性

    文件是存储的实际的内容,而目录存储的则是文件们,存储的是他们的文件名清单;

    • **读(read contents in directory):**目录权限的读,则是读取的文件名,是针对ls命令的,通过这个ls,可以查看目录下的文件名,只是名字,不包括属性,那是x的权限。
    • 写 (modify contents of directory):,这个写的权限是更改目录中的文件,包括删除文件和修改文件名,但是不可以修改文件的内容。在复制文件的时候,需要指定被target目录写的权限。
    • **进入(access directory):**目录只是记录文件名而已,总不能拿来执行吧?没错!目录不可以被执行,目录的x代表的是使用者能否进入该目录成为工作目录的用途! 所谓的工作目录(work directory)就是你目前所在的目录啦!举例来说,当你登陆Linux时, 你所在的主文件夹就是你当下的工作目录。而变换目录的指令是“cd”(change directory)啰!

    汇总:

    元件内容rwx
    文件详细的数据读取文件的内容写入或者修改文件的内容执行文件的内容
    目录文件名读取到文件名列表重命名或者删除文件进入目录

    **例题:**有个目录的权限如下所示:

    drwxr--r--  3  root  root  4096   Jun 25 08:35   .ssh
    

    系统有个帐号名称为vbird,这个帐号并没有支持root群组,请问vbird对这个目录有何权限?是否可切换到此目录中?

    答: vbird对这个目录只可以读取到文件名,vbird权限是[r–],不可以切换到此目录,因为不具有x权限。

    上面这个例题中因为vbird具有r的权限,因为是r乍看之下好像就具有可以进入此目录的权限,其实那是错的。 能不能进入某一个目录,只与该目录的x权限有关啦!此外, 工作目录对于指令的执行是非常重要的,如果你在某目录下不具有x的权限, 那么你就无法切换到该目录下,也就无法执行该目录下的任何指令,即使你具有该目录的r或w的权限。 所以,如果具有某个目录的rw权限,但是more 目录/文件,rm 目录/文件都是无法实现的,这是因为工作目录。

    很多朋友在架设网站的时候都会卡在一些权限的设置上,他们开放目录数据给网际网络的任何人来浏览, 却只开放r的权限,如上面的范例所示那样,那样的结果就是导致网站服务器软件无法到该目录下读取文件(最多只能看到文件名), 最终用户总是无法正确的查阅到文件的内容(显示权限不足啊!)。要注意:要开放目录给任何人浏览时,应该至少也要给予r及x的权限,但w权限不可随便给! 为什么w不能随便给,我们来看下一个例子:

    **例题:**假设有个帐号名称为dmtsai,他的主文件夹在/home/dmtsai/,dmtsai对此目录具有[rwx]的权限。 若在此目录下有个名为the_root.data的文件,该文件的权限如下:

    -rwx------ 1 root  root  4365 Sep 19 23:20  the_root.data
    

    请问dmtsai对此文件的权限为何?可否删除此文件?答:如上所示,由于dmtsai对此文件来说是“others”的身份,因此这个文件他无法读、无法编辑也无法执行, 也就是说,他无法变动这个文件的内容就是了。

    但是由于这个文件在他的主文件夹下, 他在此目录下具有rwx的完整权限,因此对于the_root.data这个“文件名”来说,他是能够“删除”的! 结论就是,dmtsai这个用户能够删除the_root.data这个文件!

    案例:
    我们用root的身份在所有人都可以工作的/tmp目录中创建一个名为testing的目录, 该目录的权限为744且目录拥有者为root。另外,在testing目录下在创建一个空的文件, 文件名亦为testing。创建目录可用mkdir(make directory),创建空文件可用touch(下一章会说明)来处理。 所以过程如下所示:

    [root@study ~]# cd /tmp <==切换工作目录到/tmp
    [root@study tmp]# mkdir testing <==创建新目录
    [root@study tmp]# chmod 744 testing <==变更权限
    [root@study tmp]# touch testing/testing <==创建空的文件
    [root@study tmp]# chmod 600 testing/testing <==变更权限
    [root@study tmp]# ls -ald testing testing/testing
    drwxr--r--. 2 root root 20 Jun  3 01:00 testing
    -rw-------. 1 root root  0 Jun  3 01:00 testing/testing
    # 仔细看一下,目录的权限是 744 ,且所属群组与使用者均是 root 喔!
    # 那么在这样的情况下面,一般身份使用者对这个目录/文件的权限为何?
    
    • 一般用户的读写权限为何?观察中

      目录是744,一般用户对目录是可见的,但是只是可见,无法进入文件内部,我们查看一般用户进行读取的结果,

      [dmtsai@study ~]$ cd /tmp
      [dmtsai@study tmp]$ ls -l testing/
      ls: cannot access testing/testing: Permission denied
      total 0
      ?????????? ? ? ? ?            ? testing
      # 虽然有告知权限不足,但因为具有 r 的权限可以查询文件名。由于权限不足(没有x),所以会有一堆问号。
      [dmtsai@study tmp]$ cd testing/
      -bash: cd: testing/: Permission denied
      # 因为不具有 x ,所以当然没有进入的权限啦!有没有呼应前面的权限说明啊!
      
    • 如果该目录属于用户本身,会有什么状况?

      上面的练习我们知道了只有r确实可以让使用者读取目录的文件名列表,不过详细的信息却还是读不到的, 同时也不能将该目录变成工作目录(用 cd 进入该目录之意)。那如果我们让该目录变成使用者的, 那么使用者在这个目录下面是否能够删除文件呢?下面的练习做看看:

      # 1. 先用 root 的身份来搞定 /tmp/testing 的属性、权限设置:
      [root@study tmp]# chown dmtsai /tmp/testing
      [root@study tmp]# ls -ld /tmp/testing
      drwxr--r--. 2 dmtsai root 20  6月  3 01:00 /tmp/testing  # dmtsai 是具有全部权限的!
      
      # 2\. 再用 dmtsai 的帐号来处理一下 /tmp/testing/testing 这个文件看看:
      [dmtsai@study tmp]$ cd /tmp/testing
      [dmtsai@study testing]$ ls -l  <==确实是可以进入目录
      -rw-------. 1 root root 0 Jun  3 01:00 testing  <==文件不是vbird的!
      

      通过上面这个简单的步骤,你就可以清楚的知道, x 在目录当中是与“能否进入该目录”有关, 至于那个 w 则具有相当重要的权限,因为他可以让使用者删除、更新、新建文件或目录, 是个很重要的参数啊!这样可以理解了吗?! _

    使用者操作功能与权限

    刚刚讲这样如果你还是搞不懂~没关系,我们来处理个特殊的案例!假设两个文件名,分别是下面这样:

    • /dir1/file1
    • /dir2

    假设你现在在系统使用 dmtsai 这个帐号,那么这个帐号针对 /dir1, /dir1/file1, /dir2 这三个文件名来说,分别需要“哪些最小的权限”才能达成各项任务? 鸟哥汇整如下,如果你看得懂,恭喜你,如果你看不懂~没关系~未来再来继续学!

    操作动作/dir1/dir1/file1/dir2重点
    读取 file1 内容xr-要能够进入 /dir1 才能读到里面的文件数据!
    修改 file1 内容xrw-能够进入 /dir1 且修改 file1 才行!
    执行 file1 内容xrx-能够进入 /dir1 且 file1 能运行才行!
    删除 file1 文件wx--能够进入 /dir1 具有目录修改的权限即可!
    将 file1 复制到 /dir2xrwx要能够读 file1 且能够修改 /dir2 内的数据

    你可能会问,上面的表格当中,很多时候 /dir1 都不必有 r 耶!为啥?我们知道 /dir1 是个目录,也是个抽屉!那个抽屉的 r 代表“这个抽屉里面有灯光”, 所以你能看到的抽屉内的所有数据夹名称 (非内容)。但你已经知道里面的数据夹放在哪个地方,那,有没有灯光有差嘛?你还是可以摸黑拿到该数据夹的!对吧! 因此,上面很多动作中,你只要具有 x 即可!r 是非必备的!只是,没有 r 的话,使用 [tab] 时,他就无法自动帮你补齐文件名了!这样理解乎?修改目录中的文件名可以不需要读取文件的权限。

5. 目录划分与功能区作用

在这里插入图片描述

6. 目录的相关操作

变换目录的指令是 cd,对于目录的增删和修改等,接下来学习:

特殊的文件目录:

. 当前目录
.. 上一级目录
- 前一个工作目录
~ 目前使用者使用的主文件夹 /home/用户名
~account 代表account 这个使用者的主文件夹(account是个帐号名称)
[mahao@localhost ~]$ ls -al
总用量 52
drwxr-xr--. 18 mahao mahao 4096 12月 16 21:36 .
drwxr-xr-x.  3 root  root    19 12月 12 19:10 ..
-rw-------.  1 mahao mahao 1665 12月 16 21:42 .bash_history
-rw-r--r--.  1 mahao mahao   18 8月   8 20:06 .bash_logout
-rw-r--r--.  1 mahao mahao  193 8月   8 20:06 .bash_profile
-rw-r--r--.  1 mahao mahao  231 8月   8 20:06 .bashrc

查看. 和 .. 目录,表示的是当前目录和上级目录,我们使用cd操作进入上一级目录,也就是操作这个..目录。
1.处理目录的指令
  • cd 变化目录
  • pwd 显示目录
  • mkdir 创建一个新的目录
  • rmdir 删除一个目录

*** cd**

cd对几个特殊文件的访问:

[dmtsai@study ~]$ su -  # 先切换身份成为 root 看看!
[root@study ~]# cd [相对路径或绝对路径]
# 最重要的就是目录的绝对路径与相对路径,还有一些特殊目录的符号啰!
[root@study ~]# cd ~dmtsai
# 代表去到 dmtsai 这个使用者的主文件夹,亦即 /home/dmtsai
[root@study dmtsai]# cd ~
# 表示回到自己的主文件夹,亦即是 /root 这个目录
[root@study ~]# cd
# 没有加上任何路径,也还是代表回到自己主文件夹的意思喔!
[root@study ~]# cd ..
# 表示去到目前的上层目录,亦即是 /root 的上层目录的意思;
[root@study /]# cd -
# 表示回到刚刚的那个目录,也就是 /root 啰~
[root@study ~]# cd /var/spool/mail
# 这个就是绝对路径的写法!直接指定要去的完整路径名称!
[root@study mail]# cd ../postfix
# 这个是相对路径的写法,我们由/var/spool/mail 去到/var/spool/postfix 就这样写!

*** pwd**

用于显示当前所在的目录。

[root@study ~]# pwd [-P]
选项与参数:
-P  :显示出确实的路径,而非使用链接 (link) 路径。

范例:单纯显示出目前的工作目录:
[root@study ~]# pwd
/root   <== 显示出目录啦~

范例:显示出实际的工作目录,而非链接文件本身的目录名而已
[root@localhost /]# cd var/
[root@localhost var]# ls -al mail   #mail是个链接文件
lrwxrwxrwx. 1 root root 10 12月 12 18:59 mail -> spool/mail
[root@localhost var]# cd mail/
[root@localhost mail]# pwd  #查看目录
/var/mail
[root@localhost mail]# pwd -P  #查看真实目录
/var/spool/mail

*** mkdir **
用于创建新目录,但是必须拥有父目录的w权限。两个主要的参数是 -p 和 -m ,p是允许递归创建子目录,m是指定创建的目录的权限。

[root@study ~]# mkdir [-mp] 目录名称
选项与参数:
-m :设置文件的权限喔!直接设置,不需要看默认权限 (umask) 的脸色~
-p :帮助你直接将所需要的目录(包含上层目录)递回创建起来!

范例:请到/tmp下面尝试创建数个新目录看看:
[root@study ~]# cd /tmp
[root@study tmp]# mkdir test    <==创建一名为 test 的新目录
[root@study tmp]# mkdir test1/test2/test3/test4
mkdir: cannot create directory ‘test1/test2/test3/test4’: No such file or directory
# 话说,系统告诉我们,没可能创建这个目录啊!就是没有目录才要创建的!见鬼嘛?
[root@study tmp]# mkdir -p test1/test2/test3/test4
# 原来是要建 test4 上层没先建 test3 之故!加了这个 -p 的选项,可以自行帮你创建多层目录!

范例:创建权限为rwx--x--x的目录
[root@study tmp]# mkdir -m 711 test2
[root@study tmp]# ls -ld test*
drwxr-xr-x. 2 root   root  6 Jun  4 19:03 test
drwxr-xr-x. 3 root   root 18 Jun  4 19:04 test1
drwx--x--x. 2 root   root  6 Jun  4 19:05 test2
# 仔细看上面的权限部分,如果没有加上 -m 来强制设置属性,系统会使用默认属性。
# 那么你的默认属性为何?这要通过下面介绍的 [umask](../Text/index.html#umask) 才能了解喔! ^_^

*** rmdir**
这个是删除目录,并且是只能删除空的目录,目录中不能存在文件和文件件。-p也是删除子目录。p删除的是从最子目录开始一直删除到父目录为止。

[root@study ~]# rmdir [-p] 目录名称
选项与参数:
-p :连同“上层”“空的”目录也一起删除


范例:将于mkdir范例中创建的目录(/tmp下面)删除掉!
[root@study tmp]# ls -ld test*   <==看看有多少目录存在?
drwxr-xr-x. 2 root   root  6 Jun  4 19:03 test
drwxr-xr-x. 3 root   root 18 Jun  4 19:04 test1
drwx--x--x. 2 root   root  6 Jun  4 19:05 test2
[root@study tmp]# rmdir test   <==可直接删除掉,没问题
[root@study tmp]# rmdir test1  <==因为尚有内容,所以无法删除!
rmdir: failed to remove ‘test1’: Directory not empty
[root@study tmp]# rmdir -p test1/test2/test3/test4
[root@study tmp]# ls -ld test*    <==您看看,下面的输出中test与test1不见了!
drwx--x--x. 2 root   root  6 Jun  4 19:05 test2
# 瞧!利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除~
# 不过要注意的是,这个 rmdir 仅能“删除空的目录”喔!

7. $PATH 环境变量

我们知道,ls这一类的命令都是存在文件中的指令文件,但是我们是如何获取到这些指令的呢,这个就和window设置的环境变量一样了,通过设定环境变量,运行指令的时候,去指定的目录寻找,linux的环境变量就是 $PATH

我们知道查阅文件属性的指令ls完整文件名为:/bin/ls(这是绝对路径), 那你会不会觉得很奇怪:“为什么我可以在任何地方执行/bin/ls这个指令呢? ” 为什么我在任何目录下输入 ls 就一定可以显示出一些讯息而不会说找不到该 /bin/ls 指令呢? 这是因为环境变量 PATH 的帮助所致呀!

当我们在执行一个指令的时候,举例来说“ls”好了,系统会依照PATH的设置去每个PATH定义的目录下搜寻文件名为ls的可可执行文件, 如果在PATH定义的目录中含有多个文件名为ls的可可执行文件,那么先搜寻到的同名指令先被执行!

通过 echo $PATH查看环境变量的值:

[mahao@localhost ~]$ echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/mahao/.local/bin:/home/mahao/bin

[mahao@localhost ~]$ su
密码:
[root@localhost mahao]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/mahao/.local/bin:/home/mahao/bin
[root@localhost mahao]# 

上面是mahao和root用户两个身份对应的不同的变量值,之前学习的文件目录划分依据,可以大概的了解指令存放的位置是在 bin目录。分别是/usr/local/bin和 /usr/bin,然后是/bin目录,之后是/home/账户/bin的文件,通过这寻找顺序,也可以安全性,防止其他文件给替换掉这些系统指令(类似java类加载的双亲委托机制)。

PATH(一定是大写)这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔开, 每个目录是有“顺序”之分的。仔细看一下上面的输出,你可以发现到无论是root还是dmtsai都有 /bin 或 /usr/bin 这个目录在PATH变量内,所以当然就能够在任何地方执行ls来找到/bin/ls可执行文件啰!因为 /bin 在 CentOS 7 当中,就是链接到 /usr/bin 去的! 所以这两个目录内容会一模一样!

**例题:**假设你是root,如果你将ls由/bin/ls移动成为/root/ls(可用“mv /bin/ls /root”指令达成),然后你自己本身也在/root目录下, 请问(1)你能不能直接输入ls来执行?(2)若不能,你该如何执行ls这个指令?(3)若要直接输入ls即可执行,又该如何进行?答:由于这个例题的重点是将某个可执行文件移动到非正规目录去,所以我们先要进行下面的动作才行:(务必先使用 su - 切换成为root的身份)

[root@study ~]# mv /bin/ls /root
# mv 为移动,可将文件在不同的目录间进行移动作业

(1)接下来不论你在那个目录下面输入任何与ls相关的指令,都没有办法顺利的执行ls了! 也就是说,你不能直接输入ls来执行,因为/root这个目录并不在PATH指定的目录中, 所以,即使你在/root目录下,也不能够搜寻到ls这个指令!

(2)因为这个ls确实存在于/root下面,并不是被删除了!所以我们可以通过使用绝对路径或者是相对路径直接指定这个可执行文件文件名, 下面的两个方法都能够执行ls这个指令:

[root@study ~]# /root/ls  <==直接用绝对路径指定该文件名
[root@study ~]# ./ls      <==因为在 /root 目录下,就用./ls来指定

(3)如果想要让root在任何目录均可执行/root下面的ls,那么就将/root加入PATH当中即可。 加入的方法很简单,就像下面这样:

[root@study ~]# PATH="${PATH}:/root"

上面这个作法就能够将/root加入到可执行文件搜寻路径PATH中了!不相信的话请您自行使用“echo $PATH”去查看吧! 另外,除了 $PATH 之外,如果想要更明确的定义出变量的名称,可以使用大括号 ${PATH} 来处理变量的调用喔! 如果确定这个例题进行没有问题了,请将ls搬回/bin下面,不然系统会挂点的!

[root@study ~]# mv /root/ls /bin

某些情况下,即使你已经将 ls 搬回 /bin 了,不过系统还是会告知你无法处理 /root/ls 喔!很可能是因为指令参数被高速缓存的关系。 不要紧张,只要登出 (exit) 再登陆 (su -) 就可以继续快乐的使用 ls 了!

例题:如果我有两个ls指令在不同的目录中,例如/usr/local/bin/ls与/bin/ls那么当我下达 ls 的时候,哪个ls会被执行?答:那还用说,就找出 ${PATH} 里面哪个目录先被查询,则那个目录下的指令就会被先执行了!所以用 dmtsai 帐号为例,他最先搜寻的是 /usr/local/bin, 所以 /usr/local/bin/ls 会先被执行喔!

例题:为什么 ${PATH} 搜寻的目录不加入本目录(.)?加入本目录的搜寻不是也不错?答:如果在PATH中加入本目录(.)后,确实我们就能够在指令所在目录进行指令的执行了。 但是由于你的工作目录并非固定(常常会使用cd来切换到不同的目录), 因此能够执行的指令会有变动(因为每个目录下面的可可执行文件都不相同嘛!),这对使用者来说并非好事。

另外,如果有个坏心使用者在/tmp下面做了一个指令,因为/tmp是大家都能够写入的环境,所以他当然可以这样做。 假设该指令可能会窃取使用者的一些数据,如果你使用root的身份来执行这个指令,那不是很糟糕? 如果这个指令的名称又是经常会被用到的ls时,那“中标”的概率就更高了!

所以,为了安全起见,不建议将“.”加入PATH的搜寻目录中。

而由上面的几个例题我们也可以知道几件事情:

  • 不同身份使用者默认的PATH不同,默认能够随意执行的指令也不同(如root与dmtsai);
  • PATH是可以修改的;
  • 使用绝对路径或相对路径直接指定某个指令的文件名来执行,会比搜寻PATH来的正确;
  • 指令应该要放置到正确的目录下,执行才会比较方便;
  • 本目录(.)最好不要放到PATH当中。

8. 文件内容查阅

我们查看linux文件的内容,可以通过以下几个命令:

  • cat 从第一行开始显示文件内容,-n 带行号
  • tac 从最后一行显示文件内容
  • nl 显示的时候,顺便输出行号
  • more 分页显示内容,空格下一个,b返回,enter一行行
  • less 分页显示内容,实际是nano编辑器
  • head 只看前几行 -n 设定行号, -100行号表示后100行前的内容都显示
  • tail 只看后几行,+100表示看大于前100行的都看
  • od 二进制方式读取文件

1. cat:显示文本全部内容

cat [-bn] filename
显示文件内容,b空行不显示行号,n显示所有行的行号

2. tac: 反向显示内容

tac filename

3. nl 直接带行号显示内容

nl filename
	-b a 类似cat -n 无论有无内容,都显示行号
	-b t 如果有空行,空的那一行不要列出行号(默认值);

4. more 分页显示

more filename

-整数 显示每页多少个数据
-p/c 不换屏幕的显示下一页数据
  • 空格: 下一页
  • b: 上一页
  • enter: 下一行
  • / 关键字 : 搜索值,按n 切换下一页显示的地方
  • q 退出

5. less 分页显示

less 文件名

less的键盘操作和nano编辑器是一致的,比如

  • 下一页: page dowm/空格
  • 上一页: b键/pageup
  • / 关键字 搜索关键字,n下一处,N上一处
  • q退出

6. head 取出前几行

head 文件名 
默认取出前10行

head -n 20 文件名  #取出前20行

head -n -10 #取出除了后10行

[mahao@localhost ~]$ head -n  -30 2.txt 
111
2
3
4
5
6
7
8
9
10
11

7. tail 取出后几行

tail 文件名 
取出后几行,默认是后10行

tail -n 20 filename #取出后20行内容

tail -n +20 filename #取出前20行后的内容。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值