当前位置: 首页 > news >正文

【Linux】目录权限与文件权限

  现在我们知道了Linux系统内文件的三种身份(拥有者、群组与其他人),知道每种身份都有三种权限(rwx),已知道能够使用chown, chgrp, chmod去修改这些权限与属性,当然,利用ls -l去查看文件也没问题。那么,这些文件权限对于一般文件与目录文件有何不同呢?

  1)权限对文件的重要性

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

  • r (read):可读取此一文件的实际内容,如读取文本文件的文字内容等;
  • w (write):可以编辑、新增或者是修改该文件的内容(但不含删除该文件);
  • x (execute):该文件具有可以被系统执行的权限。

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

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

  2)权限对目录的重要性

  文件是存放实际数据的地方,那么目录主要是储存什么呢?目录主要的内容在于记录文件名列表,所以文件名与目录有强烈的关连! 那么在针对目录时,r, w, x 对目录是什么意义呢?

  • r (read contents in directory):

  表示具有读取目录结构列表的权限,所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件名数据。所以你就可以利用ls这个指令将该目录的内容列表显示出来!

  • w (modify contents of directory):

  这个可写入的权限对目录来说,是很了不起的! 因为他表示你具有异动该目录结构列表的权限,也就是底下这些权限:

    • 建立新的文件与目录;
    • 删除已经存在的文件与目录(不论该文件的权限为何!)
    • 将已存在的文件或目录进行更名;
    • 搬移该目录内的文件、目录位置。

  总之,目录的w权限就与该目录底下的文件名异动有关就对了!

  • x (access directory):

  目录只是记录文件名而已,总不能拿来执行吧?没错!目录不可以被执行,目录的x代表的是用户能否进入该目录成为工作目录!所谓的工作目录(work directory)就是你目前所在的目录!举例来说,当你登入Linux时,你所在的家目录就是你当下的工作目录。而变换目录的指令是『cd』(change directory)!

  假设某个用户对某一目录具有r的权限,乍看之下好像就具有可以进入此目录的权限,其实那是错的。能不能进入某一个目录,只与该目录的x权限有关!此外, 工作目录对于指令的执行是非常重要的,如果你在某目录下不具有x的权限, 那么你就无法切换到该目录下,也就无法执行该目录下的任何指令,即使你具有该目录的r的权限。

  要注意:要开放目录给任何人浏览时,应该至少也要给予r及x的权限,但w权限不可随便给! 为什么w不能随便给,我们来看下一个例子:

例题:

假设有个账号名称为knife,他的家目录在/home/knife/,knife对此目录具有[rwx]的权限。 若在此目录下有个名为the_root.data的文件,该文件的权限如下:

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

请问knife对此文件的权限为何?可否删除此文件?

答:

如上所示,由于knife对此文件来说是『others』的身份,因此这个文件他无法读、无法编辑也无法执行, 也就是说,他无法变动这个文件的内容就是了。

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

  还是看不太懂?我们再来一个例子吧:

  • 先用root的身份建立所需要的文件与目录环境

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

[root@www ~]# cd /tmp                       <==切换工作目录到/tmp

[root@www tmp]# mkdir testing                <==建立新目录

[root@www tmp]# chmod 744 testing           <==变更权限

[root@www tmp]# touch testing/testing         <==建立空的文件

[root@www tmp]# chmod 600 testing/testing    <==变更权限

[root@www tmp]# ls -ald testing testing/testing  

drwxr--r-- 2 root root 4096 Sep 19 16:01 testing

-rw------- 1 root root    0 Sep 19 16:01 testing/testing

# 仔细看一下,目录的权限是744,且所属群组与使用者均是root!

# 那么在这样的情况底下,一般身份用户对这个目录/文件的权限为何?
View Code
  • 一般用户的读写权限为何?

  在上面的例子中,虽然目录是744的权限设定,一般用户应该能有r的权限,但这样的权限使用者能做啥事呢?假设系统中含有一个账号名为knife,我们可以透过『 su - knife 』这个指令来变换身份。

[root@www tmp]# su - knife <==切换身份!

[knife@www ~]$ cd /tmp     <==看一下,身份变了喔!提示字符也变成 $ 了!

[knife @www tmp]$ ls -l testing/

?--------- ? ? ? ?             ? testing

# 因为具有 r 的权限可以查询档名。不过权限不足(没有x),所以会有一堆问号。

[knife @www tmp]$ cd testing/

-bash: cd: testing/: Permission denied

# 因为不具有 x ,所以当然没有进入的权限啦!有没有呼应前面的权限说明啊!
View Code
  • 如果该目录属于用户本身,会有什么状况?

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

[knife@www tmp]$ exit               <==变回原本的 root 身份喔!

[root@www tmp]# chown knife testing <==修改权限,让knife拥有此目录

[root@www tmp]# su - knife          <==再次变成knife来操作

[knife @www ~]$ cd /tmp/testing      <==可以进入目录了呢!

[knife @www testing]$ ls -l

-rw------- 1 root root 0 Sep 19 16:01 testing  <==文件不是knife的!

[knife @www testing]$ rm testing     <==尝试刪除这个文件看看!

rm: remove write-protected regular empty file `testing'? y

# 竟然可以删除!这样理解了吗?!
View Code

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

 

  参考资料:http://vbird.dic.ksu.edu.tw/linux_basic/0210filepermission.php

相关文章:

  • YUV数据格式与YUV_420_888
  • vue-cli3.0项目中使用vw——相比flexible更原生的移动端解决方案
  • rsync 数据镜像备份 记录
  • Lucene:基于Java的全文检索引擎简介
  • Android 其他特效展示
  • DataUml Design 教程7 - 数据库生成模型
  • request
  • luanet分布式lua框架
  • 解决 LLVM 错误 fatal error: ‘csignal’ file not found
  • 使用idea 搭建一个 SpringBoot + Mybatis + logback 的maven 项目
  • vmware 安装dos注意
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • Centos6.4_X64飞信安装
  • (轉貼) UML中文FAQ (OO) (UML)
  • spring MVC 3.1 forword/redirect
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 2019.2.20 c++ 知识梳理
  • css的样式优先级
  • dva中组件的懒加载
  • iOS编译提示和导航提示
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • orm2 中文文档 3.1 模型属性
  • Swoft 源码剖析 - 代码自动更新机制
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 将回调地狱按在地上摩擦的Promise
  • 目录与文件属性:编写ls
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 学习JavaScript数据结构与算法 — 树
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • const的用法,特别是用在函数前面与后面的区别
  • ​2021半年盘点,不想你错过的重磅新书
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #HarmonyOS:软件安装window和mac预览Hello World
  • $.ajax()
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (安卓)跳转应用市场APP详情页的方式
  • (笔试题)分解质因式
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (一)基于IDEA的JAVA基础10
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .htaccess配置常用技巧
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 表达式计算:Expression Evaluator
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .Net中的集合
  • .net中调用windows performance记录性能信息