type
status
date
slug
summary
tags
category
icon
password
Linux文件权限概念
看懂一个文件他的权限,使用ls -al会出现一些文件和他们的详细信息,一共七个字段。
ls是“list”的意思,重点在显示文件的文件名与相关属性。而选项“-al”则表示列出所有的文件详细的权限与属性 (包含隐藏文件,就是文件名第一个字符为“ . ”的文件)

下面解释没个字段的含义:

- 第一个字段代表此文件的类型与权限

- 第一个字符代表这个文件是“目录、文件或链接文件等等”:
- 当为[ d ]则是目录,例如上表文件名为“.config”的那一行;
- 当为[ - ]则是文件,例如上表文件名为“initial-setup-ks.cfg”那一行;
- 若是[ l ]则表示为链接文件(link file);
- 若是[ b ]则表示为设备文件里面的可供储存的周边设备(可随机存取设备);
- 若是[ c ]则表示为设备文件里面的序列埠设备,例如键盘、鼠标(一次性读取设备)。
- 接下来的字符中,以三个为一组,且均为“rwx” 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。
- 第一组为“文件拥有者可具备的权限”,以“initial-setup-ks.cfg”那个文件为例, 该文件的拥有者可以读写,但不可执行;
- 第二组为“加入此群组之帐号的权限”;
- 第三组为“非本人且没有加入本群组之其他帐号的权限”。
注意:rwx所在的位置是不会改变的,有该权限就会显示字符,没有该权限就变成减号(-)就是了。目录与文件的权限意义并不相同,这是因为目录与文件所记录的数据内容不相同所致。
- 第二栏表示有多少文件名链接到此节点(i-node):每个文件都会将他的权限与属性记录到文件系统的i-node中,不过,我们使用的目录树却是使用文件名来记录, 因此每个文件名就会链接到一个i-node啰!这个属性记录的,就是有多少不同的文件名链接到相同的一个i-node号码去就是了。 关于i-node的相关数据我们会在第七章谈到文件系统时再加强介绍的。
- 第三栏表示这个文件(或目录)的“拥有者帐号”
- 第四栏表示这个文件的所属群组
- 第五栏为这个文件的容量大小,默认单位为Bytes
- 第六栏为这个文件的创建日期或者是最近的修改日期
- 这一栏的内容分别为日期(月/日)及时间。如果这个文件被修改的时间距离现在太久了,那么时间部分会仅显示年份而已。
- 如果想要显示完整的时间格式,可以利用ls的选项,亦即:“ls -l --full-time”就能够显示出完整的时间格式了!包括年、月、日、时间喔。 另外,如果你当初是以繁体中文安装你的Linux系统,那么日期字段将会以中文来显示。 可惜的是,中文并没有办法在纯文本的终端机模式中正确的显示,所以此栏会变成乱码。 那你就得要使用“export LC_ALL=en_US.utf8”来修改语系喔!
- 第七栏为这个文件的文件名
系统保护的功能
举个简单的例子,在你的系统中,关于系统服务的文件通常只有root才能读写或者是执行,例如/etc/shadow这一个帐号管理的文件,由于该文件记录了你系统中所有帐号的数据, 因此是很重要的一个配置文件,当然不能让任何人读取(否则密码会被窃取啊),只有root才能够来读取啰!所以该文件的权限就会成为[ ---------- ]啰!咦!所有人都不能使用?没关系,root基本上是不受系统的权限所限制的, 所以无论文件权限为何,默认root都可以存取喔!
团队开发软件或数据共享的功能
此外,如果你有一个软件开发团队,在你的团队中,你希望每个人都可以使用某一些目录下的文件,而非你的团队的其他人则不予以开放呢?以上面的例子来说,testgroup的团队共有三个人,分别是test1, test2, test3,那么我就可以将团队所需的文件权限订为[ -rwxrws--- ]来提供给testgroup的工作团队使用啰!(怎么会有 s 呢?s在此代表特殊权限GID)
未将权限设置妥当的危害
举个例子,如果你的目录权限没有设置好的话,可能造成其他人都可以在你的系统上面乱搞啰!例如本来只有root才能做的开关机、ADSL的拨接程序、新增或删除使用者等等的指令,若被你改成任何人都可以执行的话, 那么如果使用者不小心给你重新开机啦!重新拨接啦!等等的!那么你的系统不就会常常莫名其妙的挂掉啰! 而且万一你的使用者的密码被其他不明人士取得的话,只要他登陆你的系统就可以轻而易举的执行一些root的工作!
文件属性与权限的变更
常用于群组、拥有者、各种身份的权限之修改的指令:
chgrp :改变文件所属群组
chown :改变文件拥有者
chmod :改变文件的权限, SUID, SGID, SBIT等等的特性
chgrp 改变文件所属群组
这个指令是change group的缩写。要改变的群组名称必须在/etc/group文件内才行,否则会报错,无效的群组。
usage: chgrp [option] [group] [file]
Change the group of each FILE to GROUP.
chown 改变文件拥有者
这个指令是change owner的缩写。注意,拟修改的使用者必须是系统中的账号,也就是在/etc/passwd这个文件中有记录的使用者才能改变。
chown的用途不只是可以改变文件拥有者,还能修改群组的名称。如果要连目录下的所有次目录或文件同时更改文件拥有者的话,直接加上 -R 的选项即可!
usage: chown [option] [owner] [:[group]] [file]
Change the owner and/or group of each FILE to OWNER and/or GROUP.
chown也可以使用“chown user.group file”,亦即在拥有者与群组间加上小数点“ .”也行! 不过当拟修改的owner用户名带小数点如s.tom,这就会造成系统误判。所以我们比较建议使用冒号“:”来隔开拥有者与群组啦!此外,chown也能单纯的修改所属群组呢! 例如“chown .sshd initial-setup-ks.cfg”就是修改群组~看到了吗?就是那个小数点的用途!什么时候要使用chown或chgrp呢?例子:在复制文件给你之外的其他人时,使用cp指令复制文件及其属性和权限。原来的权限可能不允许其他人修改,这时候就需要修改文件的owner和群组咯
chmod 改变权限
文件权限的改变使用的是chmod这个指令,但是,权限的设置方法有两种, 分别可以使用数字或者是符号来进行权限的变更。
数字类型改变文件权限
Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的
read/write/execute权限,
先复习一下刚刚上面提到的数据:文件的权限字符为:“
- rwxrwxrwx”,
这九个权限是三个三个一组的!其中,我们可以使用数字来代表各个权限,各权限
的分数对照表如下:
> r:4
> w:2
> x:1
每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为:
[-rwxrwx---] 分数则是:
> owner = rwx = 4+2+1 = 7
> group = rwx = 4+2+1 = 7
> others= --- = 0+0+0 = 0
下面使用数字类型改变kitty目录文件夹

语法:chmod xyz filename
符号类型改变文件权限
语法:chmod u|g|o|a +|-|= r|w|x filename
“|”是或u|g|o|a:u代表user(owner),g代表group,o代表others,a代表all,即u、g和o“+(-,=)”:为选定权限组(ugoa)增加(减去,赋予)相应权限
使用=的例子
改变一个文件的权限为“-rwxr-xr--”
注意:u=rwx,g=rx,o=r 之间不可有空白字符,并且代表无权限的“-”不需写入,省略即可若赋予权限相同,组可以合并,如go=rwx,g和o都给予rwx权限
使用+的例子
为未知权限的文件test中每个人增加可写入的权限
总结
数字类型在直接为文件/目录赋予权限时更高效,基于未知的文件/目录 权限的增删,符号类型修改权限更优
目录与文件权限的意义
文件权限的意义
文件是实际含有数据的地方,包括一般文本文件、数据库内容档、二进制可可执行文件(binaryprogram)等等。 因此,权限对于文件来说,他的意义是这样的
- r (read):可读取此文件的实际内容,如读取文本文件的文字内容等
- w (write):可以编辑、新增或者是修改该文件的内容(但不含删除该文件)
- x (eXecute):该文件具有可以被系统执行的权限。
x权限的说明:在windows下,系统用文件扩展名来辨认文件是否具有可执行的能力,如:.exe,.bat,.com等。但在Linux下,文件能否被执行,取决于该文件是否具有"x"权限,跟文件名毫无关系。w权限的说明:当你对一个文件具有w权限时,你可以具有写入/编辑/新增/修改文件的内容的权限, 但并不具备有删除该文件本身的权限!对于文件的rwx来说, 主要都是针对“文件的内容”而言,与文件文件名的存在与否没有关系喔!因为文件记录的是实际的数据嘛!
目录权限的意义
文件是存放实际数据的所在,目录主要的内容是文件名清单
- r (read contents in directory):表示具有读取目录结构清单的权限,所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件名数据。 所以你就可以利用 ls 这个指令将该目录的内容列表显示出来!
- w (modify contents of directory):表示你具有异动该目录结构清单的权限,也就是下面这些权限:
- 创建新的文件与目录
- 删除已经存在的文件与目录(不论该文件的权限为何!)
- 将已存在的文件或目录进行更名
- 搬移该目录内的文件、目录位置。
总之,目录的w权限就与该目录下面的文件名异动有关就对了啦!
- x (access directory):目录只是记录文件名而已,总不能拿来执行吧?没错!目录不可以被执行,目录的x代表的是使用者能否进入该目录成为工作目录的用途! 所谓的工作目录(workdirectory)就是你目前所在的目录啦!举例来说,当你登陆Linux时, 你所在的主文件夹就是你当下的工作目录。而变换目录的指令是“cd”(change directory)啰!
如果你在某目录下不具有x的权限, 那么你就无法切换到该目录下,也就无法执行该目录下的任何指令,即使你具有该目录的r或w的权限。要开放目录给任何人浏览时,应该至少也要给予r及x的权限,但w权限不可随便给! 给了,别人就可以任意删改你的文件了假设“文件是一堆文件数据夹”,所以你可能可以在上面写/改一些数据。而“目录是一堆抽屉”,因此你可以将数据夹分类放置到不同的抽屉去。 因此抽屉最大的目的是拿出/放入数据夹喔!
案例
- 查看一个对于你来说只有“r”权限的目录

那么你只能看到目录的文件名,不能看到其他详细信息。由于权限不足,没有“x”权限,所以一堆问号。
使用者操作功能与权限
假设两个文件名,分别是下面这样:
- /dir1/file1
- /dir2
假设你现在在系统使用 dmtsai 这个帐号,那么这个帐号针对 /dir1, /dir1/file1, /dir2 这三个文件名来说,分别需要“哪些最小的权限”才能达成各项任务? 鸟哥汇整如下

你可能会问,上面的表格当中,很多时候 /dir1 都不必有 r 耶!为啥?我们知道 /dir1 是个目录,也是个抽屉!那个抽屉的 r 代表“这个抽屉里面有灯光”, 所以你能看到的抽屉内的所有数据夹名称 (非内容)。但你已经知道里面的数据夹放在哪个地方,那,有没有灯光有差嘛?你还是可以摸黑拿到该数据夹的!对吧! 因此,上面很多动作中,你只要具有 x 即可!r 是非必备的!只是,没有 r 的话,使用 [tab]时,他就无法自动帮你补齐文件名了!这样理解乎?
要读一个文件时,你得要具有“这个文件所在目录的 x 权限”才行!所以,通常要开放的目录, 至少会具备 rx 这两个权限!
Linux文件种类与拓展名
任何设备在Linux下面都是文件, 不仅如此,连数据沟通的接口也有专属的文件在负责
文件种类
- 文件种类:使用“ls -l”观察到第一栏那十个字符中,第一个字符为文件的类型。
- 正规文件(regular file ):就是一般我们在进行存取的类型的文件,在由 ls -al 所显示出来的属性方面,第一个字符为 [ - ],例如 [-rwxrwxrwx ]。另外,依照文件的内容,又大略可以分为:
- 纯文本文件(ASCII):这是Linux系统中最多的一种文件类型啰,
- 二进制档(binary):我们的系统其实仅认识且可以执行二进制文件(binary file)没错~ 你的Linux当中的可可执行文件(scripts, 文字体批处理文件不算)就是这种格式的啦~ 举例来说,刚刚下达的指令cat就是一个binary file。
- 数据格式文件(data): 有些程序在运行的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件 (data file)。举例来说,我们的Linux在使用者登陆时,都会将登录的数据记录在 /var/log/wtmp那个文件内,该文件是一个data file,他能够通过last这个指令读出来! 但是使用cat时,会读出乱码~因为他是属于一种特殊格式的文件。
称为纯文本文件是因为内容为我们人类可以直接读到的数据,例如数字、字母等等。 几乎只要我们可以用来做为设置的文件都属于这一种文件类型。 举例来说,你可以下达“ cat ~/.bashrc ”就可以看到该文件的内容。(cat 是将一个文件内容读出来的指令)
- 目录(directory):
就是目录啰~第一个属性为 [ d ],例如 [drwxrwxrwx]
- 链接文件(link):
就是类似Windows系统下面的捷径啦! 第一个属性为 [ l ](英文L的小写),例如 [lrwxrwxrwx] ,相当于windows的快捷方式
- 设备与设备文件(device):
与系统周边及储存等相关的一些文件, 通常都集中在/dev这个目录之下!通常又分为两种:区块(block)设备文件 :就是一些储存数据, 以提供系统随机存取的周边设备,举例来说,硬盘与软盘等就是啦! 你可以随机的在硬盘的不同区块读写,这种设备就是区块设备啰!你可以自行查一下/dev/sda看看, 会发现第一个属性为[ b ]喔!字符(character)设备文件:亦即是一些序列埠的周边设备, 例如键盘、鼠标等等!这些设备的特色就是“一次性读取”的,不能够截断输出。 举例来说,你不可能让鼠标“跳到”另一个画面,而是“连续性滑动”到另一个地方啊!第一个属性为 [ c ]。
- 数据接口文件(sockets):
既然被称为数据接口文件, 想当然尔,这种类型的文件通常被用在网络上的数据承接了。我们可以启动一个程序来监听用户端的要求, 而用户端就可以通过这个socket来进行数据的沟通了。第一个属性为 [ s ], 最常在/run或/tmp这些个目录中看到这种文件类型了。
- 数据输送档(FIFO, pipe):
FIFO也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题。FIFO是first-in-first-out的缩写。第一个属性为[p]
设备文件是我们系统中很重要的文件,最好不要随意修改。socket与FIFO文件比较难理解,因为这两个咚咚与程序(process)比较有关系, 这个等到未来你了解process之后,再回来查阅吧!此外, 你也可以通过man fifo及man socket来查阅系统上的说明!
文件拓展名
基本上,Linux的文件是没有所谓的“扩展名”的。Linux文件能不能被执行,与他的第一栏的十个属性有关, 与文件名根本一点关系也没有。这个观念跟Windows的情况不相同喔!在Linux下面,只要你的权限当中具有x的话,例如[ -rwxr-xr-x ] 即代表这个文件具有可以被执行的能力喔!
Tips具有“可执行的权限”以及“具有可执行的程序码”是两回事!在 Linux 下面,你可以让一个文本文件,例如有任意文本内容的 text.txt 具有“可执行的权限” (加入 x 权限即可), 但是这个文件明显的无法执行,因为他不具备可执行的程序码!而如果你将上面提到的 cat 这个可以执行的指令,将他的 x 拿掉,那么 cat 将无法被你执行!可以被执行跟可以执行成功是不一样的~举例来说,在root主文件夹下的 initial-setup-ks.cfg 是一个纯文本文件,如果经由修改权限成为 -rwxrwxrwx 后,这个文件能够真的执行成功吗? 当然不行~因为他的内容根本就没有可以执行的数据。所以说,这个x代表这个文件具有可执行的能力, 但是能不能执行成功,当然就得要看该文件的内容啰~
虽然在Linux中没有所谓的拓展名,但是我们仍利用拓展名来了解该文件是什么类型的,了解该文件可能的用途。常用的扩展名:
- .sh :
脚本或批处理文件 (scripts),因为批处理文件为使用shell写成的,所以扩展名就编成 .sh啰;
- Z, .tar, .tar.gz, .zip, *.tgz:
经过打包的压缩文件。这是因为压缩软件分别为 gunzip, tar 等等的,由于不同的压缩软件,而取其相关的扩展名啰!
- .html, .php:
网页相关文件,分别代表 HTML 语法与 PHP 语法的网页文件啰! .html 的文件可使用网页浏览器来直接打开,至于 .php 的文件, 则可以通过 client 端的浏览器来 server 端浏览,以得到运算后的网页结果呢!
案例
例如你在网络上下载一个可可执行文件,但是偏偏在你的Linux系统中就是无法执行!呵呵!那么就是可能文件的属性被改变了!不要怀疑,从网络上传送到你的Linux系统中,文件的属性与权限确实是会被改变的喔!
Linux文件名限制
长度限制
在Linux下面,使用传统的Ext2/Ext3/Ext4文件系统以及近来被 CentOS 7 当作默认文件系统的 xfs 而言,针对文件的文件名长度限制为:
单一文件或目录的最大容许文件名为 255Bytes,以一个 ASCII 英文占用一个 Bytes 来说,则大约可达 255 个字符长度。若是以每个中文字占用 2Bytes 来说, 最大文件名就是大约在 128 个中文字之谱
我们希望Linux的文件名称可以一看就知道该文件在干嘛的, 所以文件名通常是很长很长
名称限制
由于Linux在命令行下的一些指令操作关系,一般来说,你在设置Linux下面的文件名称时, 最好可以避免一些特殊字符比较好!例如下面这些
? > < ; & ! [ ] | \ ' " ` ( ) { }
因为这些符号在命令行下,是有特殊意义的!另外,文件名称的开头为小数点“.”时, 代表这个文件为“隐藏文件”喔!同时,由于指令下达当中,常常会使用到 -option 之类的选项, 所以你最好也避免将文件文件名的开头以 - 或 + 来命名啊!
Linux目录配置
配置的依据
Filesystem Hierarchy Standard (FHS)
他们的主要目的是希望让使用者可以了解到已安装软件通常放置于那个目录下, 所以他们希望独立的软件开发商、操作系统制作者、以及想要维护系统的使用者,都能够遵循FHS的标准。 也就是说,FHS的重点在于规范每个特定的目录下应该要放置什么样子的数据而已。 这样做好处非常多,因为Linux操作系统就能够在既有的面貌下(目录架构不变)发展出开发者想要的独特风格。
FHS仅是定义出最上层(/)及次层(/usr, /var)的目录内容应该要放置的文件或目录数据, 因此,在其他次目录层级内,就可以随开发者自行来配置了。
根目录 (/) 的意义与内容:
根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与开机/还原/系统修复等动作有关。 由于系统开机时需要特定的开机软件、核心文件、开机所需程序、函数库等等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。 因为根目录是这么的重要,所以在FHS的要求方面,他希望根目录不要放在非常大的分区内, 因为越大的分区你会放入越多的数据,如此一来根目录所在分区就可能会有较多发生错误的机会。
因此FHS标准建议:根目录(/)所在分区应该越小越好, 且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好。 如此不但性能较佳,根目录所在的文件系统也较不容易发生问题。