第五章、第六章与第七章是初开始接触Linux精髓–文件、目录与磁盘格式的一隅,可以真正体会到Linux组织文件的特性。第五章这里鸟哥在他的书中给出了很多有趣的样例,一定要亲自尝试才有豁然开朗的感觉。
任何一个文件都具有用户(User)、所属群组(Group)、及其他人(Others)三种身份的个别权限
1.文件拥有者:设置适当的权限后,他人无法指导该文件的内容,只有文件拥有者,才能查看修改
2.用户与用户组:鸟哥举出了一个很形象的例子:王家兄弟三人,三人又各有各的房间,又共有一个客厅,三人可进入对方的房间但不能乱翻对方的抽屉,这意味着每个用户有自己的私人空间,三人在客厅则可以随意使用物品,因为这是三兄弟的家,这个家就是用户组,房子在老大的名下,即老大是用户组的拥有者,用户组的存在是为了方便团队协同工作,三个用户虽然在同一用户组内,但可以设置某些权限,好让某些用户个人的信息不被用户组的拥有者查询,保留私人的空间。
3.其他人:王家之外与王家无关的人
4.root:万能的天神,可以到达任何他想要到达的地方
5.用户加入用户组:当某个Linux账号,即该用户加入某个用户组,该账号就可以使用该用户组能够读写的资源,每个账号可以加入的用户组个数基本上没有限制
6.记录上述信息的文件:所有系统上的账号与一般身份用户,还有root的相关信息,都记录在/etc/passwd这个文件内,个人的密码记录在/etc/shadow这个文件内,Linux所有的组名都记录在/etc/group中,三个文件是账号、密码、用户组信息的集中地,切勿随意删除
经常操作文件时出现的Permission deny肯定是设置权限错误,先了解文件属性,再看看其中的大头:权限、拥有者、用户组。本节鸟哥建议使用root身份学习,因为许多命令只有他才能操作,但不建议直接登录root,而建议用su -这个命令切换身份。
ls -al旨在列出所有的文件详细的权限与属性(包含隐藏文件,即以.开头的文件),从左往右每一列依次代表文件类型权限、连接数、文件拥有者、文件所属用户组、文件大小、文件最后被修改的时间、文件名。
1.第一列的第一个字符代表这个文件是:(d)目录、(-)文件、(|)链接文件、(b)设备文件里面的可供存储的周边设备、(c)设备文件里面的串行端口设备如键盘、鼠标
2.紧跟着的九个字符,三个为一组,且均为rwx的三个参数的组合,r-read、w-write、x-execute,可读、可写、可执行的三个权限位置不变,没有该权限就显示-而已
3.三组权限第一组文文件拥有者可具备的权限,第二组为加入此用户组之账号的权限,第三组为非本人且没有加入本用户组的其他账号的权限,不论是哪一组权限,都是针对账号本身才会谈权限这个概念。
4.第二列表示又多少文件名链接到此节点(inode),即又多少不同的文件名链接到同一个inode号码
5.第三列表示这个文件(或目录)的拥有者账号,第四列表示这个文件所属用户组,第五列表示文件容量大小,第六列表示文件的创建日期或是最近的修改日期,第七列为文件名
6.改变系统默认的语系,可以通过nano文本编辑器修改系统配置文件/etc/locale.conf,改变LANG变量
7.文件名之前带.的,是隐藏文件,单纯使用ls命令列出非隐藏文件名,ls -a列出所有文件名
8./etc/shadow这一个文件因为记录了系统中所有账号的数据,是极其重要的配置文件,不能让任何人读取,只有root可以读取,文件的权限是- - - - - - - - - -
chgrp:修改文件所属用户组,使用选项-R,可进行递归(recursive)修改,即联通子目录下的所有文件,目录都更新成为这个用户组之意,常常用在修改某一目录内所有的文件的情况
[root@study ~]# chgrp [-R] dirname/filename
chown:修改文件拥有者,还可以顺便直接修改用户组的名称,账号名称放在冒号左侧,用户组名称放在右侧(见下),递归修改同上
[root@study ~]# chown [-R] 账号名称 文件或目录
[root@study ~]# chown root:root initial-setup-ks.cfg
也可以使用chwon user.group file来进行修改,但鉴于账号中可能含有“.”,为避免误判,建议采用“:”。
chmod:修改文件的权限(含SUID、SGID、SBIT等特性)
#数字类型修改
[root@study ~]# chmod [-R] xyz 文件或目录
#xyz即数字类型的权限属性,r:4,w:2,x:1,累加型记录
[root@study ~]# chmod 777 .bashrc
[root@study ~]# ls -al .bashrc
-rwxrwxrwx. 1 root root 176 ……
[root@study ~]# chmod 755 filename
#不想让别人修改文件就设置成755
[root@study ~]# chmod 740 filename
#不希望别人看到文件就设置成740
#符号类型修改
#三种身份权限用u、g、o代替,还可以用all代表全部身份,用+(加入)、-(移除)、=(设置)
[root@study ~]# chmod u=rwx,go=rx .bashrc
[root@study ~]# ls -al .bashrc
-rwxr-xr-x. 1 root root
[root@study ~]# chmod a+x filename
#想要一个程序可以拥有执行的权限,又不知道原有的权限可以直接加
cp:复制文件给你之外的其他人,由于复制操作回复制执行者的属性与权限,不一定利于其他人的使用,需要搭配chmod
[root@study ~]# cp 源文件 目标文件
文件权限:
r:可读取此文件的实际内容,如读取文本文件的文字内容
w:可以编辑、新增或是修改该文件的内容(但不删除该文件)
x:该文件具有可以被系统执行的权限,Linux下一个文件的执行能力交友此权限判断,与文件名无关(不同于Windows的扩展名)
文件的rwx与文件名的存在与否没有关系,因为文件记录的是实际的数据,与文件名有紧密联系的是目录权限。
目录权限:
r:表示具有读取目录结构列表的权限,拥有即可查询该目录下的文件名数据,就可以利用ls这个命令列出目录里的内容
w:表示具有改动该目录结构列表的权限:建立新的文件与目录、删除已经存在的文件与目录(不论该文件的权限)、将已经存在的文件或目录进行更名、移动该目录内的文件和目录位置
x:代表的是用户能进入该目录成为工作目录的用途,常用的变换目录的命令是cd(change directory),r乍看之下好像具有可以进入此目录都权限,但事实上能不能进入某一个目录仅由该目录的x权限决定,如果少了此权限,基本用户拥有该目录下的r或w的权限,也无法执行该目录下的任何命令
要开放目录给任何人浏览时,至少要给予r及x的权限。
可否删除一个文件仅取决于用户对该文件所在目录的权限,而非对该文件的权限。
很多时候,把目录比作抽屉,文件比作抽屉里的小盒子,有r的权限可以理解为抽屉里有光,有x的权限可以理解为有打开抽屉的钥匙,r对于操作小盒子是非必备的,但没有r,使用tab键无法自动帮住补齐文件名。
常规文件(regular file)(-):纯文本文件(ASCII),比如可以执行cat ~/.bashrc查看文件内容;二进制文件(binary),系统其实仅认识且可执行这类文件,Linux当中的可执行文件(scripts,脚本文件不算),刚刚的命令cat就是一个二进制文件;数据文件(data),有些程序在运行的过程当中回读取某些特定格式的文件,那些特定格式的文件可被称为数据文件,它能够通过last命令读出,用cat读时回出现乱码,因为它是属于一种特殊格式的文件。
目录(d):存放文件的“抽屉”
链接文件(l):类似Windows下面的快捷方式
设备与设备文件(device):区块设备文件(b):一些存储数据,以提供系统随机存取的接口设备,比如/dev/sda的第一个属性;字符设备文件(c):一些穿行端口的接口设备,例如键盘、鼠标等,这些设备不能够截断输出(就是不能让鼠标在界面上跳跃的移动)。设备文件是我们系统中很重要的文件,最好不要随意修改(通常也改不了)
数据接口文件(sockets)(s):通常被用在网络上的数据交换,最常在/run或/tmp这些个目录中看到这种文件类型
数据输送文件(FIFO,pipe)(p):解决多个程序同时读写一个文件所造成的错误问题
鸟哥特别强调:一个Linux的文件能不能被执行,与它的第一栏的是个属性有关,与文件名根本一点关系也没有,另外具有可执行的权限以及具有可执行的程序代码是两回事。比如文件有了x权限仅代表当前用户对该文件具有可执行的能力,能不能执行成功,由文件内容决定。
但Linux中仍会使用扩展名来表示该文件是什么种类,文件的用途等:
sh:脚本或批处理文件(scripts)
Z、.tar、.tar.gz、.zip、.tgz:经过打包的压缩文件
.html、.php:网页相关文件
从网络上下载到你的Linux系统中,文件的属性与权限是会被修改的,因此遇到网上下载的可执行文件无法执行,就可能是文件的属性被修改了。
Linux的文件名通常很长。
文件名长度限制:单一文件或目录的最大容许文件名为255字节,以一个ASCII英文占用1字节来说,大约可达255个字符长度,以每个汉字2字节来说,最大文件名大约128个汉字
文件名的字符限制:避免出现:*、?、>、<、;、&、!、[、]、|、’、"、`、(、)、{、},因为它们在命令行模式下由特殊意义,又鉴于命令中的option会有+、-,因此也不建议使用
FHS:Filesystem Hierarchy Standard是一种标准,重点在于规范每个特定的目录下应该要防止什么样子的数据,FHS将目录定义成为四种交互作用的形态,可分享(可以分享给其他系统挂载使用的目录,包括执行文件与用户的邮件等数据)、不可分享(设备文件或是与程序有关的socket文件)、不变(函数库、文件说明、系统管理员所管理的主机服务配置文件)、可变动(经常修改的数据,如日志文件,一般用户可自行接收的新闻组),事实上FHS仅定义出三层目录下面应该放置什么数据而已,剩下的都交由各开发者的自行发挥了。
三层目录:如下三层目录中每层下面要放置的目录由特别规定
/(root):不但所有目录都由根目录衍生出来,同时其与启动、还原、系统修复等操作有关,FHS建议根目录所在分区越小越好,且应用程序安装的软件最好不要与根目录放在同一个分区内,保证性能。
鸟哥详细列举了其下属目录及目录应放置文件内容,这里简略说明:
目录 | 应放置文件内容 |
---|---|
/bin | 有许多用户可用的常见命令,cat、chmod、chown等 |
/boot | 放置启动会使用到的文件(内核常用文件名:vmlinuz) |
/dev | 通过读写这个目录下面的某个文件就等于读写某个设备 |
/etc | 放系统主要的配置文件,文件属性一般用户可看,但只要root用户可改,建议其中不放可执行文件,其下必须有/etc/opt放置第三方辅助软件/opt的相关配置文件 |
/lib | 放置启动时会用到的函数库,及在/bin或/sbin下面的命令会调用的函数库,其下必须有/lib/modules,放置可抽换式的内核相关模块 |
/media | 放置可删除的设备,包括光盘等设备都暂时挂载于此 |
/mnt | 放置想要暂时挂载的某些额外设备 |
/opt | 放置第三方辅助软件,比如想要自行安装额外的软件(非原本发行版提供),也可以安装至此 |
/run | 放置启动后所产生的各项信息 |
/sbin | 放置启动过程中所需要的,包括了启动、修复、还原系统所需要的命令,如:fdisk、fsck、ifconfig、mkfs |
/srv | 一些网络服务启动之后所需使用的数据目录 |
/tmp | 让一般用户或是正在执行的程序暂时放置文件的地方,绝不可放重要数据 |
/usr | 见下 |
/var | 见下 |
上面是FHS要求必须存在的目录,FHS还建议可存在的有/home、/lib (带"qual"用来存放与上表中的/lib不同格式的二进制函数库)、/root目录。
/目录中,/sbin、/bin、/lib以链接文件形式显示,因为它们现在通通移到了/usr中
/usr(unix software resource):与软件安装/执行有关,放置的数据属于可分享与不可变动,它的缩写是指UNIX操作系统软件资源所放置的目录,不要误认,这个目录像是Windows中"C:\windows\(当中的一部分)+C:\Program Files"这两个目录的合体
目录 | 应放置文件内容 |
---|---|
/usr/bin/ | 一般用户能够使用的命令都放在此,此目录下不应该有子目录,链接了/bin |
/usr/lib/ | 基本同/lib,链接了/lib |
/usr/local/ | 系统管理员在本机安装自己下载的软件(非发行版默认提供者),建议安装到此 |
/usr/sbin/ | 非系统正常运行所需要的系统命令,最常见的是某些网络服务器软件的服务命令(daemon) |
/usr/share/ | 放置只读的数据文件,包括共享文件,此目录下放置第数据几乎不分硬件架构均可读取的数据,其下常见:/usr/share/man:在线帮助文档,/usr/share/doc:软件的说明文档,/usr/share/zoneinfo:与时区有关的文档 |
上面是FHS要求必须存在的目录,FHS还建议可存在的有/usr/games/(与游戏相关)、/usr/include/(c/c++等程序语言的头文件与包含文件放置处,使用Tarball安装某些程序时会用)、/usr/libexec/(某些不被一般用户常用的执行文件或脚本)、/usr/lib/(,带“qual”,同/lib/,链接到此)、/usr/src/(源代码建议放置到此,内核源代码建议放置到/usr/src/Linux/)
/var(variable):与系统运行过程有关,如果说/usr是安装时会占用较大硬盘容量的目录,/var就是在系统运行后才会渐渐占用硬盘容量的目录,其主要针对经常性变动的文件,包括缓存(cache)、日志文件(log file)以及某些软件运行所产生的文件,包括程序文件,或例如MySQL数据库的文件。
目录 | 应放置文件内容 |
---|---|
/var/cache/ | 应用程序本身运行过程中会产生的一些缓存 |
/var/lib/ | 程序本身执行的过程中,需要使用的数据文件放置在此 |
/var/lock/ | 某些设备或是文件资源一次只能被一个应用程序所使用,如果同时有两个程序使用该设备时,就可能产生一些错误的状况,因此就得要将该设备上锁(lock),一曲包该设备只会给单一软件所使用 |
/var/log/ | 日志文件放置在此,极其重要的目录,其下比较重要的文件有:/var/log/messages、/var/log/wtmp |
/var/mail/ | 放置个人电子邮箱的目录,也放置到/var/spool/mail/目录中,互为链接文件 |
/var/run/ | 某些程序或是服务启动后,会将它们的PID放置在此 |
/usr/spool/ | 通常放置一些队列数据 |
还有一些非常重要的目录。
目录 | 应放置文件内容 |
---|---|
/lost+found | 使用标准ext2、ext3、ext4文件系统格式才会产生的一个目录,目的在于当文件系统发生错误时,将一些遗失的片段放置到这个目录下 |
/proc | 本身是一个虚拟文件系统(virtual filesystem),它放置的数据都在内存当中,本身不占任何硬盘空间 |
/sys | 也是一个虚拟的文件系统,像/proc,主要也是记录内核与系统硬件信息相关的内推,同样不占硬盘容量 |
还有FHS官方英文文档FHS 3.0供参考。
通过前面的表格和描述可以发现CentOS 7将许多原本应该要在根目录里的目录,将它内部数据全部移动到/usr里了,然后进行链接设置。
PS:Linux还有个LSB标准
所有文件与目录都是由根目录开始的,然后再一个一个分支下来,这种目录配置方式称为目录树。
特性:
1.目录树的起始点为根目录
2.每一个目录不止能使用本地分区的文件系统,也可以使用网络上的文件系统
3.每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的
这是根目录下的实际情况:
在第二章鸟哥曾建议过有经验的选手将/var独立出来,这样对于系统的数据还有一些安全性的保护,因为至少/var死掉时,根目录依然活着,能够进入恢复模式。
绝对路径:由根目录开始写起的文件名或目录名称,如/home/xxxx/.bashrc
相对路径:相对于目前路径的文件名写法,如./home/xxxx或…/…/home/xxxx/,开头不是/,就是相对路径。".“代表当前的目录,也可以使用./表示,想要进入当前目录的下一级目录时可用此替代前面所有级目录,后面直接跟下级的目录即可;”…"代表上一层目录,也可以使用…/表示,想要进入上一级目录下与当前目录平级的目录,或是更下一级的目录(非当前目录的下一级)时使用。
使用相对路径时非常方便快捷的,冗长的文件名不用从根目录写起。
网络文件常提到类似“./run.sh”的数据:由于命令的执行需要变量的支持,若你的执行文件放置在本目录,并且本目录并非常规的执行文件目录,此时要执行命令就得要严格指定该执行文件。“./”代表“本目录”,“./run.sh”代表执行本目录下名为run.sh的文件。
本想将5、6章一起划重点,但发现第五章光是谈权限内容就不少,第6章的各色命令留作下一篇再体味。