参考文献

  • 鸟哥的Linux私房菜基础学习篇(第四版)

权限的概念

  • 文件拥有者
  • 用户组
    • 每个账号都可以有多个用户组的支持
  • 其他人
  • 在Linux中,任何一个文件都具有用户(User),所属群组(Group)以及其他人(Others);
  • Linux用户身份与用户组记录
    • 默认情况下,所有的系统上的账号与一般身份用户的相关信息都记录在/etc/passwd这个文件内,个人密码则是记录在/etc/shadow这个文件中,Linux所有的组名都记录在/etc/group

Linux文件属性

  • 使用ls -al显示的文件列表信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [root@holelin holelin]# ls -al
    total 32
    drwx------ 3 holelin holelin 4096 May 25 23:34 .
    drwxr-xr-x. 5 root root 4096 Mar 4 11:09 ..
    -rw------- 1 holelin holelin 783 May 24 23:33 .bash_history
    -rw-r--r-- 1 holelin holelin 18 Apr 1 2020 .bash_logout
    -rw-r--r-- 1 holelin holelin 193 Apr 1 2020 .bash_profile
    -rw-r--r-- 1 holelin holelin 231 Apr 1 2020 .bashrc
    drwxrwxr-x 2 holelin holelin 4096 Jul 7 2020 packages
    -rw------- 1 holelin holelin 810 May 24 23:33 .viminfo
    [ 1 ][2][ 3 ] [ 4 ][ 5 ][ 6 ] [ 7 ]
    [ 权限 ][链接][拥有者][用户组][文件容量 ][修改日期] [ 文件名 ]
    • 第一栏代表这个文件的类型与权限(permission)

      1
      drwxrwxr-x
    • 从左向右,第一个字符代表这个文件是目录,文件或者链接文件等

      • d为目录文件
      • -为普通文件
      • l则表示为符号链接文件(symbolic link file)
      • b则表示为设备文件里面的可供存储的周边设备(可按块随机读写的设备)
      • c则表示为设备文件里面的串行端口设备,例如键盘,鼠标(一次性读取设备)
      • p表示命令管道文件(pipe)
      • s表示套接字文件(socket)
    • 接下来以三个为一组

      • r代表可读(read) 4
      • w代表可写(write) 2
      • x代表可执行(execute) 1
      • 若没有权限,则是-;
    • 第一组为文件拥有者可具备的权限;

    • 第二组为加入此用户组的账号的权限;

    • 第三组为非本人且没有加入本用户组的其他账号的权限;

十进制权限改变法

二进制 十进制 权限(rwx)
000 0 ---
001 1 --x
010 2 -w-
011 3 -wx
100 4 r--
101 5 r-x
110 6 rw-
111 7 rwx

UGO权限改变法

  • 输入chmod命令,然后输入要更改权限的用户,为用户提供 u,为组提供 g,为其他用户提供 o,或者输入三个运算符之一:

    • -移除一个权限
    • +添加一个权限
    • = 设置一个权限
    1
    2
    # 删除用户对hashcat.hcstat 所属文件的写入权限,可以输入以下内容:
    kali >chmod u-w hashcat.hcstat

修改文件属性与权限

chgrp: 修改文件所属用户组

  • chgrp [-R] 用户组 dirname/filename ...
    • -R: 进行递归修改,即连同子目录下的所有文件,目录都更新为这个用户组

chown: 修改文件拥有者

  • chown [-R] 账号名称 文件或目录
  • chown [-R] 账号名称:用户组名称 文件或目录

chmod: 修改文件的权限

  • chmod [-R] zxy 文件或者目录

    • zxy: 表示数字类型,为rwx属性数值的相加
  • chmod u=rwx,go=rx 文件

    • u: user
    • g: group
    • o: others
    • a: 表示全部的身份
    • =: 设置
    • -: 移除
    • +: 赋予
  • chmod a-x 文件: 移除可执行权限

umask档案预设权限

  • umask就是指定目前使用者在建立档案或目录时候的属性默认值
1
2
3
4
# umask
0022
# umask -S
u=rwx,g=rx,o=rx
  • 在预设权限的属性上,目录与档案是不一样的。由于档案我们不希望他具有可执行的权力, 预设情况中,
    档案是没有可执行 (x) 权限的。因此:

    • 若使用者建立为档案则预设没有可执行 ( x ) 项目,亦即只有 rw 这两个项目,也就是最大为666分,预设属性如: -rw-rw-rw-
    • 若使用者建立为目录,则由于 x 与是否可以进入此目录有关,因此预设为所有权限均开放, 亦即为777分,预设属性如: drwxrwxrwx
  • umask 指定的是『该默认值需要减掉的权限!』因为 r、w、x 分别是 4、2、1 分,所以啰!也就是说,当要拿掉能写的权限,就是输入 2 分,而如果要拿掉能读的权限,也就是 4 分,那么要拿掉读与写的权限,也就是 6 分,而要拿掉执行与写入的权限,也就是 3 分.

    1
    2
    建立档案时: (-rw-rw-rw-) – (-----w--w-) ==> -rw-r--r--
    建立目录时: (drwxrwxrwx) – (d----w--w-) ==> drwxr-xr-x

chattr档案隐藏属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# chattr [+-=][ASacdistu] 档案或目录名称
参数:
+ : 增加某一个特殊参数,其它原本存在参数则不动。
- : 移除某一个特殊参数,其它原本存在参数则不动。
= : 设定一定,且仅有后面接的参数
A : 当设定了 A 这个属性时,这个档案(或目录)的存取时间 atime (access)
将不可被修改,可避免例如手提式计算机容易有磁盘 I/O 错误的情况发生!
S : 这个功能有点类似 sync 的功能!就是会将数据同步写入磁盘当中!
可以有效的避免数据流失!
a : 当设定 a 之后,这个档案将只能增加数据,而不能删除,只有 root
才能设定这个属性。
c : 这个属性设定之后,将会自动的将此档案『压缩』,在读取的时候将会自动解压缩,
但是在储存的时候,将会先进行压缩后再储存(看来对于大档案似乎蛮有用的!)
d : 当dump(备份)程序被执行的时候,设定 d 属性将可使该档案(或目录)不具有dump功能
i : 这个 i 可就很厉害了!他可以让一个档案『不能被删除、改名、设定连结也无法写入
或新增资料!』对于系统安全性有相当大的帮助!
j : 当使用 ext3 这个档案系统格式时,设定 j 属性将会使档案在写入时先记录在
journal 中!但是当 filesystem 设定参数为 data=journalled 时,由于已经设定了
日志了,所以这个属性无效!
s : 当档案设定了 s 参数时,他将会被完全的移除出这个硬盘空间。
u : 与 s 相反的,当使用 u 来设定档案时,则数据内容其实还存在磁盘中,
可以使用来 undeletion.
注意: 这个属性设定上面,比较常见的是 a 与 i 的设定值,而且很多设定值必须要身为root 才能够设定的喔!
1
2
3
4
5
6
7
chattr +a file1 只允许以追加方式读写文件
chattr +c file1 允许这个文件能被内核自动压缩/解压
chattr +d file1 在进行文件系统备份时,dump程序将忽略这个文件
chattr +i file1 设置成不可变的文件,不能被删除、修改、重命名或者链接
chattr +s file1 允许一个文件被安全地删除
chattr +S file1 一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘
chattr +u file1 若文件被删除,系统会允许你在以后恢复这个被删除的文件

lsattr (显示档案隐藏属性)

1
2
3
4
lsattr [-aR] 档案或目录 
参数:
-a : 将隐藏文件的属性也显示出来;
-R : 连同子目录的数据也一并列出来

SUID,SGID,SBIT等特性

权限对目录的重要性

  • 目录主要的内容在记录文件名列表,文件名和目录有强烈的关联;
  • r(read contents in directory)
    • 表示具有读取目录结构列表的权限,即当你具有读取®一个目录的权限时,表示你可以查询该目录下的文件名数据,可以用ls这个命令列出该目录的内容列表
  • w(modify contents of directory)
    • 表示你具有改动该目录结构列表的权限
      • 建立新的文件与目录;
      • 删除已经存在的文件与目录(不论该文件的去权限是什么);
      • 将已存在的文件或目录进行更名;
      • 移动该目录内的文件,目录的位置;
  • x(access directory)
    • 目录的x代表的是用户能否进入该目录成为工作目录的用户,所谓的工作目录(work directory)就是当前所在的目录;
    • 如果你在某个目录下不具有x的权限,那么你就无法切换到该目录下,也就无法执行该目录下的任何命令,即使你具有该目录的r或者w的权限;
    • 要开放目录给任何人浏览时,应该至少也要给予r及x的权限,但w权限不可随便给;

Linux文件种类与扩展名

  • 文件种类

    • 常规文件(regular file)

      • 纯文本文件(ASCII)
      • 二进制文件(binary)
      • 数据文件(data)
    • 目录(directory)

      • 就是目录: 第一个属性为d
    • 连接文件(link)

      • 类似Windows的快捷方式: 第一个属性为l(字母L的小写)
    • 设备与设备文件(device): /dev

      • 区块(block)设备文件: 第一个属性为b
      • 字符(character)设备文件: 第一个属性为c,即一些串行端口的接口设备
    • 数据接口文件(sockets)

      • 第一个属性为s,称为数据接口文件,这种类型的文件通常被用在网络上的数据交换。通常/run或者/tmp
    • 数据输送文件(FIFO,pipe)

      • 第一个属性为p.FIFO也是特殊的文件类型,它主要的目的是解决多个程序同时读写一个文件造成的错误问题,FIFO是先进先出的缩写,即管道.
  • Linux文件扩展名

    • 一个Linux文件能不能被执行,与它的第一栏的十个属性有关,与文件名一点关系也没有.
    • 只要权限当中具有x的话即代表这个文件具有可以被执行的能力.
  • Linux文件名长度限制

    • 单一文件或目录的最大容许文件名为255字节,以ASCII英文占用一个字节莱来说,则大约可达255个字符长度.若是以每个汉字占用2字节来说,最大文件名就是大约在128个汉字之间.
  • Linux文件名的限制

    • 在设置Linux下的文件名最好避免一些特殊字符

      1
      * ? > < ; & ! [ ] | \ ' " ` ( ) { }

Linux目录配置

Linux目录配置的依据-FHS

  • FHS(FileSystem Hierarchy Standard): 主要目的是希望让用户了解到已安装软件通常放置于那个目录下.

    可分享(shareable) 不可分享(unshareable)
    不变(static) /usr(软件存放处) /etc(配置文件)
    /opt(第三方辅助软件) /boot(启动与内核文件)
    可变动(variable) /var/mail(用户邮箱) /var/run(程序相关)
    /var/spool/news(新闻组) /var/lock(程序相关)
    • 可分享: 可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等数据,是能够分享给网络上其他主机挂载用在目录;
    • 不可分享: 自己机器上面运行的设备文件或是与程序有关的socket文件等,由于仅与自身机器有关,所有当然就不适合分享其他主机;
    • 不变: 有些数据是不会经常变动的,跟随着发型版而不变动.例如函数库,文件说明,系统管理员所管理的主机服务配置文件等;
    • 可变动: 经常修改的数据,例如日志文件,一般用户可自行接收的新闻组等;
    • /(root 根目录): 与启动系统有关;
    • /usr(unix software resource): 与软件安装/执行有关;
    • /var(variable): 与系统运行过程有关;
  • /(root 根目录): 与启动系统有关;

    • 根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来,同时根据目录也与启动,还原,系统修复等操作有关.

    • 根目录(/)所在分区应该越小越好,且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好,如此不但性能较佳,根目录所在的文件系统也较不容易发送问题;

      目录 应放置文件内容
      /bin 放置的是单人维护模式下还能够被使用的命令.在/bin下面的命令可以被root与一般账号所使用,主要:cat,chmod,chown,date,mv,mkdir,bash等常用命令
      /boot 主要放置启动时会使用到的文件,包括Linux内核文件以及启动选项与启动锁需配置文件等.Linux内核常用文件名为:vmlinuz,如果使用的是grub2这个启动引导程序,则还会存在/boot/grub2这个目录
      /dev 在Linux系统上,任何设备接口设备都是以文件的形式存在于这个目录中.只要通过读写这个目录下面的某个文件,就等于读写某个设备,比较重要的文件/dev/null,/dev/zero,/dev/tty,/dev/loop*,/dev/sd*
      /etc 系统主要的配置文件几乎都放置在这个目录内.一般来说,这个目录下的各文件属性是可以让一般用户查看的,但是只有root有权力修改.
      FHS建议不要放置可执行文件(binary)在这个目录中.比较重要的文件有: /etc/modprobe.d/,/etc/passwd,/etc/fstab,/etc/issue的等,另外FHS还规范几个重要的目录最好要存在/etc/目录下:
      /etc/opt(必要): 这个目录在放置第三方辅助软件/opt的相关配置文件;
      /etc/X11(建议): 与X Window有关的各种配置文件都在这里,尤其是xorg.conf这个X Server的配置文件
      /etc/sgml(建议): 与SGML格式有关的各项配置文件
      /etc/xml/(建议): 与XML格式有关的各项配置
      /lib 放置的则是在启动时会用到的函数库,以及在/bin/sbin下面的命令会调用的函数库而已.以及在/bin/sbin下面的命令会调用的函数库而已
      /lib/modules/: 这个目录主要放置可抽换式的内核相关模块(驱动程序)
      /media 放置的就是可删除的设备,包括软盘,光盘,DVD等设备都暂时挂载与于此.常见的文件名: /media/floppy,/media/cdrom
      /mnt 放置暂时挂载某些额外的设备,一般建议放置到这个目录中.
      /opt 给第三方辅助软件放置的目录
      /run 早期的FHS规定系统启动后所产生的各项信息一个要放置/var/run目录下,新版的FHS则规范到/run下面,由于/run可以使用内存模拟,因此性能上会好很多
      /sbin Linux有很多命令用来设置系统环境的,这些命令只有root才能够用来设置系统,其他用户最多只能用来查询而已.**放在/sbin下面的为启动过程中所需要的,里面包括了启动,修复,还原系统所需要的命令.**至于某些服务器软件程序,一般放置到/usr/sbin,至于本机自行安装的软件所产生的系统执行文件(system binary),则放置到/usr/local/sbin当中.常见的命令包括:fdisk,fsck,ifconfig,mkfs
      /srv srv可以视为service的缩写,是一些网络服务启动之后,这些服务所需要使用的数据目录,常见的服务如WWW,FTP;
      /tmp 这是让一般用户或是正在执行的程序暂时放置文件的地方.这个目录是任何人都能够存取的,所以需要定期清理一下.
      /usr 放置操作系统软件资源的目录,而不是用户数据
      /var 主要针对经常性变动的文件,包括缓存(cache),日志文件(log file)以及某些软件运行所产生的文件,包括程序文件(lock file, run file)
      /home 这是系统默认的用户家目录(home directory).比较重要的是家目录有两个代号:
      ~: 代表目前这个用户的家目录;
      ~holelin: 则代表holelin的家目录
      /lib<qual> 用来存放与/lib不同的格式的二进制函数库,例如支持64位的/lib64函数库
      /root 系统管理员(root)的家目录,之所以放在这里.是因为如果进入单人维护模式而仅挂载跟目录时,该目录就能够拥有root的家目录
      /lost+found 这个目录使用标准ext2,ext3,ext4文件系统格式才会产生一个目录,目的在于当文件系统发生错误时,将一些遗失的片段放置到这个目录下,不过如果使用的是xfs文件系统的话,就不会存在这个目录
      /proc 这个目录本身是一个虚拟文件系统(virtual file system),它放置的数据都是在内存当中,例如系统内核,进程信息(process),外接设备的状态及网络状态等.因为这个目录下的数据都是在内存当中,所以本身不占任何硬盘空间.比较重要的文件例如:/proc/cpuinfo,/proc/dma,/proc/interrupts,/proc/ioports,/proc/net/*
      /sys 这个目录其实和/proc非常类似,也是虚拟的文件系统,主要也是记录内核与系统硬件信息相关的内容,包括目前已加载的内核模块与内核检测到的硬件设备信息等.这个目录同样不占硬盘容量.
    • 比较重要的目录: /etc,/bin/dev/lib,/sbin