Linux中文件、目录和他们的权限

这篇文章是Linux就是这个范儿的读书笔记。

通过ls -l查看文件与目录及其属性:

-rwxr-xr-x 1 root root 27776 Apr 17 2012 arch
文件类型和权限 连接数 拥有者 用户组 文件大小 最后修改日期 文件名

基本属性与权限

- rwx r-x r-x
文件类型 拥有者 所属用户组 其他

第一个字符用于描述文件类型,可能的值:

  • “-” 普通文件
  • “d“ 目录文件
  • “l” 软连接,硬连接没有特殊标记
  • “b” 块设备,如磁盘等保存大块数据的设备
  • “c” 字符设备,如鼠标、键盘等需要串行读写的设备
  • “s” 套接字文件
  • “p” 命名管道文件

对于目录:

  • “x”权限控制用户是否能打开它,只有具备“x”权限的用户才能打开这个目录
  • 如果想使用ls命令来查看这个目录下的文件列表,则必须有“r”权限,否则即使有“x”也不行
  • 要在目录中创建文件,则需要“w”权限

对于其他类型的文件

  • 若想读取,则需要“r”权限
  • 若想使用编辑器编辑,就必须同时具备“r”和“w”这两个权限
  • 如果文件为shell脚本或其他可执行文件,具备“x”权限才能被执行

文件连接

背景知识-Linux保存文件的方法:

Linux所使用的文件系统是一种基于inode的文件系统。每一个新创建的文件都会被分配一个inode,而且每一个文件都有唯一的inode编号。可以简单理解inode为一个指向文件所在磁盘物理位置的指针。
“连接数”其实就是inode的引用计数。Linux允许一个文件有多个名字,文件名只是相当于对inode的一次引用。

  1. 软连接
    通过ln -s创建软连接
    1
    $ ln -s /bin/bash sh

创建一个新的软连接sh指向/bin/bash,使用“ls -l”查看:

1
lrwxr-xr-x. 1 shu shu 9 Jue 23 15:01 sh -> /bin/bash

软连接的文件属性和目标文件属性完全不同。软连接也要占据一个新的inode。

  1. 硬连接
    通过ln创建硬连接
    1
    $ ln /bin/bash bash

创建一个名为bash的硬连接到/bin/bash,使用“ls -l”查看:

1
lrwxr-xr-x. 1 shu shu 938736 Jue 23 15:01 bash

硬连接的属性跟目标文件完全相同,因为引用的是同一个inode。
硬连接要求必须与目标文件在同一分区

总结:

  • 删除文件连接的目标文件,软连接会失效,硬连接仅是“连接数”-1
  • 软连接可以创建在任何位置,包括网络。硬连接必须与目标文件在同一磁盘分区
  • 软连接与硬连接使用时区别不大,都相当于是一个文件具有不同的路径和文件名

修改文件属性和权限

  • 修改文件名属性:mv
  • 修改最后更新时间:touch
  • 修改用户:chown [-R] username filename
    修改用户组:chown [-R] username:group filenamechgrp
  • 修改权限
    数字法:三位数字分表表示所有者、所属组、其他用户的权限,每位的值为r(4或0) + w(2或0) + x(1或0),如chmod 700 filename
    文字法:由[用户][行为][权限]组成。用户为u、g、o、a中一个,分别代表所有者、所属组、其他用户、所有用户。行为为+、-、=中一个,分别代表增加、减去、设定。权限为r、w、x自由组合。

深入文件权限

Linux文件权限除了r、w、x,还包括s和t两个特殊权限。
s标记可以出现在文件所有者的x权限位上,也可以出现在文件所属组的x权限位上。前者被称为Set UID,简称SUID,后者被称为Set GID,简称SGID。
t标记是其他用户专有,仅对目录有效。

SUID

  • SUID仅对二进制程序有效
  • 执行者对于改程序具有x的可执行权限
  • 执行权限仅在执行该程序的过程中有效
  • 执行者将具有该程序拥有者的权限

/bin/su的权限是-rwsr-xr-x,任何人执行它都会有root(它的所有者)权限,只是这个权限仅在执行的su命令中有效

设置方法:u+s在普通的三位数字前加4,如“4755”

SGID

SGID用于文件时:

  • SGID对二进制程序有效
  • 执行者对于该程序具有x的可执行权限
  • 执行者在执行的过程中将会获得该程序所属用户组的支持

/usr/bin/locate文件的权限为-rws--s--x,SGID的作用是任何用户执行该命令都能读取mlocate.db文件的内容,这个文件位于/var/lib/mlocate/mlocate.db

SGID用于目录时:

  • 用户若对于此目录拥有r与x权限时,该用户能够进入此目录
  • 该用户在此目录下的有效用户组将变成该目录的用户组
  • 若用于在此目录下具有w的权限,则用户所创建的新文件的用户组与此目录的用户组相同

设置方法:g+s在普通的三位数字前加2,如“2755”

SBIT

t权限只用户其他用户,名称是Sticky Bit,简称SBIT。仅对目录有效。

  • 用户若对此目录拥有w和x的权限,即拥有写的权限
  • 当用户在此目录下创建了文件或目录,仅自己与root才有权利删除文件

典型例子是/tmp目录

设置方法:o+t在普通的三位数字前加1,如“1755”

文件的基本操作

ls, cd, cp, rm, mv

搜索文件

whereis

用于搜索可执行文件、联机帮助文件和源代码文件
如:$ whereis ls
它不在磁盘中查找,而是在一个数据库中(/var/lib/mloate)查找。这个数据库是由Linux自动创建,包含本地所有文件的信息,并且每天通过执行updatedb命令更新一次。也可手动执行updatedb更新。

locate

locate与whereis相似,使用了相同的数据库,但locate使用了十分复杂的匹配语法,如果只是:
$ locate ls
就会匹配所有包含了’ls’的文件名和路径,很多时候这样的结果是不能使用的。要精确搜索可以:
$ locate -b "\ls"
这会将所有文件名为“ls”的文件路径列出

which(常用)

它只是在$PATH 环境变量中指定的路径来搜索可执行文件的所在位置,一般用来确认系统中是否安装了指定的软件,比如要确认是否安装了gcc:
$ which gcc

type

type是用来判断一个命令是否属于shell内置的,如:

1
2
3
4
5
6
[shu@localhost ~]$ type ls
ls is aliased to 'ls --color=auto'
[shu@localhost ~]$ type alias
alias is a shell builtin
[shu@localhost ~]$ type httpd
httpd is /usr/sbin/httpd

type -p用于不属于shell内置的命令时等同于which

find

find很强大,得另外专门学习

文件打包压缩

命令:tar
常用3种压缩算法:gzbz2xz,压缩率:gz<bz2<xz,压缩速度:gz>bz2>xz
解压tar包:
$ tar -vx -f filename,或
$ tar -vxf filename
后一种形式中,f选项一定要放在最后,因为f选项后面接的是文件名。

创建tar包:
gz算法:$ tar -zcvf filename.tar.gz FILES
bz2算法:$ tar -jcvf filename.tar.bz2 FILES
xz算法:$ tar -Jcvf filename.tar.xz FILES
其中FILES代表要被打包、压缩的文件或目录的名称。

dumprestore是Linux中的备份和还原工具,也可以实现打包和解包。
cpio用来备份任何东西,也可以实现打包解包。