Linux(2)-文件权限与目录


Linux 和windows的一个主要区别是Windows的设计是单人假多任务,而Linux则是优秀的多人多任务环境,为了针对每个用户都有自己的文件管理权限,Linux有一套自己的文件管理方式,将文件可读写的身份分为三个类别,分别是 * 拥有者(owner),所属群组(group),其他人(others)。*

用户与用户组

开始接触Linux的时候,由于是自己一个用户来操作个人电脑,只对用户的概念有所了解,用户分为root用户和普通用户。而用户组的概念则是针对多人多任务的情况提出的,让我们思考这样一个情况,假设两组有竞争关系的小组同时使用一台电脑来完成任务,他们最后需要提交的文件是一样的,那肯定在任务进行期间双方只能改动和查看自己的文件,而不能查看对方组内的文件。* So,用户组最有用的功能之一,就是当你的团队进行协同工作的时候 。*

在假设一种情况,如果你是刚刚的小组中的一员,在进行工作的闲暇之余,你访问了PornHub并且下载了影片,作为一个正常人,你肯定不会想让自己小组的成语直到你干了什么,这时,你可以将文件的权限设置为作为文件拥有者才拥有查看的权利,其他人都没有。那么即时其他人直到这里有一个十分有趣的文件,也无法直到文件的具体内容。

还有一个* others* 的概念,在设定好用户组以后,除本组成员外的* 其他人* ,你也可以针对他们设置文件的权限。

、linux中默认将所有系统上账户的信息都记录在/etc/paswd这个文件内,用户的密码则储存/etc/shadow文件中,而用户组名则储存在/etc/group中。

Linux文件权限概念

Linux文件权限设置

由于chgrpchownchmod命令都需要root身份来执行,所以我们切换到root账户:

$ sudo su

在根目录/root下执行(注意Linux中有很多root,刚刚我们登录的是root账户,这里是根目录,他们都是不同的概念)

[root@Jason ~]$ ls -al #ls是list的意思,重点显示文件的文件名与相关属性,
                       #选项[-al]表示列出所有的文件详细的权限与属性。
total 220
dr-xr-x---    4     root     root       4096      3月  18 11:51   .
dr-xr-xr-x   24     root     root       4096      3月  20 01:57   ..
drwxrwxrwx    3     root     root       4096      3月  14 11:50   91yunserverspeeder
-rw-r--r--    1     root     root      63298      3月  14 11:50   91yunserverspeeder.tar.gz
-rw-------    1     root     root       2134      3月  18 12:33   .bash_history
-rw-r--r--    1     root     root         18      5月  20 2009   .bash_logout
-rw-r--r--    1     root     root        176      5月  20 2009   .bash_profile
-rw-r--r--    1     root     root        176      9月  23 2004   .bashrc
-rw-r--r--    1     root     root        100      9月  23 2004   .cshrc
-rw-------    1     root     root         40      3月  18 11:52   .lesshst
drwxr-----    3     root     root       4096      10月 16 22:49   .pki
-rwxr-xr-x    1     root     root       6156      3月  14 11:40   serverspeeder.sh
-rw-r--r--    1     root     root      47804      3月  14 11:18   shadowsocks-all.log
-rwxr-xr-x    1     root     root      46219      3月  14 11:13   shadowsocks-all.sh
-rw-r--r--    1     root     root        554      3月  14 11:18   shadowsocks_r_qr.png
-rw-r--r--    1     root     root        129      12月  3 2004    .tcshrc
[    1    ] [ 2  ] [  3   ] [   4   ] [   5    ] [       6      ] [           7                ]
[   权限  ] [链接] [拥有者] [用户组 ] [文件容量] [   修改日期   ] [         文件名             ]

(注:为了显示方便,加入了许多空格)

[1]代表文件的类型与权限

这一栏有十个字符:

  • 第一个字符代表这个文件是目录、文件或链接文件等
    • 当为[d]则是目录,例如上表文件名为[91yunserverspeeder]的一行
    • 当为[-]则是文件,例如上表名为[shadowsocks-all.log]的一行
    • 当为[l]则表示为链接文件(link file)
    • 若是[b]则表示为设备文件里面可供储存的周边设备(可按块随机读写的设备)
    • 若是[c]则表示为设备文件里面的串行端口设备,例如键盘,鼠标(一次性读取设备);
  • 接下来的字符中,以三个为一组,且均为[rwx]的三个参数的组合,其中[r]代表read,[w]代表write,[x]代表execute,如果该用户拥有该权限,则显示对应的字符,如果没有权限,则显示[-]。
    • 第一组为文件拥有者可具备执行的权限
    • 第二组为加入次用户组之账号的权限
    • 第三组为非本人且没有本用户组的其他账号的权限
[2]表示有多少文件名链接到这个节点(inode)

Linux中每个文件都会将它的权限及属性记录到文件系统的inode中,目录树中是使用文件名来记录的,因此每个文件名会关联到一个inode号码,这个数字就是显示有多少个文件关联到同一个inode号码。

[3]表示这个文件的拥有者账户
[4]表示这个文件的所属用户组
[5]表示这个文件的容量,默认为Bytes
[6]表示这个文件的创建日期或最后修改日期
[7]表示这个文件的文件名

* Linux下文件权限的设置非常重要!!! *

在修改你的Linux文件与目录的属性之前,一定要先搞清楚,什么数据是可变的,什么是不可变的。

修改文件属性与权限
$ chgrp  //修改文件所属用户组
$ chown  //修改文件拥有者
$ chmod  //修改文件的权限,SUID,SGID,SBIT等的特性
chgrp
$ chgrp [-R] dirname/filename...
选项与参数:
-R : 进行递归(recursive)修改,亦即联通子目录下所有文件,目录都更新为这个用户组之意。
chown
$ chown [-R] 账号名称 文件或目录
$ chown [-R] 账号名称:用户组名称 文件或目录
选项与参数:
-R : 进行递归(recursive)修改,亦即联通子目录下所有文件,目录都更新为这个用户组之意。

命令中的:也可以使用.来代替,但是Linux中隐藏文件和用户名及文件名都常常含有.,所以我们尽量使用:来防止系统误判。

chmod
$ chmod [-R] xyz 文件或目录
选项与参数:
-R : 进行递归(recursive)修改,亦即联通子目录下所有文件,目录都更新为这个用户组之意。
  • 数字类型修改文件权限。
    Linux文件的基本权限有九个,分别是拥有者(owner),所属群组(group),其他人(others)三种身份分别拥有读(read),写(write),执行(execute)权限,我们可以使用数字代替各个权限:
    r:4
    w:2
    x:1
    每种身份的权限可以表示为一个数字,这样三组权限有三个数字就可以完全表示了,如:
    rwx 4+2+1=7
    r-x 4+1=5
    这里鸟哥没有提到,但是我认为也可以理解为也可以理解为二进制形式:
    rwx 111 = 7
    r-x 101 = 5
    所以我们设置权限时,就可以直接通过这样的方式进行修改
    root@Jason:~# chmod -R xyz 文件或目录
  • 符号类型修改权限。我们借用u,g,o来代表三种身份,rwx代表权限

|chmod|u(user) g(group) o(others) a(all)|+ (加入) - (移除) =(设置)|r(读) w(写) x(执行)|文件和目录|
| :|

目录与文件的权限意义
  • 文件

[r]这个权限比较通俗,就是读取文件的内容。

[w]权限可以拥有修改,编辑,写入,新增的权限,但是无权删除该文件。

Windows下文件是否具有执行能力是看文件的扩展名来决定,而在Linux下一个文件是否能够执行即借由[x]这个权限来决定,跟文件名没有绝对的关系。

  • 目录

[r]权限可以赋予你读取一个目录的权限,可以通过ls命令将该目录下的文件列表显示。

[w]的权限对于目录来说十分大,拥有改变目录结构列表的权限:即
+

  • 建立新文件与新目录
  • 删除已经存在的文件和目录
  • 将文件和目录更名
  • 移动该目录内的文件,目录位置

[x]代表用户是否有权利进入该目录成为工作目录,能不能进入一个目录只与[x权限有关,如果你在某目录下不具有x的权限,你就无法切换到该目录下,即使你具有rhuow的权限,也无法执行该目录下的任何命令。 (所以我们在搭建博客时至少应该开放r和x权限,而w权限不能随意开放)

下面的表格中总结了几种情况来说明完成某种操作所具有的最小权限

/dir1/file1
/dir2
操作 /dir1 /dir1/file1 /dir2 重点
读取file1内容 x r - 能够进入/dir1且能读取file1
修改file1内容 x rw - 能够进入/dir1且能修改file1
执行file1内容 x rx - 能够进入/dir1且能执行file1
删除file1文件 w - - 能够进入/dir目录且能修改目录即可
将file1复制到/dir2 x r w 能够读file1且能修改/dir2

这里我们假设已经直到了目录里的file1文件,虽然不能通过ls命令了解文件夹内的文件,但是如果事先就知道文件的存在,仍然可以继续操作。

Linux文件种类与扩展名

任何设备在Linux下都是文件

不仅是设备,数据沟通的接口也有专门的文件

文件种类
  • 常规文件(regular file)[-]
    • 纯文本文件(ASCII)cat
    • 二进制文件(binary)
    • 数据文件(data)last
  • 目录[d]
  • 链接文件[l](类似于快捷方式)
  • 设备与设备文件(通常储存在/dev下)
    • 区块(block)设备文件[b]
    • 字符(character)设备文件[c]
  • 数据接口(sockets)文件[s]
  • 数据传送(FIFO,pipe)文件[p]
Linux文件扩展名

Linux文件能否执行只与[x]属性有关,和文件扩展名毫无关系。
但是具有可执行的权限具有可执行的程序是两码事,例如我们用chmod给文件test.txt加上[x]权限,但是文件显然还是不可执行的。因为文件的内容里并没有可执行的部分。

虽然如此但是我们任然希望凭借文件扩展名来了解文件的种类:

  • *.sh:脚本或批处理文件(scripts)用shell写成
  • *.Z,*.tar.gz,*.tar,*.zip:经过打包的压缩文件
  • *.html:网页文件

可以这样说,Linux下的文件扩展名的意义只是让你或者编辑器知道文件的类型,即时去掉文件扩展名,文件依然可以正常执行。

Linux文件名长度通常 限制在256个字符之内,且由于Linux命令行操作的特性,最好不要带有特殊字符。

Linux目录配置

Linux目录配置的依据——FHS

FHS(Filesystem Hierarchy Standard)统一了Linux的各发行版之间的的目录配置方法,和HTML的标准一样,这是一个不断进化的标准。

FHS将文件系统使用的频繁与否是否允许用户随意修改将目录定义为四中交互作用的形态。

可分享() 不可分享()
不变(static) /usr(软件存放处) /etc(配置文件)
/opt(第三方辅助软件) /boot(启动与相关内核)
可变动(variable) /var/mail(用户邮箱) /var/run(程序相关)
/var/spool/news(新闻组) /var/lock(程序相关)
(表中目录仅为参考,不代表全部)
  • 可分享:可以分享给其他系统挂载的目录
  • 不可分享:设备文件或与程序有关的socket文件等,仅与自身机器有关
  • 不变:有些数据是不会经常变动的,例如函数库,文件说明,系统管理员的主机配置文件
  • 可变动:经常修改的数据,如日志文件等

FHS针对目录树架构定义出三层目录下面应该放置什么数据

  • / (root,根目录):与启动系统有关;
  • /usr(unix software resource):与软件安装/执行有关;
  • /var (variable):与系统运行过程有关;
根目录(/)的意义与内容

所有的目录都是由根目录衍生而来,根目录同时还与系统的启动,还原,恢复等操作有关。FHS要求,根目录不要放在非常大的分区内,分区越大,存放的数据越多越容易出现问题。

FHS建议:根目录(/)所在分区越小越好,且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好,这样不但性能较佳,也不容易出现问题

FHS建议根目录下应该有如下的子目录,即使不存在物理目录,也最好要有连接目录:

第一部分:FHS要求必须要存在的目录
目录 应放置的文件内容
/bin 放置的是在单人维护模式下还能够被使用的命令,在/bin下的命令可以被root和一般账户所使用,主要有cat,chmod,chown,date,mv,mkdir,cp,bash等常用命令
/boot 放置系统启动所用到的文件,包括Linux内核文件和启动配置文件,Linux内核常用文件名为vmlinuz
/dev 任何*接口与设备文件都存放于这个目录当中。读写这个目录下的文件就相当于在读写某个设备,如/dev/null,/dev/zero,/dev/tty,/dev/loop\,/dev/*sd
/etc 主要的配置文件都存放在这里,账号密码文件,这个目录下的玩家只有root有权利修改,FHS建议不要在/etc下放置可执行文件(binary),另外FHS还规范几个重要的目录:(1)/etc/opt(必要):第三方辅助软件的配置文件(2)/etc/sgml(建议):SGML格式有关的配置文件 (3)/etc/xml(建议):与xml格式的配置文件
/lib 放置的是启动时会用到的函数库,以及在/bin和/sbin下命令会调用的函数库,FHS要求必须存在/lib/modules:主要放置可抽换式的内核相关模块(驱动程序)
/media 放置的是可删除的设备,例如软盘,光盘
/mnt 暂时挂载设备时可以使用这个目录
/opt 给第三方辅助软件放置的目录
/run 系统启动后产生的各项信息,可以使用内存来模拟,所以性能会好很多
/sbin 放在/sbin下面的为启动过程中所需要的,包括了启动,修复,还原系统所需的命令
/srv service的缩写,是网络服务启动之后,所需要的数据目录
/tmp 在启动时,此目录下的内容都清空,正在执行的程序放置文件的地方
/usr 第二层FHS设置
/var 第二层FHS设置,主要放置编变动性的数据
第二部分:FHS建议可以存在的目录
目录 应放置的文件内容
/home 系统默认的用户家目录,新增账号时默认的家目录都会规范到这里来
/lib<qual 用来存放与/lib不同格式的二进制函数库
/root 系统管理员的家目录

以上就是FJS对根目录的所有定义标准了,Linux下还有许多很重要的目录:

目录 应放置的文件内容
/lost+found ext2,3,4文件系统格式下产生的目录,当系统发生错误时,将遗失的片段放入
/proc 虚拟文件系统(virtual filesystem),数据都在内存当中,如系统内核,进程信息,设备状态,网络状态等本身不占有任何硬盘空间
/sys 也是一个虚拟文件系统,记录内核与系统文件相关的内容
/usr的意义与内容

tips:你知道/usr目录起初是怎么来的吗?:-)
/usr的数据属于不可变动与可分享,UNIX操作系统资源,一般来说/usr的子目录建议有这些:

FHS要求必须存在的部分
目录 应放置的文件内容
/usr/bin/ 所有一般用户能够使用的命令都放置于此,和/bin是一抹一样的,FHS要求此目录下不应该有子目录
/usr/lib/ 基本与/lib功能一样
/usr/local/ 系统管理员安装自己下载(非发行版默认提供)软件的目录
/usr/sbin/ 非系统正常运行所需要的命令,如服务命令,基本与/sbin功能相同
/usr/share/ 放置只读的数据文件,放置的文件几乎都是不分硬件架构都可以读取的文件
FHS建议存在的目录
目录 应放置的文件内容
/usr/games/ 与游戏相关的文件
/usr/local/ c/c++语言的头文件(header_与包含文件(include)的放置处
/usr/libexec/ 某些不被一般用户常用的执行文件或脚本
/usr/lib <qual/ 与/lib <qual功能相同
/usr/src/ 一般源代码应该放置于此,内核源代码放置在/usr/src/Linux下
/var的意义与内容

不同于/usr在一开始就占用了大量硬盘空间,/var目录是系统运行后渐渐增长的。/var针对经常变动的文件,包括缓存(cache),日志文件(log file),以及软件运行的过程中产生的文件。

####### FHS要求必须存在的目录

目录 应放置的文件内容
/var/cache/ 应用程序本身运行会产生的一些缓存
/var/lib/ 程序本身运行的过程中需要用到的数据文件
/var/lock/ 某些设备同一时间段只能被一个人使用,所以在设备正使用时,需要对设备上锁
/var/log/ 非常重要是日志文件的放置处
/var/mail/ 放置个人邮件,与
/var/run/ 某些程序启动后,会将他们的PID放置于此
/var/spool/ 放置队列数据,队列就是排队等待其他程序使用的数据

再次注意,FHS的标准是不断变化的,现在的文件目录也并不会一成不变。

目录树(directory tree)

回忆一下,我们说过,Linux下所有文件和目录都是由根目录衍生而来,类似于树的数据结构,根目录就是根节点,我们称这种目录配置方式为目录树(directory tree)。

目录树的特性有:

  • 目录树的启始点为根目录(/,root);
  • 每一个目录不仅能使用本地分区的文件系统,也可以使用网络上的文件系统,例如通过Network File System(NFS)服务器挂载特定的目录
  • 每一个文件在目录树中的文件名(完整路径)都是unique的
绝对路径与相对路径

绝对路径(absoulte):从根目录开始写起的路径

相对路径(relative):相对与当期路径的文件名写法

  • . :代表当前的目录,也可以使用 ./ 来表示
  • .. :代表上一层目录,也可以 ../ 来代表
$ uname -r    //查看内核版本
$ uname -m // 查看OS架构
$ lsb_release -r //lsb标准

重点回顾

  • 绝对路径:『一定由根目录 / 写起』;相对路径:『不由 / 写起,而是由相对当前目录写起』
  • 特殊目录有:., .., -, ~, ~account 需要注意;
  • 与目录相关的指令有:cd, mkdir, rmdir, pwd 等重要指令;
  • rmdir 仅能删除空目录,要删除非空目录需使用『 rm -r 』指令;
  • 用户能使用的指令是依据 PATH 变量所规定的目录去搜寻的;
  • ls 可以检视文件的属性,尤其 -d, -a, -l 等选项特别重要!
  • 文件的复制、删除、移动可以分别使用:cp, rm , mv 等指令来操作;
  • 检查文件的内容(读文件)可使用的指令包括有:cat, tac, nl, more, less, head, tail, od 等
  • cat -n 与 nl 均可显示行号,但默认的情况下,空白行会不会编号并不相同;
  • touch 的目的在修改文件的时间参数,但亦可用来建立空文件;
  • 一个文件记录的时间参数有三种,分别是 access time(atime), status time (ctime), modification time(mtime),ls默认显示的是 mtime。
  • 除了传统的 rwx 权限之外,在 Ext2/Ext3/Ext4/xfs 文件系统中,还可以使用 chattr 与 lsattr 设定及观察隐藏属性。 常见的包括只能新增数据
  • 新建文件/目录时,新文件的预设权限使用 umask 来规范。默认目录完全权限为 drwxrwxrwx, 文件则为-rw-rw-rw-。
  • 文件具有 SUID 的特殊权限时,代表当用户执行此一 binary 程序时,在执行过程中用户会暂时具有程序拥有者的权限
  • 目录具有 SGID 的特殊权限时,代表用户在这个目录底下新建的文件之群组都会与该目录的组名相同。
  • 目录具有 SBIT 的特殊权限时,代表在该目录下用户建立的文件只有自己与 root 能够删除!
  • 观察文件的类型可以使用 file 指令来观察;
  • 搜寻指令的完整文件名可用 which 或 type ,这两个指令都是透过 PATH 变量来搜寻文件名;
  • 搜寻文件的完整档名可以使用 whereis 找特定目录或 locate 到数据库去搜寻,而不实际搜寻文件系统;
  • 利用 find 可以加入许多选项来直接查询文件系统,以获得自己想要知道的档名。

文章作者: Jinzhengxu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jinzhengxu !
评论
 上一篇
Linux(3)-Linux文件与目录管理 Linux(3)-Linux文件与目录管理
目录与路径相对路径与绝对路径 相对路径::安装软件时,每个人有不同的文件安装位置,这时使用相对路径来安排各个软件目录下的文件位置就十分方便。 绝对路径:绝对路径是绝对正确的路径(如果你自己没犯傻的话),在使用shell脚本的来管理系统的情况
2019-03-26
下一篇 
ssh连接报错WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! ssh连接报错WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
今天在服务器被banl,在用ssh连接新deploy的服务器时,遇到点小问题。终端显示: jason@jason-ThinkPad-X1-Carbon-6th:~$ ssh root@149.28.88.126 @@@@@@@@@@@@@@
2019-03-20
  目录