代码改变世界

《鸟哥的Linux私房菜 基础学习篇(第三版)》 第06章 Linux的文件权限与目录配置 笔记

2018-03-28 23:12  受匕图灵  阅读(335)  评论(0)    收藏  举报

一、账号相关文件

/etc/passwd文件:记录所有的系统上的账号(一般身份用户与root)的相关信息。

/etc/shadow文件:记录个人的密码。不能让任何人读取,否则密码会被窃取,只有root才能够读取。该文件的权限为[-rw-------]。

/etc/group文件:记录所有的组名。

 

二、Linux 文件基本属性

使用ll或者ls –l命令来显示一个文件的属性以及文件所属的用户和组:

[root@www /]# ls -l
total 64
dr-xr-xr-x
2
root
root
4096
Dec 14  2012
bin
dr-xr-xr-x
4
root
root
4096
Apr 19  2012
boot
……
           
[1]
[2] [3] [4] [5] [6] [7]
[文件的类型和权限]
[连接数]
[文件或者目录的所有者]
[文件所属的用户组]
[文件容量,默认单位为B]
[创建日期或修改日期]
[文件名]
 

2.1、ls -l --full -time 命令

显示完整的时间格式。

由于中文没有办法在纯文本终端机模式中正确显示,所以此栏可能会变成乱码,解决办法为使用“LANG=en_US”命令修改系统语言为英文,或者修改系统配置文件“/etc/sysconfig/i18n”。

2.2、文件的类型和权限

363003_1227493859FdXT
第1列的第一个字符代表文件的类型:
  • [d] 目录。directory
  • [-] 文件。regular file。依照文件内容可分为纯文本文件(ASCII)、二进制文件(binary)、数据格式文件(data)。
  • [l] 链接文文件(link file)。
  • [b] 块设备文件。block。设备文件里面的可供储存的接口设备(可随机存取设备)。
  • [c] 字符设备文件。character。设备文件里面的串行端口设备,例如键盘、鼠标(一次性读取设备)。
  • [s] 套接字。sockets。数据接口文件,通常被用在网络上的数据连接。
  • [p] 管道。FIFO,pipe。FIFO是first-in-first-out的缩写。一种特殊的文件类型,此文件类型主要的目的在解决多个程序同事访问一个文件所造成的错误问题。

接下来的9个字符是“rwx“3个一组的3组的权限参数的组合。[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]。

 

2.3、文件与目录的权限意义

文件是存放实际数据的所在,目录主要的内容是记录文件名列表。

x权限对于文件:在windows系统中,一个文件是否具有执行的能力是通过“扩展名”来判断,例如.exe、.bat、.com等。但Linux系统中文件是否能被执行与文件名没有绝对关系,而是由是否具有“x”权限决定。

不过我们仍然希望可以用扩展名来了解文件是什么东西,通常以适当的扩展名来表示该文件是什么种类的:

  • *.sh:脚本或批处理文件(scripts)
  • *Z、*.tar、*.tar.gz、*.zip、*.tgz:经过打包的压缩文件
  • *.html、*.php:网页相关文件

r权限对于目录:能够读取目录结构列表,能够查询该目录下的文件名数据。

w权限对于目录:

  • 新建文件、目录。
  • 删除文件、目录,不论该文件的权限为何。
  • 重命名文件、目录。
  • 转移该目录内的文件、目录的位置。

x权限对于目录:用户能否进入该目录成为工作目录(work directory),即目前所在的目录。

 

2.4、文件属主和属组

每个文件都有一个特定的所有者,就是对该文件具有所有权的用户。

在Linux系统中,用户是按组分类的,一个用户属于一个或多个组。

文件所有者以外的用户分为文件所有者的同组用户和其他用户。

因此,Linux系统按文件所有者、文件所有者同组用户和其他用户来规定了不同的文件访问权限。

书中实例中,mysql 文件是一个目录文件,属主和属组都为 mysql,属主有可读、可写、可执行的权限;与属主同组的其他用户有可读和可执行的权限;其他用户也有可读和可执行的权限。

注意,一般情况下,文件的权限对root 用户不起作用。

 

2.4.1、chgrp:更改文件属组

语法:

chgrp [-R] 属组名文件名

参数选项:

  • -R:递归更改文件属组。就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。

 

2.4.2、chown:更改文件属主,也可以同时更改文件属组

语法:

chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名(用小数点.来代替冒号:也是允许的)

实例。进入 /root 目录(~)将install.log的拥有者改为bin这个账号:

[root@www ~] cd ~
[root@www ~]# chown bin install.log
[root@www ~]# ls -l
-rw-r--r--  1 bin  users 68495 Jun 25 08:53 install.log

实例。将install.log的拥有者与群组改回为root:

[root@www ~]# chown root:root install.log
[root@www ~]# ls -l
-rw-r--r--  1 root root 68495 Jun 25 08:53 install.log

注意:
chown root.root install.log 命令也是允许的,所以新增账号时不要包含小数点,例如:wbird.tsai这样的账号格式,避免造成系统误判。

2.4.3、chmod:更改文件的9个属性

Linux文件属性有两种设置方法,一种是数字,一种是符号。

2.4.3.1、数字类型改变文件权限

变更权限的命令chmod的语法:

 chmod [-R] xyz 文件或目录

选项与参数:

  • xyz : 权限数字属性,x、y、z的大小分别为各自的rwx 属性数值相加。
  • -R : 进行递归(recursive)的持续变更,亦即连同子目录下的所有文件都会变更
  • 字符权限和数字对照表:
    • 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

所以设定权限的变更时,该文件的权限数字就是770!

实例。将.bashrc这个文件所有的权限都设定启用,命令如下:

[root@www ~]# ls -al .bashrc
-rw-r--r--  1 root root 395 Jul  4 11:45 .bashrc
[root@www ~]# chmod 777 .bashrc
[root@www ~]# ls -al .bashrc
-rwxrwxrwx  1 root root 395 Jul  4 11:45 .bashrc

那如果要将权限变成 -rwxr-xr-- 呢?那么权限的分数就成为 [4+2+1][4+0+1][4+0+0]=754。

 

2.4.3.2、符号类型改变文件权限

语法: 

chmod u
g
o
a
+(加入)
-(减去)
=(设置)
r
w
x
文件或目录

 选项与参数:

  • u(user):所有者
  • g(group):用户组
  • o(others):不属于用户组的其他用户
  • a(all):全部的身份,默认

实例。将文件权限设置为-rwxr-xr--

#  touch test1    // 创建 test1 文件
# ls -al test1    // 查看 test1 默认权限
-rw-r--r-- 1 root root 0 Nov 15 10:32 test1
# chmod u=rwx,g=rx,o=r  test1    // 修改 test1 权限
# ls -al test1
-rwxr-xr-- 1 root root 0 Nov 15 10:32 test1

实例。拿掉全部人的可执行权限而不改变读写权限:

#  chmod  a-x test1
# ls -al test1
-rw-r--r-- 1 root root 0 Nov 15 10:32 test1

 

2.5、文件名限制

  • 单一文件或目录的最大容许文件名为255个字符。
  • 包含完整路径名称及目录(/)的完整文件名为4096个字符。
  • 由于Linux在文字界面下的一些命令操作关系,设置Linux文件名时,最好避免一些特殊字符如* ? > < ; & ! [ ] | \ ' " ` ( ) { }

 

三、Linux目录配置标准:FHS(Filesystem Hierarchy Standard)标准

将目录定义成为四种交互作用的形态:

  可分享的(shareable) 不可分享的(unshareable)
不变的(static)  /usr (软件放置处) /etc (配置文件)  
/opt (第三方协力软件) /boot (开机与内核文件)  
可变动的(variable)  /var/mail (用户邮件信箱) /var/run (程序相关)  
/var/spool/news (新闻组) /var/lock (程序相关)  

针对目录树架构定义:

  • /(root,根目录):与开机系统有关。
  • /usr(UNIX software resource):与软件安装/执行有关。
  • /var(variable):与系统运作过程有关。

 

3.1、根目录(/)

root以“账号”的角度来看,指的是“系统管理员”的身份。root以“目录”的角度来看,指的是根目录(/)。

所有的目录都是由根目录衍生出来的,同时根目录也与开机、还原、系统修复等操作有关。由于系统开机时需要特定的开机软件、内核文件、开机所需程序、函数库等文件数据,若系统出现错误时,根目录也需要包含有能够修复文件系统的程序才行。 因为根目录是这么的重要,所以在FHS的要求方面,他希望根目录不要放在非常大的分区内, 因为越大的分区你会放入越多的数据,如此一来根目录所在分区就可能会有较多的发生错误的机会。因此FHS标准建议:根目录(/)所在分区应该越小越好,且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小也好。如此不但效能较佳,根目录所在的文件系统也较不容易发生问题。

根目录下应该有如下子目录:

目录  应放置文件内容
/bin

 系统有很多放置执行文件的目录,但/bin 比较特殊。因为/bin 放置的是在单用户维护模式下还能够被操作的命令。在/bin下面的命令可以被root与一般账号所使用,主要有cat,chmod,chown,date,mv,mkdir,cp,bash等常用的命令

 /boot

 这个目录主要是放置开机会使用到的文件,包括Linux内核文件以及开机菜单与关机所需配置文件等。Linux Kernel常用的文件名为:vmlinuz,如果使用的是grub这个引导装载程序,则还会存在/boot/grub/这个目录

 /dev

 在Linux系统上,任何设备与接口设备都是以文件的形态存在于这个目录当中的。你只要通过访问这个目录下面的某个文件,就等于访问某个设备。比较重要的文件有/dev/null,/dev/zero,/dev/tty,/dev/lp*,/dev/hd*,/dev/sd*等

 /etc
系统主要的配置文件几乎都放置在这个目录内,例如人员的账号密码文件,各种服务的起始文件等。
一般来说,这个目录下的各文件属性是可以让一般用户查阅的,但是只有root有权限修改。
FHS建议不要放置可执行文件(binary)在这个目录中。
比较重要的文件有:/etc/inittab,/etc/init.d,/etc/modprobe.conf,/etc/X11,/etc/fstab,/etc/sysconfig等。
另外,其下重要的目录有:
  • /etc/init.d/:所有服务的默认启动脚本都是放在这里的。
    • 例如要启动或关闭iptables 的话:“/etc/init.d/iptables start“、“/etc/init.d/iptables stop“
  • /etc/xinetd.d/:这就是所谓的super daemon管理各项服务的配置目录
  • /etc/X11/:与Xwindow有关的各种配置文件都在这里,尤其是 xorg.conf 或 XF86Config 这两个 X Server 的配置文件。
 /home
这个系统默认的用户主文件夹(home directory)。在你新增一个一般用户账号时,默认的用户主文件夹都会规范到这里来。
比较重要的是,主文件夹有两种代号:
~:代表目前这个用户的主文件夹
~dmtsai :则代表dmtsai 的主文件夹
 /lib

 系统的函数库非常多,而/lib放置的则是在开机时会用到的函数库,以及在/bin或/sbin 下面的命令会调用的函数库而已。什么是函数库呢?你可以将它想成是“外挂“,某些命令必须要有这些“外挂“才能够顺利完成程序的执行之意。尤其重要的是/lib/modules/这个目录,因为该目录会放置内核先关的模块(驱动程序)

 /media

 media是“媒体“的英文,顾名思义,这个/media下面放置的就是可删除的设备。包括软盘、光盘、DVD等设备都暂时挂载于此。常见的文件名有media/floppy, /media/cdrom等

 /mnt

如果你想要暂时挂载某些额外的设备,一般建议你可以放置到这个目录中。在比较早的时候,这个目录的用途与/media相同,只有在了/media 之后,这个目录就用来暂时挂载用了 

/opt
这个是给第三方软件放置的目录。什么是第三方软件啊?举例来说,KDE这个桌面管理系统是一个独立的计划,不过他可以安装到Linux系统中,
因此KDE的软件就建议放置到此目录下了。 另外,如果你想要自行安装额外的软件(非原本的distribution提供的),
那么也能够将你的软件安装到这里来,不过,以前的Linux系统中,我们还是习惯放置在/user/local目录下
/root
系统管理员(root)的主文件夹。之所以放在这里,是因为如果进入单用户维护模式而仅挂载根目录时,该目录就能够拥有root的主文件夹,
所以我们会希望root的主文件夹与根目录放置在同一个分区
/sbin
Linux有非常多的命令时用来设定系统环境的, 这些命令只有root 才能够用来“设置”系统,其他用户最多只能用来“查询“而已。
放在/sbin 下面的为开机过程中所需要的,里面包括了开机、修复、还原系统所需要的命令。 至于某些服务器软件程序,
一般则放置到/user/sbin当中。 至于本机自行安装的软件所产生的系统执行文件(system binary),则放置到/user/local/sbin/当中了。
常见的命令包括: fdisk,fsck,ifconfig,init,mkfs 等
 /srv

srv可以视为“service“的缩写,是一些网络服务启动之后,这些服务所需要取用的数据目录。 常见的服务例如WWW,FTP等。举例来说,WWW服务需要的网页数据就可以放置在/srv/www里面 

/tmp
这是让一般用户或者是正在执行的程序暂时放置文件的地方。这个目录是任何人都能够访问,所以你需要定期的清理一下。
当然,重要数据不可放置在此目录。因为FHS甚至建议在开机时,应该要将/tmp下的数据都删除

事实上FHS针对根目录所定义的标准就仅有上面举例的数据,不过我们的Linux下面还有许多目录你也需要了解一下的。 下面是几个在Linux当中也是非常重要的目录:

目录 应放置文件内容
/lost+found

这个目录是使用标准的ext2/ext3文件系统格式才会产生的一个目录,目的在于当文件系统发生错误时, 将一些丢失的片段放置到这个目录下。这个目录通常会在分区的最顶层存在, 例如你加装一颗硬盘于/disk中,那在这个系统下就会自动产生一个这样的目录“/disk/lost+found”

/proc

这个目录本身是一个虚拟文件系统(virtual filesystem)。他放置的数据都是在内存当中, 例如系统内核、进程(process)、外部设备的状态及网络状态等。因为这个目录下的数据都是在内存当中, 所以本身不占任何硬盘空间啊!比较重要的文件例如:/proc/cpuinfo, /proc/dma, /proc/interrupts, /proc/ioports, /proc/net/* 等

/sys

这个目录其实跟/proc非常类似,也是一个虚拟的文件系统,主要也是记录与内核相关的信息。包括目前已载入的内核模块与内核检测到的硬件设备信息等。这个目录同样不占硬盘容量

除了这些目录的内容之外,另外要注意的是,因为根目录与开机有关,开机过程中仅有根目录会被挂载, 其他分区则是在开机完成之后才会持续的进行挂载的行为。就是因为如此,因此根目录下与开机过程有关的目录, 就不能够与根目录放到不同的分区去!那哪些目录不可与根目录分开呢?有下面这些:

 

  • /etc:配置文件

 

 

  • /bin:重要执行文件

 

 

  • /dev:所需要的设备文件

 

 

  • /lib:执行文件所需的函数与内核所需的模块

 

 

  • /sbin:重要的系统执行文件

 

3.2、/usr

是UNIX Software Resource(UNIX操作系统软件资源)的缩写,而不是user的缩写。

/usr中放置的数据属于可分享的与不可变动的。/user可以分享给局域网内的其他主机来使用。

所有系统默认的软件(distribution发布者提供的软件)都会放置在/usr下面,系统刚安装完毕时这个目录会占用最多的硬盘容量。

一般来说,/usr的子目录建议有下面这些:

目录 应放置文件内容
/usr/X11R6/ 为X Window System重要数据所放置的目录,之所以取名为X11R6是因为最后的X版本为第11版,且该版的第6次释出之意
/usr/bin/ 绝大部分的用户可使用命令都放在这里。请注意到他与/bin的不同之处(是否与开机过程有关)
/usr/include/ c/c++等程序语言的文件头(header)与包含文件(include)放置处,当我们以tarball方式 (*.tar.gz 的方式安装软件)安装某些数据时,会使用到里头的许多包含文件
/usr/lib/

包含各应用软件的函数库、目标文件(object file),以及不被一般用户惯用的执行文件或脚本(script)。某些软件会提供一些特殊的命令来进行服务器的设定,这些命令也不会经常被系统管理员操作, 那就会被摆放到这个目录下。要注意的是,如果你使用的是X86_64的Linux系统, 那可能会有/usr/lib64/目录产生

/usr/local/

系统管理员在本机自行安装自己下载的软件(非distribution默认提供者),建议安装到此目录, 这样会比较便于管理。举例来说,你的distribution提供的软件较旧,你想安装较新的软件但又不想移除旧版, 此时你可以将新版软件安装于/usr/local/目录下,可与原先的旧版软件有分别。你可以自行到/usr/local去看看,该目录下也是具有bin, etc, include, lib...的子目录

/usr/sbin/ 非系统正常运作所需要的系统命令。最常见的就是某些网络服务器软件的服务命令(daemon)
/usr/share/ 放置共享文件的地方,在这个目录下放置的数据几乎是不分硬件架构均可读取的数据, 因为几乎都是文字文件嘛!在此目录下常见的还有这些子目录:
  • /usr/share/man:在线帮助文件
  • /usr/share/doc:软件杂项的文件说明
  • /usr/share/zoneinfo:与时区有关的时区文件
/usr/src/ 一般源码建议放置到这里,src有source的意思。至于内核源码则建议放置到/usr/src/linux/目录下

3.3、/var

/var主要针对常态性变动的文件,包括缓存(cache)、登录文件(log file)以及某些软件运行所产生的文件,包括程序文件(lock file,run file)、MySQL数据库的文件等。是系统运行后才会渐渐占用硬盘容量的目录。

常见的子目录有:

目录 应放置文件内容
/var/cache/ 应用程序本身运作过程中会产生的一些暂存文件
/var/lib/ 程序本身执行的过程中,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。 举例来说,MySQL的数据库放置到/var/lib/mysql/而rpm的数据库则放到/var/lib/rpm去
/var/lock/

某些设备或者是文件资源一次只能被一个应用程序所使用,如果同时有两个程序使用该设备时, 就可能产生一些错误的状况,因此就得要将该设备上锁(lock),以确保该设备只会给单一软件所使用。举例来说,刻录机正在刻录一块光盘,你想一下,会不会有两个人同时在使用一个刻录机刻录? 如果两个人同时刻录,那片子写入的是谁的数据?所以当第一个人在刻录时该刻录机就会被上锁, 第二个人就得要该设备被解除锁定(就是前一个人用完了)才能够继续使用

/var/log/ 重要到不行!这是登录文件放置的目录!里面比较重要的文件如/var/log/messages, /var/log/wtmp(记录登入者的信息)等
/var/mail/ 放置个人电子邮件信箱的目录,不过这个目录也被放置到/var/spool/mail/目录中! 通常这两个目录是互为连接文件
/var/run/ 某些程序或者是服务启动后,会将他们的PID放置在这个目录下! 至于PID的意义我们会在后续章节提到的
/var/spool/

这个目录通常放置一些队列数据,所谓的‘队列’就是排队等待其他程序使用的数据! 这些数据被使用后通常都会被删除。举例来说,系统收到新信件会放置到/var/spool/mail/中, 但用户收下该信件后该封信原则上就会被删除。信件如果暂时寄不出去会被放到/var/spool/mqueue/中, 等到被送出后就被删除。如果是工作排程数据(crontab),就会被放置到/var/spool/cron/目录中


四、目录树

  • 目录树的起始点为根目录(/,root);
  • 每个目录除了使用本地端的文件系统外,还能使用网络上的文件系统,如利用Network File System(NFS)服务器挂载某特定目录等。
  • 每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的。

 

、查看distribution使用的是哪个Linux标准(Linux Standard Base)命令:

uname -r

或者

lsb_release -a