linux 基础

文件权限与目录配置

用户与用户组

常见权限有以下四种

  1. 文件拥有者
  2. 用户组,用于合作的权限
  3. 其他人
  4. root,啥都可以做 默认情况下,所有系统上的账号与一般身份用户,还有那个 root 相关信息,都在 /etc/passwd 这个文件内,个人密码则是记录在 /etc/shadow 这个文件内,所有用户组名记录在 /etc/group

文件权限概念

ls -al 可以查看目录下的文件属性和权限,包括隐藏文件。每个文件和目录都会显示 7 个字段,比如 -rw-r--r-- 1 root root 1864 May 4 18:01 initial-setup-ks.cfg

  • -rw-r-r--文件类型权限
    • 第一个字符代表文件是目录、文件或是链接文件等,d为目录,-为文件,l为链接,d为设备与设备文件,s为接口文件,p为数据输送文件
    • r(read)为读权限,可以查询该目录下的文件名数据。可以查看文件的文本内容
    • w(write)为写权限,具有改动该目录结构列表的权限,与该目录下的文件名的变动有关。可以编辑、新增或是修改该文件的内容,但不能删除
    • x(execute)为执行权限,用户能否进入该目录成为工作目录,比如cd。文件是否可悲系统执行
    • 三组权限描述的分别为文件拥有者、加入此用户组账号的权限、为本人且没有加入本用户组其他账号的权限
  • 1链接数,表示多少文件名链接到此节点inode
  • root文件拥有者的账号
  • root文件所属用户组
  • 1864文件大小,默认为Bytes
  • May 4 18:01文件为创建日期或是最后被修改时间,如果想要看完整时间,可以使用ls -l --full-time
  • initial-setup-ks.cfg文件名,如果文件之前有.则为隐藏文件,使用ls -a可查看

修改文件属性与权限

下面有几个常用与用户组、拥有者、各种身份的权限修改的命令

  • chgrp(change group)修改文件用户组,用户组必须在/etc/group文件中

  • chown(change own)修改文件拥有者,用户必须存在于/etc/passwd文件中

    • -R递归修改,所有子目录的文件都会被修改
    • chown 用户:用户组 文件可同时修改拥有者和用户组 由于 cp 会复制执行者的属性与权限,所以有时需要修改权限
  • chmod修改文件的权限,SUDSGIDSBIT等的特性,我们可以通过数字来代表各个权限,r:4 w:2 x:1每种角色的权限是可以累加的,比如 -rwxrwx--- 的数字则是 770

    • -R也是递归修改权限
    • 我们也可借由ugo来代表usergroupother三种角色,a则表示all,比如

-rwxr-xr--chmod u=rwx,g=rx,o=r 文件名 来进行设置,同时有几种操作用于设置 + 加入, - 移除、 = 设置

目录配置

Linux 发行版它们的配置文件、执行文件、每个目录内放置的东西都是有一套标准依据 FHS(Filesystem Hierarchy Standard ,它的主要目的是希望让用户可以了解到已安装软件通常放置于哪个目录下,一般来讲目录有下面四种交互作用的形态 | | 可分享 | 不可分享 | | 不变 | /usr 软件存放处 | /etc 配置文件 | | | /opt 第三方辅助软件 | /boot 启动与内核文件 | | 可变动 | /var/mail 用户邮箱 | /var/run 程序相关 | | | /var/spool/news 新闻组 | /var/lock 程序相关 |

  • 可分享:可分享给其他系统挂载使用的目录
  • 不可分享:自己机器上运行设备文件或是与程序有关的socket文件等
  • 不变:有些数据是不经常变动的,比如函数库,文件说明,系统管理员所管理的主机服务配置文件等
  • 可变动:经常修改单数据,比如日志文件、一般用户可自行接收的新闻组等 事实上,FHS 针对目录数架构仅定义出三层目录下面应该防止什么数据而已
  • /(root, 根目录):与启动系统相关
  • /usr(unix software resource):与软件安装、执行有关
  • /var(variable):与系统运行过程有关

文件与目录管理

目录的相关操作

  • cd(change directory):切换目录
  • pwd(print working directory):显示当前目录
  • mkdir(make directory):建立一个新目录
  • rmdir:删除一个空目录

$PATH

环境变量 PATH 可以让在输入命令时找到对应的命令文件,它是由一堆目录组成,每个目录中间用 : 隔开,每个目录有顺序之分。当执行目录时会根据 PATH 的设置去每个 PATH 定义的目录下查找文件名为命令名的可执行文件,先查找到的同名命令先被执行,另外要注意

  • 不同身份用户默认的PATH不同,默认能够随意执行的命令也不同
  • PATH是可以被修改单
  • 使用绝对路径或是相对路径来指定某个命令的文件名执行会比查找PATH来的正确
  • 命令应该要放到正确的目录下执行才会更方便
  • 本目录.最好不要放到PATH当中

ls

  • -a全部文件,包括隐藏文件
  • -d仅列出目录本身,而不是列出目录内地文件数据
  • -l详细信息显示,包括文件的属性与权限等数据
  • -i列出inode号码
  • -f直接列出结果,而不进行排序
  • -S根据文件大小列出文件
  • -t根据时间排序

cp、rm、mv

  • cp命令除了单纯地复制之外,还可建立链接文件,比如两文件的新旧而予以更新,默认情况下目标文件拥有者会是命令操作者本身
    • -a:相当于-dr --preserve=all的意思
    • -i:若目标文件已经存在时,在覆盖时会先寻味操作的进行
    • -p:连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性
    • -r:递归复制,用于目录的赋值操作
    • -s:复制成为符号链接问价,即”快捷方式“文件
    • -l:硬链接的链接文件建立
    • -u:当destinationsource旧或是destination旧的情况下才更新destination
  • rm用于删除文件或目录,默认情况下,会加入-i选项
    • -f:就是force的意思,忽略不存在的文件,不会出现警告信息
    • -I:交互模式,再删除前会询问使用者是否操作
    • -r:递归删除,最常用于目录的删除,是非常危险的选项
  • mv移动文件与目录或是重命名
    • -f强制删除文件
    • -i覆盖前询问是否覆盖
    • -u若目标文件已经存在,且source比较新才会更新
  • basename <路径>取得最后的文件名
  • dirname <路径>取得前面的目录名

文件内容查看

  • cat(concatenate 串联)从第一行开始显示文件内容
  • tac也就是cat倒过来写,从最后一行开始显示
  • nl显示的时候同时输出行号
  • more只能往后翻页
    • 空格键往后翻页
    • Enter代表向下翻一行
    • /字符串表示向下查找字符串
    • :f立刻显示出文件名以及目前显示的行数
    • :q代表立即离开more,不再显示该文件内容
    • bctrl + b表示往前翻页
  • less可以往前后翻页
    • 空格键向下翻页
    • [pagedown]向下翻页
    • [pageup]向上翻页
    • /字符串向下查找字符串的功能
    • ?字符串向上查找字符串的功能
    • n重复前一个查找
    • N反向重复前一个查找
    • g前进到文件第一行
    • G前进到文件的最后一行
    • q离开less
  • head只看前面几行,默认显示 10 行
    • -n可接收一个负数和正数,其中负数就是除了后面的几行不会被打印
  • tail只看后面几行,默认显示 10 行
    • -n可接收一个负数和正数,其中负数就是除了前面的几行不会被打印
  • od以二进制方式读取文件内容
    • -t c的选项来以哪种格式打印
  • touch用于修改文件时间或创建新文件 当使用 ls 这个命令时,每个文件有三个主要的变动时间
    • 修改时间modified time(mtime):当文件的内容数据变更时,就会更新这个时间,内容数据指的是文件的内容,而不是文件的属性或权限

    • 状态时间status time(ctime):当文件的状态改变时,就会更新时间,比如权限或是属性被修改了

    • 读取时间access time(atime):当文件被读取时,就会更新这个时间,比如使用cat去读取文件 使用 ls -l 默认显示的时间就是 mtime

    • -a仅自定义access time

    • -c仅修改文件的时间,若该文件不存在则不建立新文件

    • -m仅修改mtime

    • -t后面可以接欲自定的时间而不用目前的时间,格式为[YYYYMMDDhhmm]

文件与目录的默认权限

  • umask就是指定目前用户在建立文件或目录时候的权限默认值,默认会输出四个权限数字,其中第一组是特殊权限用的
    • -S(Symbolic)会以符号类型的方式来显示出权限
    • 后面可以跟上数字,数字为需要删除的权限
  • file可以知道某个文件的基本信息,例如是属于ASCII或是数据文件或是二进制文件,且其中有没有使用到动态链接库share library

命令与文件的查找

  • which可以查找执行文件,这个命令是根据PATH这个环境变量所规范的路径去查找执行文件的文件名,所以重点是查找出执行文件而已
    • -a:将所有由PATH目录中可以找到的命令均列出,而不是第一个被找到的文件名称
  • whereis:从一些特定目录中查找文件,主要是针对/bin,/bins,/usr/share/man以及几个特定的目录来处理而已
    • -l:列出whereis会去查询的几个目录
    • -b:只找出二进制文件
    • -m:只找在说明文件manual路径下的文件
    • -s:只找source源文件
    • -u:查找不在上述三个项目当中的其他特殊文件
  • locate直接在后面输入文件部分名称后,就能够得到结果,但它寻找的命令是在已建立的数据库/var/lib/mlocate/里面的数据所查找到的,数据库默认每天更新一次
  • updatedb用于直接更新locate所依赖的数据库
  • find可以查找所有文件
    • -mtime nn为数字,为n天之前的一天之内被修改过内容的文件
    • -mtime +n:列出在n天之前不包含n天本身被修改过内容的文件
    • -mtime -n:列出在n天之内n天本身被修改过内容的文件
    • newer filefile为一个存在的文件,列出比file更新的文件
    • -uid nn为数字,这个数字是使用者的账号 ID,就是UID,记录在/etc/passwd
    • -gid nn为数字,这个数字式用户组名称的 ID,就是GID,记录在/etc/group
    • -user namename为使用者账号名称
    • -group namegroup为用户组名称
    • -nouser:查找文件的拥有者不再/etc/passwd中的文件
    • -nogroup:查找文件的拥有用户组不存在于/etc/group中的文件
    • -name filename:查找文件名为filename的文件
    • -size [+-]SIZE:查找比SIZE还要大+或是小-的文件,c代表Bytesk代表1024Bytes
    • -type TYPE:查找文件类型为TYPE
    • -perm mode:查找文件权限刚好等于mode的文件
    • -perm -mode:查找文件权限必须要全部囊括mode的权限
    • -perm /mode:查找文件权限包含任一mode的权限

linux 磁盘与文件系统管理

linux 最传统的磁盘文件系统使用的是 ext2 。较新的操作系统的文件除了文件实际内容外,通常含有非常多的属性,文件系统通常会将这两部分数据分别存放在不同的区块,权限与属性放在 inode 中,实际数据则放置到数据区块中。另外还会有一个超级区块 superblock 会记录整个文件系统的整体信息,包括 inode 与数据区块的总量、使用量和剩余量 需要碎片整理的原因就是文件写入的区块太过于离散,此时文件读取的性能将会变得很差,此时可以通过碎片整理将同一个文件所属地曲会计合在一起,这样数据的读取就会比较容易 每个文件都会占用一个 inode ,可依据文件内容的大小来分配多个区块给该文件使用

  • 当我们在 Linux 下单文件系统建立一个目录时,文件系统就会分配一个inode和至少一块区块给该目录,其中,inode记录该目录的相关权限与属性,并记录分配到的那块区块号码,但当目录下文件太多时,会多给一个区块记录区块号码,可以使用ls -i来观察文件占用的inode号码
  • 当我们在 linux 下的ext2建立一个一般文件时,ex2会分配一个inode与相对于该文件大小的区块数量给该文件
  • 当需要读取某个文件时,会先读取目录的inode再读取目录的区块,最后读取文件的inode和区块
  • 当我们需要创建一个文件,此时文件系统的操作是
    1. 先确定用户对于欲新增文件的目录是否具有wx的权限,有的话才能新增
    2. 根据inode对照表找到没有使用的inode号码,并将新文件的权限/属性写入
    3. 根据区块对照表找到没有使用中的区块号码,并将实际的数据写入区块中,且更新inode的区块指向数据
    4. 将刚刚写入的inode与区块数据同步更新inode对照表与区块对照表,并更新超级区块的内容
  • 我们将数据区块称为数据存放区域,inode对照表,区块对照表和超级区块则被称为元数据metadata,因为每次增删改都会影响到这三部分数据 所有的数据要加载到内存后 cpu 才能进行处理,所以在编辑较大文件时,不能让系统频繁地在磁盘上读写内容,此时 linux 使用了一个别称为异步处理 asynchronously 的方式 当系统加载一个文件到内存后,如果该文件没有被修改过,则在内存区段的文件数据会被设置为 clean 。但如果内存中的文件数据被更改过了,则被设置为 dirty ,此时所有操作还在内存中执行,没有写入到磁盘中,系统会不定时地将内存中的 dirty 数据写回磁盘,以保证磁盘与内存数据的一致性,我们可以使用 sync 命令来强制写入磁盘,如果主动关机,会调用 sync 命令将数据写入磁盘
  • 每个文件系统都有独立的inode、区块、超级区块等信息,将文件系统与目录树结合的操作我们称为挂载。挂载点一定是目录,该目录为进入该文件系统的入口
  • 同一个文件系统的inode号码只会对应到一个文件内容
  • centos 7 使用的文件系统已经切换为xfs了,它一般用来开发高容量磁盘以及高性能文件系统,并且几乎所有ext4文件系统所特有的功能,xfs都具备。

文件系统的简单操作

  • df:列出文件系统的整体磁盘使用量,由于读取的是超级区块的信息,因此速度非常快
    • -a:列出文件系统的整体磁盘使用量
    • -k:以KBytes的容量显示各文件系统
    • -m:以MBytes的容量显示各文件系统
    • -h:以人类更易阅读的GBytesMBytesKBytes等格式自行显示
    • -H:以M=1000K替换M=1024K的进位方式
    • -T:连同该硬盘分区的文件系统名称列出
    • -i:不用磁盘容量,而以inode的数量来显示
  • du:查看文件系统的磁盘使用量,常用查看目录的磁盘使用量
    • -a:列出所有文件与目录容量
    • -h:以人们较易读懂的格式G/M来显示
    • -s:仅列出容量,而不列出每个个别的目录占用容量
    • -S:不包括子目录下的总计
    • -k:以KBytes的容量显示
    • -m:以MBytes的容量显示
  • ln:不加任何参数就是建立硬链接
    • 硬链接实际上就是新增一条文件名链接到某inode号码的关联记录,即多个文件名对应到同一个inode号码。使用硬链接链接文件时,磁盘的空间和inode数据都不会改变 硬链接其实是有限制的 - 不能跨文件系统 - 不能链接目录

    • 符号链接实际上就是建立一个独立的文件,而这个文件会让数据的读取指向它链接的那个文件的文件名,所以当源文件被删除之后,符号链接的文件只会一直说无法打开某文件。另外注意,它会占用inode和区块

    • -s建立符号链接

    • -f如果目标文件存在时,就主动将目标文件直接删除后再建立

    • 当我们建立一个空目录时,会存在...两个目录,所以新的目录的连接数为2

磁盘的分区、格式化、检验与挂载

如果我们想在系统里新增一个磁盘,有以下操作需要做

  1. 对该磁盘进行划分,建立可用的磁盘分区
  2. 对该硬盘分区进行格式化,建立系统可用的文件系统
  3. 在 Linux 系统上,需要建立挂载点,将它挂载出来
  • lsblk(list block device)列出系统上所有的磁盘列表
    • -d:仅列出磁盘本身,不会列出磁盘分区数据

    • -f:同时列出该磁盘内的文件系统名称

    • -i:使用 ASCII 的字符输出,不要使用复杂编码

    • -m:同时输出该设备在/dev下的权限信息

    • -p:列出该设备的完整名,而不是仅列出最后的名字而已

    • -t:列出该磁盘设备的详细数据 列出的字段表示

    • NAME:设备的文件名

    • MAJ:MIN:内核识别的设备都是通过这两个代码来实现,分别是主要与次要设备代码

    • RM:是否为可卸载设备remotable device,比如光盘、usb 等

    • SIZE:容量

    • RO:是否为只读设备

    • TYPE:是磁盘disk,分区partition,还是只读存储器rom

    • MOUNTPOINT:挂载点

  • blkid列出设备的UUID等参数
  • parted列出磁盘的分区表类型与分区类型
  • gdisk <设备名称>GPT 分区表用于分区,同时能执行各种操作比如删除,分区,输入?可以查看
  • fdisk <设备名称>MBR 分区表用于分区 当我们需要给磁盘分区时,只需要
  1. lsblkblkid找到磁盘
  2. parted找出内部的分区表类型
  3. gdiskfdisk操作系统,另外在操作途中,按下q可以直接退出分区操作,w可使操作生效
  • partprobe直接更新Linux内核的分区表信息
  • 不要直接处理正在使用的分区,要卸载后再进行分区
  • mkfs(make filesystem)用于创建文件系统
    • -b:后面接区块容量,可由 512 到 64k
    • -d:后面接的是重要的data section的相关参数
    • -f:按已有的文件系统来进行强制格式化
    • -i:与inode有较相关的设置
    • -L:指定realtime section的相关设置值
  • xfs_repair:当xfs系统错乱使用这个命令检查/修复文件系统
  • fsck.ext4:处理ext4文件系统
  • 当我们要进行挂载时,需要确定以下几件事
    1. 单一文件系统不应该被重复挂载在不同的挂载点
    2. 单一目录不应该重复挂载多个文件系统
    3. 要作为挂载点的目录,理论上应该都是空目录。如果不是空目录,则在挂载之后原目录内容会被隐藏,卸载之后才会恢复显示
  • mount将文件系统挂载到 Linux 系统上
    • -a:依照配置文件/etc/fstab的数据将所有未挂载的磁盘都挂载上来
    • -l:单纯地输入mount会显示挂载信息,加上-l可增列Label名称
    • -t:加上文件系统种类来指定欲挂载的类型
    • -n:不将挂载情况写入/etc/mtab
    • -o:加上一些挂载时额外加入的参数
  • unmount将已挂载的文件系统进行卸载,卸载之后通过df或是mount看看是否还存在于目录树中

设置启动挂载

系统挂载的限制

  • 根目录必须是挂载的,而且一定要先于其他挂载点mount point被挂载进来
  • 其他挂载点必须为已建立的目录,客人已制定,但必须遵守FHS
  • 所有挂载点在同一时间内只能挂在一次
  • 所有硬盘分区在同一时间内只能挂载一次
  • 如果进行卸载,必须将工作目录移到挂载点之外

/etc/fstab(filesystem table) 就是我们利用 mount 命令进行挂载时,将所有选项与参数写入的文件。这个文件的内容共有六个字段,它们非常重要

  1. 磁盘设备名:/UUID/LABEL name,这个字段可以填写的数据主要有三个项目:
  • 文件系统或磁盘的设备文件名,比如/dev/vda2
  • 文件系统的UUID名称
  • 文件系统的LABEL名称
  1. 挂载点mount point:目录
  2. 磁盘分区的文件系统:在手动挂载时可让系统自动测试挂载
  3. 文件系统参数
  4. 能否被dump备份命令作用
  5. 是否以fsck检验扇区

文件与文件系统的压缩

在 Linux 上有非常多的压缩命令可以运行,这些压缩命令可以让我们更方便地从网络上下载容量较大的文件

压缩文件的用途与技术

比较大型的文件通过所谓的文件压缩技术之后,可以将它的磁盘使用量降低,从而达到降低文件容量的效果。此外,有的压缩程序可以进行容量限制,使一个大型文件可以划分为数个小型文件,以方便携带

Linux 常用的压缩命令

压缩文件的扩展名大多是 *.tar*.tar.gz*.tgz*.gz*.Z*.bz2*.xz

Linux 支持的压缩命令非常多,且不同的命令所有的压缩技术并不相同

  • *.zcompress程序压缩的文件
  • *.zipzip
  • *.gzgzip
  • *.bz2bzip2
  • *.xzxz
  • *.tartar
  • *.tar.gztar + gz
  • *.tar.bz2tar + bzip2
  • *.tar.xztar + xz

tar 可以将很多文件打包成为一个文件,甚至是目录也可以这么玩。不过,单纯的 tar 只是打包而已并没有其它压缩的功能

  • gzip所建立的压缩文件为*.gz,而bzip2则是为了替换gzip,它用法也和gzip类似。使用gzip后,源文件就不再存在了
    • -c:将压缩过程所产生的数据输出到屏幕上,可加上>来转成文件输出
    • -d:解压缩的参数
    • -t:可以用来检验一个压缩文件的一致性
    • -v:可以显示出源文件/压缩文件的压缩比
    • -##为数字,代表压缩登记-1最快,但压缩比最差,-9最差,默认为-6
  • zcat | zmore | zless | zgrep可以对应cat | more | less | grep来读取纯文本文件被压缩后的压缩文件
  • xz的用法和gzip类似,不过他会消耗很多时间来进行压缩,同时它的压缩比也是最好的

tar

  • tar用于将多个文件打包到一起

    • -c:建立打包文件,可搭配-v来查看过程中被打包的文件名
    • -t:查看打包文件的内容含有那些文件名,重点在查看文件名
    • -x:解包或解压缩的功能,可搭配-C在特定目录解压,-c -t -x不可出现在一串命令行中
    • -z:通过gzip的支持进行压缩/解压缩,此时文件名最好为*.tar.gz
    • -j:通过bzip2的支持进行压缩/解压缩
    • -J:通过xz进行压缩/解压缩
    • -v:在压缩/解压缩过程中将正在处理文件名展示出来
    • -f <文件名>:后面接要被处理的文件名
    • -C:在特定目录解压缩
    • -p:保留备份数据的原本权限与属性
    • -P:保留绝对路径,即允许备份的文件中保存根路径
    • --exclude=FILE:在压缩过程中不要将FILE打包 其实最简单的使用 tar 就是使用下面的命令即可
  • 压缩:`tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称;

  • 查询:tar -jtv -f filename.tar.bz2;

  • 解压缩:`tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录;

XFS 文件系统备份与还原

使用 tar 通常是对目录树系统来进行备份的工作,如果想要针对整个文件系统来进行备份与还原可以使用 XFS 的 xfsdumpxfsrestore 来进行备份

  • xfsdump使用此命令进行完整备份后,等一段时间的文件系统自然运行后,在进行第二次xfsdump进行备份时,可以使用增量备份,另外使用xfsdump时,应该注意下面的限制
    • 不支持没有挂载的文件系统备份,所以只能备份已挂载的文件系统

    • 必须使用 root 的权限才能操作

    • 只能备份 xfs 系统

    • 备份下来的数据只能让xfsrestore解析

    • 它是通过文件系统的UUID来辨别各个备份文件,因此不能备份两个具有相同UUID的文件系统 如果只是想要简单的操作,只需要记得下面的选项

    • -L:会记录每次备份的session标头,这里可以填写针对此文件系统的简易说明

    • -M:可以记录存储媒介的标头,这里可以填写此媒介的简易说明

    • -l:是L的笑了,就是指定等级,有0~9共 10 个等级

    • -f:有点类似tar,后面接产生的文件

    • -I:从/var/lib/xfsdump/inventory列出目前备份的信息状态

  • xfsrestore:备份文件可以在急用时恢复系统的重要数据,这个命令可以恢复备份文件
    • -I:查询备份数据
    • -f:后面接的备份文件,可以接文件名
    • -L:就是sessionLabel name,可用-I查询到的数据,在这个选项后输入
    • -s:需要接某特定目录
    • -r:如果用文件来存储备份数据,则不需要使用,如果有多个文件,则需要此选项来完成累积恢复
    • -i:进入交互模式

BASH

bash 操作环境的创建、数据流重定向的功能,还有好用的管道命令

认识 bash 这个 shell

shell 让我们能够操作系统的内核 kernel 来控制硬件进行工作, /etc/shells 这个文件至少有下面这几个可以用的 shells

  • /bin/sh:被/bin/bash替换
  • /bin/bash:为 Linux 默认的 shell
  • /bin/tcsh:整合C Shell,提供更多的功能
  • /bin/csh:已经被/bin/tcsh所替换

bash 的主要优点有下面几个

  • history:使用过的命令存在~/.bash_history中,记录的是前一次登录以前所执行的命令,而这一次登录所执行的命令都被缓存到内存中,注销系统后才会记录到.bash_history
  • [Tab]键的时机根据[tab]接在命令后或参数后而有所不同
    • [tab]接在一串命令的第一个字后面,则为命令补全
    • [tab]接在一串命令的第二个字后面,则为文件补齐
    • 若安装bash-completion软件,则在某些命令后使用[tab]按键时,可进行选项参数的补齐功能
  • alias:可设置别名,比如alias ll = 'ls -al'
  • job control | foreground | background:可进行任务管理、前台、后台控制
  • shell script:也就是程序化脚本
  • wildcard:通配符
  • typebash会内置很多命令,而type可以查看命令是否来自于外部命令
    • -t:会将name以下面这些字眼显示出它的意义
      • file:表示为外部命令
      • alias:表示该命令别名所设置的名称
      • builtin:表示该命令为bash内置的命令功能
    • -p:如果后面接的name为外部命令时,才会显示完整文件名
    • -a:会由PATH变量定义的路径中,将所有含name的命令都列出来,包含alias

变量

在我目前这个 shell 的情况下启动另一个新的 shell ,则新的那个 shell 就是子进程,父进程的自定义变量无法在子进程内使用

  • $(命令)为命令的输出
  • 单引号和双引号的最大不同是双引号可以保有变量的内容,但单引号近视一般字符,不会有特殊字符
  • 环境变量可以帮我们实现很多功能,我们可以利用两个变量来查看,分别是envexport
  • env观察环境变量与常见环境变量说明,会展示下面几个环境变量
    • HOME:用户的根目录,利用cd ~可以回到根目录
    • SHELL:当前环境使用的是哪个shell
    • HISTSIZE:这个和历史命令有关
    • MAIL:使用这个命令收信时,系统会去读取的又想我呢间
    • PATH:执行文件查找的路径
    • LANG:就是语系数据
    • RANDOM:就是随机数的变量,随机数生成器就是/dev/random这个文件
  • set可以观察所有变量,在 linux 默认的变量中,大写字母的就是系统内定需要设置的变量,比较重要的有
    • PS1:提示字符的设置,当我们每次按下Enter执行命令后,最后要再次出现提示字符时,就会主动去读取这个变量值
    • $:也就是当前正在进行的进程的PID
    • ?:上个执行命令的返回值。如果成功执行,则返回0,如果执行过程发生错误,会返回非0数值
    • OSTYTE | HOSTTYPE | MACHTYPE:主机硬件和内核的等级
  • export:自定义变量转成环境变量,环境变量和自定义变量的差异在于该变量是否被子进程所引用,此时使用这个命令可以共享自己的变量设置给后来调用的文件或其他进程。如果没有接变量名就会展示所有变量
  • locale可以查看支持的语系
    • -a:可以展示所有支持的语系
  • 当启动一个shell,操作系统会分配一块内存区域给shell使用,此内存中的变量可让子进程使用,当加载另一个shell时,子shell可将父shell的环境变量所在的内存区域导入到自己的环境变量区域
  • read <变量>:读取来自键盘树的变量
    • -p:后面接提示字符
    • -t:后面接等待的秒数
  • declare | typeset是一样的功能,就是声明变量的类型,如果declare后面没有接任何参数,那么bash会主动将所有的变量名称和内容统统显示出来
    • -a:将后面的变量定义为数组
    • -i:整数
    • -x:变为环境变量
    • -r:设置为readOnly类型,需要注销再登录才能恢复该变量的类型
  • ulimit:可以限制用户端某些系统资源,包括可以开的文件数量,可以使用的 CPU 时间,可以使用的内存总量等
    • -H:严格的设置,必定不能超过这个设置的数值
    • -S:警告的设置,可以超过这个设置的数值,操作将有警告信息
    • -a:不接参数可列出所有限制的额度
    • -c:某些程序发生错误时,系统可能会将该程序在内存中的信息写成文件
    • -f:此shell可以建立的最大文件容量,单位为Kbytes
    • -d:此程序可使用的最大段内存容量
    • -l:可用于锁定lock的内存量
    • -t:可使用的最大CPU时间(单位为秒)
    • -u:单一使用者可以使用的最大进程process数量
  • path#/*local/bin::可以删除变量中的字符串,#表示符合替换文字的最短的那一个,##表示符合替换文字最长的那一个, %%%表示由后向前匹配,\\\表示替换
  • ${username-root}:可以用来测试变量是否为空,如果为空,则root的值会替换username的值,如果没替换而echo $username还为空,则username的值为空字符串

命令别名与历史命令

  • alias:可将命令替换为其他命令
  • unalias:删除别名
  • history:可以读取使用过的命令
    • 当我们以bash登录 Linux 主机之后,系统会主动地由家目录的~/.bash_history读取以前执行过的命令,读取的命令条数和bashHISTFILESIZE这个变量值有关
    • !<number>:用于执行对应number的命令
    • !<command>:由最近的命令向前查找命令串开头为command的命令,并执行
    • !!:执行上一个命令

BASH SHELL 的操作环境

  • 命令运行的顺序可以这样看
    1. 以相对/绝对路径执行命令,例如/bin/ls./ls
    2. alias找到该命令来执行
    3. bash内置的builtin命令来执行
    4. 通过$PATH这个变量的顺序查找到的第一个命令来执行
  • /etc/issue:保存了登陆画面与登录信息
  • /etc/motd:可让用户登录后取得一些信息 如果想要你的配置在每次打开 shell 都会生效,就需要将设置写入配置文件
  • login shell为需要输入账号密码才能获取的终端,它只会读取以下两个配置文件
    • /etc/profile:这个系统整体的设置,最好不要修改。这个配置文件可以利用用户标识符UID来决定很多中啊哟的变量数据,这也是每个用户登录一定会读取的配置文件,它还会调用外部的配置文件,在 Centos7 下,还会调用以下文件
      • /etc/profile.d/*.sh:这是个目录内的众多文件。只要在/etc/profile.d/这个目录内且扩展名为.sh并且具有r的权限,那么就会被/etc/profile调用
      • /etc/locale.conf:这个文件是由/etc/profile.d/lang.sh调用的,决定默认使用何种语系
      • /usr/share/bash-completion/completions/*:用于进行命令补齐,文件名补齐
    • ~/.bash_profile或是~/.bash_login~/.profile:属于个人设置,按先后顺序调用,如果前一个存在,后一个就不会被调用
  • source:可以不用重新登录直接读入环境配置文件
  • non-login shell仅仅只会读取~/.bashrc
  • /etc/man_db.conf:用于规范man page的路径到那里去寻找
  • ~/.bash_history:用于记录历史命令
  • ~/.bash_logout:记录了在注销 bash 后,系统帮我做完什么操作才离开
  • stty(setting tty):可以帮助设置终端的输入按键代表的意义
    • -a:可以列出目前环境中所有的按键列表
  • set:可以设置一些 bash 自己的一些终端设置值,以及整个命令输出/输入的环境

数据流重定向

  • 标准输出指的是命令执行返回的正确信息,而标准错误输出可理解为命令执行失败后,所返回的错误信息
  • 标准输出如果没有重定向就会显示在屏幕上,数据流重定向传送所用的特殊字符如下
    • 标准输入stdin:代码为0,使用<<<
    • 标准输出stdout:代码为1,使用>>>>会覆盖文件,>>会累加文件内容
    • 标准错误输出stderr:代码为2,使用2>2>>
  • /dev/null:垃圾桶黑洞设备与特殊写法,可以将错误信息忽略掉而不显示或存储,可以吃掉任何导向这个设备的信息
  • <command1>;<command2>:可一次执行多个命令,执行完前一个后就会立即执行下一个
  • <command1>&&<command2>:如果command1执行完毕且正确执行$?=0,则开始执行command2,如果为错误$?!=0则不执行command2
  • <command1>||<command2>:如果command1执行完毕且正确执行$?=0,则开始不执行command2,如果为错误$?!=0则开始执行command2

管道命令(pipe)

管道命令只会处理经过前一个命令的标准输出的信息,对于标准错误并没有处理能力

  • cut:可以将一段信息的某一段切出来,处理的信息以行为单位
    • -d:后面接分隔字符,与-f一起使用
    • -f:根据-d的分隔字符将一段信息划分为数段,用-f取出第几段
    • -c:以字符的单位去除固定字符区间
  • grep:分析一行信息,如果有我们所需要的信息,就将该行取出
    • -a:将二进制文件以文本文件的方式查找文件
    • -c:计算找到查找字符的次数
    • -i:忽略大小写的不同
    • -n:顺便输出行号
    • -v:反向选择
    • -A(after):可接数字,在匹配行之后的多少行也会显示
    • -B(before):可接数字,在匹配行之前的多少行也会显示
    • --color=auto:可以将找到的关键字部分加上盐泽的提示
  • sort:可以帮我们进行排序,且可以更具不同的数据形式来排序
    • -c:忽略大小写的差异
    • -b:忽略最前面的空格字符部分
    • -M:以月份的名字来排序,比如JAN、DEC等的排序方法
    • -n:使用纯数字进行排序
    • -r:反向排序
    • -u:就是uniq,相同的数字中,仅出现一行代表
    • -t:分隔符号,默认为tab来分隔
    • -k:以哪个区间进行排序的意思
  • uniq:如果排序完成,可以将重复的数字仅列出一个显示
    • -i:忽略大小写字符的不同
    • -c:进行计数
  • wc:可以计算出输出信息的整体数据
    • -i:仅列出行
    • -w:仅列出多少字
    • -m:多少字符
  • tee:此命令会将数据流分送到文件与屏幕
  • tr:可以删除一段信息当中的文字
    • -d:删除信息当中的字符
    • -s:替换掉重复的字符
  • col:将[tab]替换为空格
    • -A:显示所有特殊按键最后以col[tab]转成空白
    • -x:将[tab]键转换为对等的空格键
  • join:处理两个文件之间的数据,主要是处理两个文件当中,有相同数据的一行,才将它加到一起
    • -t:以空格符分隔数据,并且比对第一个阑尾的数据,如果两个文件相同,则将两条数据连成一行,且第一个栏位放在第一个
    • -i:忽略大小写的差异
    • -1:代表第一个文件要用哪个栏位分析
    • -2:代表第二个文件要用哪个栏位分析
  • paste:直接将两行贴在一起,且中间以[tab]键隔开
    • -d:后面可以接分隔字符,默认为[tab]
  • expand:将[tab]按键转成空格键
    • -t:一个[tab]键可以用几个空格键代替
  • unexpand:将空格键转成[tab]
  • split:可以将一个大问价根据文件大小或是行数来划分
    • -b:后面可接欲划分成的文件大小,可接单位,比如bkm
    • l:以行数划分
  • xargs <command>:可以将管道输出变为某个命令的参数
    • -0:如果输入的stdin含有特殊字符,例如\,空格等字符,这个-0可将它还原为一般字符
    • -e:这个EOF(end of file)的意思,后面可以接一个字符,当xargs分析到这个字符时,就会停止工作
    • -p:执行每个命令时,会询问使用者
    • -n:后面接次数,每次command命令执行时,要使用几个参数
  • -:某些命令需要用到文件名来处理时,该stdinstdout可以利用-来替代

文件格式化处理

  • sed:它也是一个管道命令,可以分析标准输入
  • awk:它倾向于一行当中分成几个字符案处理
  • diff <from-file> <to-file>:用于对比两个文件的差异,并且是以行为单位比较,diff通常使用在同一个文件或软件的新旧版本差异上
    • -b:忽略一行当中,仅有的多个空白的差异
    • -B:忽略空白行的差异
    • -i:忽略大小写的不同
  • cmp:通过字节单位进行文件之间的对比

shell 脚本

shell 的编写有以下注意事项

  1. 命令是从上而下、从左而右地分析执行
  2. 命令的执行中,命令、选项与参数的多个空格都会被忽略掉
  3. 空白行也将被忽略掉,并且[tab]按键产生的空白同样为空格键
  4. 如果读取到一个Enter符号CR,就尝试执行该行命令
  5. 如果一行的内容太多,则可以使用\[Enter]来扩展至下一行
  6. #可为注释 如何执行命令
  • 直接命令执行,.sh文件必须具有rx的权限,然后
  • 绝对路径
  • 相对路径
  • 变量PATH功能:将.sh文件放在PATH指定的目录内,比如~/bin/

简单范例

  1. 交互式脚本:变量内容由用户决定
read -p "Please input your first name: " firstname # 提示使用者输入
read -p "Please input your last name: " lastname # 提示使用者输入
echo -e "\nYour full name is: ${firstname} ${lastname}"# 提示使用者输入
  1. 随日期变化:利用date建立文件,用于将每天的数据备份成不同的文件名
echo -e "I will use 'touch' command to create 3 files." # 纯粹显示信息
read -p "Please input your filename: " fileuser # 提示使用者输入
# 为了避免使用者随意按 Enter,利用变量功能分析文件名
filename=${fileuser:-"filename"} # 开始判断是否有配置文件名
# 开始利用`date`命令来取得所需文件名
date1=$(date --date='2 days ago' +%Y%m%d) # 前两天的日期
file1=${filename}${date1}
touch "${file1}"
  1. 数值运算:简单的加减乘除 利用 declare 将变量定义为整数时才能进行运算,shell 脚本只支持整数运算

脚本的执行方式差异

不同的脚本执行方式会造成不一样的结果,尤其对 bash 的环境影响大。脚本的执行除了前面的方式之外,还可以利用 source 或是小数点 . 执行

  • 利用直接执行的方式执行脚本,当使用直接命令执行或是利用bash来执行脚本时,该脚本都会使用一个新的bash环境来执行脚本内的命令。使用这种执行方式时,其实脚本是在子进程的 bash 内执行的,也就是说当子进程完成后,在子进程内的各项变量或操作将会结束而不会传回到父进程中
  • 利用source会在父进程中执行脚本

善用判断式

  • test:可以用来检测系统上面某些文件或是相关的属性,有下面这些选项处理文件名
    • -e:是否存在

    • -f:是否存在且为文件

    • -d:是否存在且为目录

    • -b:是否存在且为一个block device设备

    • -c:是否存在且为一个character device设备

    • -S:是否存在且为一个socket文件

    • -p:是否存在且为一个FIFO(pipe)文件

    • -L:是否存在且为一个链接文件 关于文件的全线检测,如 test -r filename 表示可读否

    • -r:是否存在且具有可读权限

    • -w:是否存在且具有可写权限

    • -x:是否存在且具有可执行权限

    • -u:是否存在且具有SUID的属性

    • -g:是否存在且具有SGID的属性

    • -k:是否存在且具有Sticky bit的属性

    • -s:是否存在且为非空文件 两个文件之间的比较

    • -nt:判断file1是否比file2

    • -ot:判断file1是否比file2

    • -ef:判断file1是否比file2为同一文件,可用在判断hark link的判定上,主要意义在判定两个文件是否指向同一个inode 两个整数之间的比较

    • -eq(equal):两数值相等

    • -ne(not equal):两数值不等

    • -gt(greater than):是否大于

    • -lt(less than):是否小于

    • -ge(greater than or equal):大于或等于

    • -le(less than or equal):小于或等于 判定字符串的数据

    • test -z string:判定字符串是否为0?如果string为空字符串,则为true

    • test -n string:判定字符串是否为0?如果string为空字符串,则为false-n可省略

    • test str1 == str2:判定str1是否等于str2,若相等,返回true

    • test str1 != str2:判定str1是否等于str2,若相等,返回false 多重条件判定,比如 test -r filename -a -x filename

    • -a:两条件同时成立

    • -o:两条件任何一条成立

    • !:反相状态,比如test ! -x file

  • 可以使用判断符号[]来进行数据的判断,和test使用的场景几乎一模一样,在if中比较常用。比如[ "$HOME" == "$MAIL" ],使用它时,需要注意
    • 在中括号[]内的每个组件都需要空格来分隔
    • 在中括号内的变量,最好都以双引号括起来
    • 在中括号内的常数,最好都以单或双引号括起来
  • 可以在脚本文件名后带有参数
    • restart:比如/etc/init.d/network restart可以重启网络程序
    • stop:可以终止程序
  • 脚本针对参数已经设置了一些变量名称
/path/to/scriptname opt1 opt2 opt3 opt4
$0                  $1   $2   $3   $4
  • 除了数字变量之外,还有一些比较特殊的变量可以在脚本内使用
    • $#:代表后接的参数个数,比如上例显示4
    • $@:代表["$1" "$2" "$3" "$4"]之意,每个变量都是独立的
    • $*:代表[”$1c$2c$3c$4“]其中c为分隔字符,默认为空格

条件判断式

  • if...then:最常见的条件判断式,elif后需要有then,而else后不需要有then
  • netstat -tuln:获取目前主机启动的服务
    • Local Address:此字段代表的是本机所启动的网络服务,IP 的部分说明的是该服务位于哪个接口上,若为127.0.0.1则是针对本机开放
    • 每个端口都有特定的网络服务
      • 80www
      • 22ssh
      • 21ftp
      • 25mail
      • 111RPC远程过程调用
      • 631CUPS打印服务功能
  • case...esac:也就是switch case
  • function fname() {...}function的设置一定要在最前面
    • ${<数量>}:表示输入的第几个参数

循环

  • 不定循环
# condition 成立时进行循环
while [ condition ]
do
  # do something
done

# condition 成立时终止循环
until [ condition ]
do
  # do something
done
  • 固定循环,比如循环1 ~ 100,可以是for sitenu in $(seq 1 100)
for var in con1 con2 con3 ...
do
  # do something
done

还有一种数值处理的写法,比如 for ((i = 1; i <= ${nu}; i=i+1))

for (( <初始值>; <限制值>; <赋值运算>; ))
do
  # do something
done

跟踪和调试

  • sh <脚本名>
    • -n:不执行脚本,仅查询语法问题
    • -v:执行脚本前,先将脚本文件的内容打印到屏幕上
    • -x:将使用到的脚本内容显示到屏幕上,执行过程也会一起显示

Linux 账号管理与 ACL 权限设置

管理员的工组中,相当重要的一环就是管理账号

账号和用户组

  • 当我们登录 Linux 主机的时候,输入的是我们的账号,但其实Linux主机并不会直接认识你的账号名称,它仅认识ID,你的ID与账号的对应关系就在/etc/passwd中 当我们输入账号密码的时候,系统帮我们处理了以下内容
  1. 先查找/etc/passwd里是否有输入的账号,没有就退出,有的话将该账号对应的UIDGID(在/etc/group中)读出来。另外,该账号的家目录和shell设置也一并读出
  2. 核对密码表,进入/etc/shadow里找出对应的账号和UID,然后核对输入的密码与里面的密码是否相符
  3. 一切 OK 就进入 shell 管理的阶段
  • /etc/shadow:这个文件的构造是这样的,每个账号都代表一个账号,有几行就代表有几个账号在你的系统中。里面有很多账号本来就是系统正常运行所必须的,我们可以简称它为系统账号,比如bindaemonadmnobody等,请不要随意删除 使用 head -n 1 /etc/passwd 可以打印出第一行,为 root:$433wtbCCce:16559:0:99999:7::: ,这里的由 : 分隔的字段分别表示的是

    1. 账号名称:就是账号,需要用来对应UID,例如root对应的UID就是0
    2. 密码:这个字段内的数据才是真正的密码,而且是经过编码的密码。你只会看到一些特殊的字母。另外因为这个文件可能会被破解所以它的权限是-rw--------或是----------,即只有root可以读写
    3. 最近修改密码的日期,从1970/1/1开始计算
    4. 密码不可被修改的天数:和第三个字段相比,如果是0则表示密码可以随时被修改
    5. 密码需要重新修改的天数(与第三个字段相比):指定最近一次修改之后,多少天之内必须重新设置密码
    6. 密码需要修改期限前的警告天数(与第五个字段相比):当密码有效期限快要到的时候(第五字段),系统会更具这个字段的设置,发出警告信息给这个账号
    7. 密码过期后的账号宽限时间(与第五个字段相比):密码过期几天后,如果用户还是没有登录更改密码,那么这个账号的密码就会失效,该账号再也无法使用该密码登录
    8. 账号失效日期:1970/7/1 以来的总天数,该账号在此字段规定的日期之后,敬无法再被使用
    9. 保留:看以后是否还有新功能加入
  • authconfig --test | grep hashing可以知道shadow是哪种加密机制

  • /etc/group:这个文件就是在记录GID与组名的对应记录 使用 head -n 1 /etc/group 可以打印出第一行,为 root:x:0: ,每一行代表一个用户组,以冒号 : 作为分隔符,这里的字段分别表示的是

    1. 组名,用来给人使用,基本上需要与第三字段的GID相对应
    2. 用户组密码,不需要设置,通常是给用户组管理员使用,。密码已经移动到/etc/shadow中,因此这个字段只会存在一个x而已
    3. GID,我们/etc/passwd第四个字段使用的GID对应的用户组名,就是这里对应比来的
    4. 此用户组支持的账号名称,如果某个账号想要加入此用户组,将该账号填入这个字段即可。比如可以使用root:x:0:dmtsai,alex
  • 假如我同时假如多个用户组,那么我在作业的时候,到底是以哪个用户组为准呢?

    • 初始用户组initial group:就是在/etc/passwd里的第四栏所谓的GID。也就是用户一登录系统,就会拥有这个用户组的相关权限。而非初始用户组就需要在/etc/group的第四个字段中加入用户名。只要用户处于一个用户组,就能获得这个用户组的所有权限
    • 有效用户组effective group
      • groups:这个命令输出的第一个用户组即为有效用户组,当我们创建一个新文件时,用户组就是这个用户组
      • newgrp:可以切换有效用户组,但是想要切换的用户组必须是你已经有支持的用户组。它切换用户组时是以另外一个shell来提供这个功能,新的 shell 基于用户有效的 GID,所以用户的用户组权限将会被重新计算
  • /etc/gshadow:这个文件内同样还是使用冒号:来作为字段的分隔字符,而且这个文件几乎和/etc/group一模一样。不过它的第二个字段是密码栏,如果密码栏上面是!或为空时,表示改用户组不具有用户组管理员。所以这个gshadow的最大功能就是建立用户组管理员

账号管理

  • useradd:可以使用这个命令新建账号,而密码使用passwd来新建

    • -u:后面接的是UID,直接指定一个特定的UID

    • -g:后面接的用户组就是上面提到的初始用户组,该用户组的GID会被放到/etc/passwd的第四个阑尾

    • -G:后面接的用户组就是该账号还可加入的用户组,这个选项与参数会修改/etc/group内的相关内容

    • -M:强制,不要建立使用者家目录。系统账号默认值

    • -m:强制,要建立使用者家目录。一般账号默认值

    • -c:为·/etc/passwd的第五栏的说明内容,可以随便我们设置

    • -d:指定某个目录成为家目录,而不要使用默认值,务必使用绝对路径

    • -r:建立一个系统的账号,这个账号的UID会有限制

    • -s:后面接一个 shell,若没有指定则默认是/bin/bash

    • -e:后面接一个日期,格式为YYYY-MM-DD,此选项可写入shadow第八栏位,亦即账号失效日的设置选项

    • -f:后面接shadow的第七栏位选项,指定密码是否会失效,0为立刻失效,-1为永不失效(密码只会过期而强制于登录时重新设置而已) 其实系统已经帮我们规定好非常多的默认值了,所以我们可以简单地使用 useradd <账号> 来建立用户。在 CentOS 这些默认值主要会帮我们处理几个选项:

    • /etc/passwd里建立一行与账号相关的数据,包括建立UID/GID/家目录等;

    • /etc/shadow里将此账号的相关参数写入,但是尚未有密码

    • /etc/group里加入一个与账号名一模一样的组名

    • /home下面建立一个与账号同名的目录作为用户家目录,且权限为700 由于在 /etc/shadow 里仅仅会有密码参数而不会有加密过的密码数据,所以我们在建立用户账号时,还需要使用 passwd <账号> 来设置密码才算是完成了用户建立的流程 一般账号应该是 1000 号以后,用户自己建立的系统账号一般是小于 1000 号以下,所以加上 -r 后,系统会主动将账号与账号同名用户组的 UID/GID 都指定小于 1000 以下。由于系统账号主要是用来执行系统所需服务的权限设置,所以系统账号默认都不会主动建立家目录

    • useradd参考文件,其实useradd的默认值可以使用useradd -D查看。这些数据是由/etc/default/useradd调用出来的

    • /etc/longin.defs:用于查看UID/GID的密码参数

    • /etc/skel:用户家目录参考基准目录

  • passwd:用于设置密码

    • --stdin:可以通过来自前一个管道的数据,作为密码输入,对 shell 脚本有帮助
    • -lLock的意思,会将/etc/shadow第二栏最前面加上!使之失效
    • -u:与-l相对,为·unlock的意思,即为解锁
    • -S:列出密码相关参数,即shadow文件内的大部分信息
    • -n:后面接天数,shadow的第四栏位,多久不可修改密码天数
    • -x:后面接天数,shadow的第五栏位,多久内必须要修改密码
    • -n:后面接天数,shadow的第六栏位,密码过期前的警告天数
    • -n:后面接日期,shadow的第七栏位,密码失效日期 要帮一般账号建立密码需要使用 passwd <账号> 的格式,使用 passwd 表示修改自己的密码
  • change:用于详细的密码参数显示

    • -l:列出该账号的详细密码参数
    • -d:接日期,修改shadow第三栏位
    • -E:接日期,修改shadow第八栏位
    • -I:接天数,修改shadow第七栏位
    • -m:接天数,修改shadow第四栏位
    • -M:接天数,修改shadow第五栏位
    • -W:接天数,修改shadow第六栏位
  • usermod:进行账号相关的微调

    • -c:接账号的说明,即/etc/passwd第五栏的说明栏
    • -d:接账号的家目录,即/etc/passwd第六栏
    • -e:接日期,即/etc/shadow第八个栏位
    • -f:接天数,即shadow的第七栏位
    • -g:接初始用户组,即/etc/passwd第四栏,亦即是GID的栏位
    • -G:接次要用户组,修改这个使用者能够支持的用户组,修改的是/etc/group
    • -a:与-G合用,可增加次要用户组的支持
    • -l:接账号名称,修改账号名称,即/etc/passwd第一栏
    • -s:接 shell 的实际文件,例如/bin/bash/bin/csh
    • -u:后面接UID数字,即/etc/passwd第三栏
    • -L:暂时将使用者的密码冻结,让它无法登录,其实仅改/etc/shadow的密码栏
    • -U:将/etc/shadow密码栏的感叹号!拿掉,解锁
  • userdel <username>:用于删除用户的相关数据,可以将/etc/shadow里的第八字段即账号失效日期设置为0就可让账号无法使用,但数据会保留。而这个命令不会保存数据

    • -r:连同使用者的家目录一起删除
  • id <username>:可查询到UID/GID等信息

  • finger:可以查看很多用户的相关信息,大部分信息都是/etc/passwd这个文件里的信息。但是新的系统默认不安装这个软件

  • chsh:就是change shell的缩写

    • -l:列出目前系统上可用的shell,其实就是/etc/shell的内容
    • -s:设置修改自己的 shell
  • groupadd <用户组名称>:用于新增用户组

    • -g:后面接某个特定的GID,用来直接设置某个GID
    • -r:建立系统用户组,与/etc/login.defs内的GID_MIN有关
  • groupmod:与usermod类似,仅是在进行group相关参数的修改而已

    • -g:修改既有的GID数字
    • -r:修改既有用户组名称
  • groupdel:删除用户组

  • gpasswd <groupname>:用户组管理员功能,就是让某个用户组具有一个管理员,无参数时,表示设置groupname密码

    • -a <user>:添加用户到组
    • -d <user>:删除用户
    • -A:将groupname的管理权交由后面的使用者管理,即该用户组管理员
    • -M:将某些账号加入到这个用户组当中
    • -r:将groupname的密码删除
    • -R:将groupname的密码失效

用户身份切换

身份的切换一般包括以下原因

  • 使用一般账号:系统日常操作的好习惯,这样可以避免操作错一些严重的命令

  • 用较低权限启动系统服务:相对于系统安全,有的时候,我们必须要以某些系统账号来执行程序

  • 软件本身的限制:一般使用一般账号登录系统,等到需要进行系统维护或软件更新时再转换身份

  • 通过su -直接将身份变为root即可,但这个命令却需要root的密码

  • 通过sudo 命令执行root的命令串,由于sudo需要事先设置妥当,且sudo需要输入用户自己的密码,因此多人共管一台主机时,sudosu好 下面是 susudo 的用法

  • su:它可以进行任何身份的切换。单纯使用这个命令切换成为root的省份,读取的变量设置方式为非登录 shell 的方式,这种方式很多原本的变量不会被修改

    • - :代表使用login-shell的变量文件读取方式来登录系统。若使用者的名称没有加上,则代表切换为root的身份

    • -l:与-类似,但后面需要加欲切换到使用者账号,也就是login-shell的方式

    • -m-m-p一样,表示使用目前的环境设置,而不读取新使用者的配置文件

    • -c:仅进行一次命令,所以-c后面可以加上命令 总结下用法

    • 若要完整地切换到到新用户的环境,必须使用su - usernamesu -l username才会连同PATHUSERMAIL等变量转换成新用户的环境

    • 如果仅想要执行一次root的命令,可以利用su - -c <命令串>的方式来处理

    • 使用root切换成为任何用户时,并不需要输入新用户的密码

  • sudo:此命令可以让你以其他用户的身份执行命令,因此并非所有人都能执行sudo,而是仅有规范到/etc/sudoers内的用户才会执行sudo这个命令

    • -b:将后续的命令放到后台中让系统自动执行,而不与目前的 shell 产生影响
    • -u:后面可以接欲切换到使用者,若无此项则代表切换身份为root
    • sudo默认仅有root能使用,因为sudo的执行时这样的流程
    1. 当用户执行sudo时,系统于/etc/sudoers文件中查找该用户是否有执行sudo的权限
    2. 若用户具有可执行sudo的权限后,便让用户输入用户自己的密码来确认
    3. 若密码输入成功,便开始进行sudo后续阶段命令,root不用输入密码
    4. 若欲切换的身份与执行者身份相同,也不需要输入密码
  • visudo/etc/sudoers文件需要这个命令进行修改,如果文件设置错误会导致无法使用sudo命令的后果

用户的特殊 shell 和 PAM 模块

如果想让用户无法使用 bash 或其他 shell 来登录系统,我们可以考虑单独使用 /sbin/noligin 作为他们的 shell ,这样,当我的主机被尝试想要登录系统以获取 shell 环境时,可以拒绝该账号 如我们想要某个具有 /sbin/nologin 的用户知道,它们不能登陆主机,可以建立 /etc/nologin.txt 这个文件

  • PAM(Pluggable Authentication Modules,插入式验证模块)可以说是一套应用程序编程接口,它提供了一连串的验证机制,只要用户将验证阶段的需求告知PAM后,PAM就能够返回用户验证的结果成功或失败
  • 当你执行passwd后,这个程序调用PAM的流程是:
  1. 用户开始执行/usr/bin/passwd这个程序,并输入密码
  2. passwd调用PAM模块进行验证
  3. PAM模块会到/etc/pam.c/找寻与程序passwd同名的配置文件
  4. 根据/etc/pam.d/passwd内的设置,引用相关的PAM模块逐步进行验证分析
  5. 将验证结果返回passwd这个程序
  6. passwd这个程序会更具PAM返回的结果决定下一个操作

用户信息传递

  • wwho可以查询目前已登录在系统上的用户
  • lastlog:会获取/var/log/lastlog这个文件来知道每个账号最近登录的时间
  • write <使用者账号> <使用者所在终端页面>:可以和其他用户讲话,但会中断使用者原本的任务
  • mesg n:可以阻止接收消息,启用就是mesg y 每个主机上的用户都有一个 mailbox ,我们可以寄、收 mailbox 里的邮件,一般来说, mailbox 都会放置在 /var/spool/mail
  • mail -s <邮件标题> username@localhost:可以寄出邮件,可以使用数据流定向来设置 mail 内容mail -s <邮件标题> username@localhost < <filename> mail :可以接收邮件

计划任务

计划任务一般是通过 crontabat 这两个东西完成,有两种计划任务的方式

  • crontab:例行性的,每个一定的周期来办的事项。会一直循环下去
  • at:突发性的,这次做完没有下一次

常见的例行工作

  • 执行日志文件的轮询(logrotate):会主动将系统所产生的各种信息记录下来,这就是日志文件
  • 日志文件分析(logwatch):可以主动分析登录信息
  • 建立(locate)的数据库:执行文件名的查询
  • (manpage)查询数据库的建立:也是提供快速查询
  • (RPM)软件日志文件的建立:由于系统可能常常变更软件,可以将文件名作为排序的记录
  • 删除缓存(tmpwatch):有时软件关闭不会主动删除缓存
  • 与网络服务有关的分析操作:比如apache

执行一次的计划任务

  • at <TIME | 任务号码>:定义特定时间来执行
    • -m:当at的任务完成后,即便没有输出信息,也会发email通知使用者任务已完成
    • -l:相当于atq,列出系统上该使用者的at计划
    • -d:相当于atrm,可以取消一个在at计划中的任务
    • -v:可以使用较明显的时间格式列出at计划中的任务列表
    • -c:可以列出后面接的该项任务的世纪名流内容
    • TIME:时间格式 当我们使用 at 时会进入一个 at shell 的环境来让用户知执行命令,此时,最好使用绝对路径来执行命令。

at 命令是在后台执行的,它会独立出你的 bash 环境,然后交给系统的 atd 程序来接管

  • batch:系统有空时才执行后台任务,它其实也是利用at来执行任务,只不过加了一些控制参数,它是在CPU负载率小于0.8时,才执行工作任务

循环执行任务

建立循环型计划任务时,使用的是 crontab 这个命令,不过为了避免安全性问题,可以限制使用 crontab 的用户账号。可以使用的配置文件有

  • /etc/cron.allow:把可以使用crontab的账号写入其中,没有则不能使用
  • /etc/cron.deny:将不可以使用crontab的账号写入其中,没有则可以使用
  • /var/log/cron:当用户使用crontab这个命令建立计划任务后,该计划任务会被记录到这个文件中,而且是以账号作为判断根据
  • crontab [-u username] [-l|-e|-r]:循环执行任务
    • -u:只有root才能执行这个任务,帮其他使用者建立/删除crontab计划任务
    • -e:编辑crontab的任务内容
    • -l:查看crontab的任务内容
    • -r:删除所有crontab的任务内容,如果仅删除一项,使用-e
  • crontab -e是针对用户的cron来设计的,如果要执行系统的例行性任务时,该怎么办,只需要编辑/etc/crontab这个文件就可以。而crontab -e这个crontab其实是/usr/bin/crontab这个执行文件,但/etc/crontab可是一个纯文本文件,你可以用root的身份编辑下这个文件
  • etc/cron.d/:可以拥有软件自己的crontab的定时名列
  • /etc/cron.hourly目录里的脚本会在 5 分钟内随机选一个时间执行里面的所有执行文件

可唤醒停机任务的工作任务

  • anacron:用于处理非 24 小时运行的 Linux 系统所执行的crontab。它会每小时被crond执行一次,然后anacron再去检测相关的计划任务有没有被执行,如果有超过期限的任务在,就执行该任务。执行完毕或无需执行时anacron就停止
    • -s:开始连续地执行各项任务,更具时间记录文件的数据判断是否执行
    • -f:强制执行,而不去判断时间记录文件的时间戳
    • -n:立即执行未执行的任务,而不延迟任何任务
    • -u:仅更新时间记录文件的时间戳,不执行任何命令
  • etc/anacrontab用于更改配置

进程管理与 SELinux

一个程序被加载到内存当中运行,那么内存中的那个数据就被称为进程 process ,进程是操作系统上非常重要的概念,所有系统上面运行的程序都会以进程的形式存在

什么是进程

触发任何一个事件时,系统都会将它定义成一个进程,并且基于这个进程一个 ID ,称为 PID ,同时根据触发这个进程的用户与相关属性关系,给予这个 PID 一组有效的权限设置 执行一个程序或命令可以触发一个事件而获取一个 PID ,当我们要让系统工作的时候,需要启动一个二进制文件,这个二进制文件就是程序 每个进程都有三组权限,没组都具有 rwx 的权限,所以 不同的用户身份执行这个程序时,系统给予的权限也不同

当我们登录并执行 bash 时,系统已经给了我们一个 PID ,这个 PID 就是根据登陆者的 UID/GID(/etc/passwd) 而来,而这个进程执行其他作业时,由这个进程衍生出来的进程在一般状态下,也会沿用这个进程的相关权限 做个总结

  • 程序program:通常为二进制程序,放置在存储媒介中,以物理文件的形式存在
  • 进程process:程序被触发后,执行者的权限与属性、程序的代码与所需数据等都会被加载到内存中,操作系统回个这个内存中的单元一个标识符PID,可以说进程就是一个正在运行中的程序
  • 子进程与父进程
    • 比如当我们登录系统后,会获取一个bashshell,此时我们用这个bash提供的接口去执行另一个命令,那些另外执行的命令也会被触发成为PID,而这个PID就是子进程,通过PPID(ParentPID)来判断父进程
    • 子进程与父进程之间的关系还挺复杂,最大的复杂点在于进程之间的调用。Linux的程序调用通常被称为fork-and-exec的流程。进程都会借由父进程以复制的方式产生一个一模一样的子进程,然后被复制出来的进程再以exec的方式来执行实际要执行的进程,最终就成为一个子进程
  • 很多进程会在常驻在内存中并一直持续不断地运行,比如系统或网络服务,这些常驻进程就会被我们称为服务
  • linux 的多人多任务的特色
    • 多人环境,linux 上有多种不同的账号,每种账号都有特殊的权限
    • 多任务操作,linux 可以让 CPU 在各个任务间切换,也就是CPU频率
    • 多重登录环境中的七个基本终端界面,在 linux 中,默认提供了六个命令行登录界面,以及一个图形界面,可以使用[ALT]+[F1]+...[F7]来进行切换,而且每个终端界面的登录者可以不同
    • 特殊的进程管理操作。linux 可以仅将错误的进程踢掉,而不干酪其他进程的执行
    • bash 下的任务管理。我们可以在单一的 bash 界面下,同时执行多个任务
    • 多人多任务确实有很多好处,但其实也有管理上的难题,因为 CPU 的计算能力与内存可能会因为用户数量的增多而不够用了

任务管理 job control

当我们登录系统获取 bash shell 之后,在单一终端下执行多个任务的操作管理。在执行任务管理的操作中,其实每个人物都是目前 bash 的子进程,彼此之间是有相关性的,我们无法用任务管理的方式由 tty1 的环境去管理 tty2 的 bash 假设我们只有一个终端,na 因此可以出现提示字符让你操作的环境就成为前台,至于其他任务就可以放入后台去暂停或运行,而放入后台的任务不能用 [ctrl] + c 来终止的。总之会有以下限制

  • 这些任务所触发的进程必须来自于你的shell的子进程

  • 前台:可以控制与执行命令的这个环境称为前台的命令

  • 后台:可以自动执行的任务,你无法使用[ctrl]+c来终止它,可以使用bgfg调用该任务

  • 后台中执行的进程不能当代terinal或 shell 的输入 实际执行 job 控制的命令有以下这些

  • &:当在命令的结尾加上这个符号会进入后台执行,此时会输出一行[1] 14432其实对应的就是[job number] PID

  • [ctrl]+z:将目前的任务丢到后台中暂停,此时会打印出[<job number>]+<任务状态>

  • jobs:可以查看目前的后台任务状态

    • -l:除了列出job number与命令串之外,同时列出PID的号码
    • -r:列出正在后台run的任务
    • -s:仅列出在后台中暂停stop的任务
    • +代表最近被放在后台的任务号码,-代表最近第二个被放置到后台中的任务号码
  • fg %<jobnumber>:可将后台任务拿到前台处理,%是可有可无的,如果没有参数,则为+的任务

  • bg:可以将一个任务在后台运行

  • kill -<signal> %<jobnumber>:可以直接将任务删除,如果没有%,则会以PID处理

    • -l:列出目前kill能够使用的信号有哪些
    • signal:代表基于后面接的任务什么样的只是 - -1:重新读取一次参数的配置文件(类似reload) - -2:代表由键盘输入[ctrl]+c同样的操作 - -9:立即强制删除一个任务,特别是删除不正常的任务 - -15:以正常的进程方式终止一项任务,与-9不同 我们在任务管理当中提到的后台是指在终端模式下可以避免 [ctrl]+c 终端的一个清净,你可以说那个是 bash 的后台,而不是放到系统的后台中,所以,任务管理端后台依旧与终端有关。在任务尚未结束的情况下,你脱机了,则该任务不会继续执行
  • nohub [命令与参数]:其中命令与参数是在终端前台中的任务

  • nohub [命令与参数] &:其中命令与参数是在终端后台中的任务

进程管理

一个称职的系统管理员,必须要熟悉进程的管理流程才行

  • ps:将某个时间点的进程情况打印出来

    • ps aux:查看系统所有进程

    • ps -lA:也能够查看系统所有进程

    • -A:所有进程都显示出来,与-e具有相同效果

    • -a:不显示与终端相关的所有进程

    • -u:有效使用者相关的进程

    • -l:仅查看自己的 bash 相关进程

    • x:通常和a这个参数一起使用,可以列出完整信息 输出格式规划

    • l:较长、较详细的将该PID信息列出

    • j:任务的格式jobs format

    • -f:做一个更为完整的输出 ps -l :可以仅列出与你操作系统有关的进程,即最上层的父进程会是你自己的 bash 而没有扩展到 systemd 这个进程中, ps -l 显示的数据有下面这些

    • F:代表这个进程表示process flag,说明这个进程的权限

      • 4:root
      • 1:表示此子进程只是执行复制而没有实际执行
    • S:进程状态

      • R(Running):正在运行
      • S(Sleep):正在睡眠状态idle,但可以被唤醒signal
      • D:不可被唤醒的睡眠状态,通常这个进程可能在等待I/O的状态
      • T:停止状态stop,可能是在任务控制(后台暂停)或是跟踪trace状态
      • Z(Zombie):僵尸状态,流程已经终止但却无法被删除至内存外
    • UID/PID/PPID:对应 ID

    • C:CPU 使用率,单位为白分别

    • PRI/NIPriority/Nice的缩写,代表该进程被 CPU 所执行的优先级,数值越小代表该进程越快被 CPU 执行

    • ADDR/SZ/WCHAN:都与内存有关,ADDRkernel function,指出该进程在内存中的哪个部分,SZ表示该进程用掉多少内存,WCHAN表示目前进程是否运行

    • TTY:登陆者的终端位置,如为远程登录则使用动态终端接口名称pts/n

    • TIME:使用的 CPU 时间,此进程实际花费 CPU 运行时间,而不是系统时间

    • CMD:就是command的缩写,表示触发此进程的触发进程的命令是什么

  • ps aux:查看所有进程,它显示的各字段的意义为

    • USER:该进程所属用户账号
    • PID:进程 ID
    • %CPU:该进程使用掉的 CPU 资源百分比
    • %MEM:该进程所占用的物理内存百分比
    • VSZ:该进程使用掉的虚拟内存量(KB)
    • RSS:该进程占用的固定的内存量(KB)
    • TTY:该进程在哪个终端上面运行
    • STAT:该进程目前状态,状态与ps -lS标识相同
    • START:该进程被触发启动的时间
    • TIME:该进程实际使用 CPU 运行的时间
    • COMMAND:该进程的实际命令是什么,如果后面接上<defunct>则表示这是个僵尸进程
  • top:动态查看进程的变化,相对于ps是选取一个时间点的进程状态,top则可以持续监测进程运行的状态,其实功能特别多,最好参考man top

    • -d:后面可以接秒数,就是整个进程界面更新的秒数
    • -b:以批量的方式执行top,还有更多的参数可以使用
    • -n:与-b搭配,意义是,需要执行几次top的输出结果
    • -p:指定某些个PID来执行查看检测而已 top 默认使用 CPU 使用率作为排序的依据,如果使用内存使用率排序,则按下 M ,恢复按 Pq 退出,输出文件可以 top -b -n 2 > /tmp/top.txt
  • pstree:用于寻找进程之间的相关性

    • -A:各进程树之间以ASCII字符来连接

    • -U:各进程树之间的链接以Unicode的字符链接

    • -p:并同时列出每个进程的PID

    • -u:并同时列出每个进程所属账号连接 进程之间是可以互相管理的,通过给予该进程一个信号 signal 去告知进程你想让它干什么,可以使用 kill -lman 7 signal 来查询,下面是一些常见的信号

    • SIGHUP:启动被终止的进程,可以让该PID重新读取自己的配置文件,类似重新启动

    • SIGINT:相当于键盘输入[ctrl] + c来中断一个进程的运行

    • SIGKILL:强制终止一个进程的执行,如果该进程执行到一半,可能会有半成品产生

    • SIGTERM:以正常的方式结束仅此来终止该进程

    • SIGSTOP:相当于键盘输入[ctrl] + z暂停一个进程

  • kill -<signal> <PID>:可以帮我们将这个信号传送给某个任务%jobnumber或某个PIDkill后面加数字和%number的情况是不同的

  • killall -<signal> <命令名称>:通过命令名称来传递信号,最好用来删除服务

    • -i(interactive):互动的意思,当需要删除时,会出现提示字符给使用者
    • -e(exact):表示后面接的command name要一致,但整个完整的命令不能超过15个字符
    • -I:命令名称忽略大小写
  • Priority:优先级,越低越优先,这个PRI值是由内核动态调整的,用户无法直接调整PRI值。如果需要调整进程的优先级,需要通过nice值,也就是NI PRI(new) = PRI(old) + nice

  • nice -n <number> <command>:新执行的命令即给予新的nice值,这个命令需要注意

    • nice值可调整的范围为-20~19
    • root可随意调整自己或它人进程的nice值,且范围为-20~19
    • 一般用户仅可调整自己进程的nice值,且范围为0~19
    • 一般用户仅可将nice值调高
    • -n:后面接数值,范围-20~19
  • renice -n <number> <PID>:已存在进程的nice重新调整

  • free:查看内存使用情况

    • -b:直接输入free时,显示的单位为KBytes,我们可以使用bmkg来显示单位
    • -t:在输出的最终结果,显示物理内存与swap的总量
    • -s:可以让系统不断刷新显示数据
    • -c:与-s同时处理,让free列出几列
  • uname:查看系统与内核相关信息

    • -a:所有系统相关的信息,包括下面的数据都会被列出
    • -s:系统内核名称
    • -r:内核版本
    • -m:本系统的硬件架构
    • -p:CPU 的类型
    • -i:硬件的平台
  • uptime:查看系统启动时间与任务负载

  • netstat:追踪网络或socket文件

    • -a:将目前系统上所有的链接,监听,socket信息都列出来

    • -t:列出tcp网络封包的信息

    • -u:列出udp网络封包的信息

    • -n:不以进程的服务名称,以端口号来显示

    • -l:列出目前正在进行网络监听的服务

    • -p:列出该网络服务的进程PID netstat 的输出分为两大部分

    • Proto:网络的封装协议,主要分为TCPUDP

    • Recv-Q:非由用户进程连接到此socket的复制的总byte

    • Send-Q:非由远程主机传送过来的acknowledgedbyte

    • Local Address:本地端的IP:port的情况

    • Foreign Address:远程主机的IP:port的情况

    • State:连接状态,主要有建立ESTABLISHED以及监听LISTEN

  • socket文件可以沟通两个进程之间的信息,因此进程可以获取对方传送过来的数据

    • Proto:一般为unix
    • RefCnt:连接到此socket的进程数量
    • Flags:链接的标识
    • Typesocket存取的类型,主要有确认连接的STREAM和不需确认的DGRAM两种
    • State:若为CONNECTED则表示多个进程之间已经建立连接
    • Path:连接到此socket的相关进程的路径,或是相关数据输出的路径
  • dmesg:分析内核产生的信息,能不能内核检测的信息识别出来

  • vmstat:检测系统资源变化,与读写有关

特殊文件和进程

  • SUID的权限与进程的相关性非常大,先看看SUID的程序如何被一般用户只需,具有什么特点

    • SUID权限仅对二进制程序有效
    • 执行者对于该程序需要具有x的可执行权限
    • 本权限仅在执行该程序的过程中有效run-time
    • 执行者将具有该程序拥有者的权限 所以说,整个 SUID 的权限会生效是由于具有该权限的程序被处罚,所以执行者可以具有程序拥有者的权限就是在该程序变成进程的那个时候。当我们在触发 passwd 这个程序的时候,会获得一个新的进程与 PID 、该 PID 产生时通过 SUID 来给予该 PID 特殊的权限设置
  • 各个进程的PID都以目录的形式存在于/proc当中,比如我们启动所执行的第一个程序systemdPID1,则这个PID的所有相关信息都写入/proc/1/*当中。可以看看这里面的其他关于进程的文件

  • fuser:借由文件找出正在使用该文件的进程

    • -u:除了进程的PID之外,列出该进程的拥有者
    • -m:后面接的那个文件名会主动地上提到文件系统的最顶层
    • -v:可以列出每个文件与进程还有命令的完整相关性
    • -k:找出使用该文件/目录的PID,并试图以SIGKILL这个信号给予该PID
    • -i:必须与-k配合,删除之前询问使用者意愿
    • -signal:例如-1-15等默认-9
  • lsof <+d>:列出被进程所使用的的文件名称

    • -a:多项数据同时成立才显示出结果
    • -U:仅列出UNIX-like系统的socket文件类型
    • -u:后面接username,列出该使用者相关进程所使用的文件
    • +d:后面接目录,亦是找出某个目录下已经被使用的文件
  • pidof <program name>:找出某个正在执行的进程的PID

    • -s:仅列出一个PID而不是所有的PID
    • -x:同时列出该program name可能的PPID的那个进程

SELinux

SELinux 其实是 Security Enhanced Linux 的英文缩写

  • 美国国家安全局发现系统出现问题的原因大部分在于内部员工的资源误用。SELinux就是整合到内核的一个模块。SELinux 是在进行进程、文件等详细权限配置时依据的一个内核模块,由于启动网络服务的也是进程,因此刚好也能够控制网络服务能否读写系统资源的一道关卡
  • SELinux主要管理的就是进程,因此可将主体和本进程画上等号

daemon

系统为了提供某些功能必须提供一些服务,这个服务就被称为 service ,而 service 的提供需要程序的运行,所以完成这个 service 的程序我们就称呼它为 daemon

每一个程序的开发者,在开发它们的服务时,通常在服务的名称后会加上一个 d ,比如计划任务命令健力多 atcron 这两个服务,它的程序就会被趣味 atdcrond ,这个 d 代表的就是 daemon 的意思 CentOS 7.x 之后,Red Hat 系列的发行版改用 systemd 这个启动服务管理机制,它有以下好处

  • 并行处理所有服务,加速开机流程
  • 一经要求就响应的on-demand启动方式
  • 服务依赖性的自我检查,由于systemd可以自定义服务依赖性的检查,因此如果B服务是在A服务的上面启动的,那么手动启动B服务时,会自动启动A服务
  • daemon功能分类,为了梳理清楚所有服务的功能,因此,首先systemd先定义所有的服务为一个服务单位unit,并将该unit归类到不同的服务类型type中。它将服务单位区分为servicesockettargetpathsnapshottimer等多种不同的类型
  • 将多个daemons集合成一个群组
  • 向下兼容旧有的init服务脚本
  • systemd的配置文件放置目录
    • /usr/lib/systemd/system/:每个服务最主要的启动脚本,这些脚本的优先级比/usr/lib/systemd/system
    • /run/systemd/system/:系统执行过程中所产生的的服务脚本,这些脚本的优先级比/usr/lib/systemd/system/
    • /etc/systemd/system/:管理员根据主机系统的需求所建立的执行脚本,执行优先级又比/usr/lib/systemd/system/高 到底操作系统启动会不会执行某些服务其实是看 /etc/systemd/system/ 下面的设置,所以该目录下面是一大堆链接文件。而实际执行的 systemd 启动脚本配置文件其实都是放置在 /usr/lib/systemd/system/ 下面,所以修改某个服务启动的设置,应该在 /usr/lib/systemd/system/

/usr/lib/systemd/system/ 以下的数据是通过扩展名来区分不同的类型 type

systemctl

基本上 systemd 这个启动服务的机制,主要是通过一个名为 systemctl 的命令来完成 一般来说服务的启动有两个阶段,一是开机的时候设置要不要启动这个服务,二是你现在要不要启动这个服务

  • systemctl <command> <unit>:其中command主要有
    • start:立刻启动后面接的unit
    • stop:立刻关闭后面接的unit
    • restart:立刻重新启动后面接的unit
    • reload:不关闭后面接的unit的情况下,重新加载配置文件,让设置生效
    • enable:设置下次开机时,后面接的unit会被启动
    • disable:设置下次开机时,后面接的unit不会被启动
    • status:后面接的这个unit的状态会列出有没有正在执行,开机默认执行与否,登录等信息等
    • is-active:当前是否正在运行
    • is-enable:开机时有没有默认要启动这个unit
  • systemctl <command> <--type==TYPE> <--all>:用于查看系统上所有的服务
    • command
      • list-units:依据unit显示目前有启动的unit,若加上--all才会列出没启动的
      • list-units-files:依据/usr/lib/systemd/system/的文件,将所有文件列表说明
    • --type==TYPE:也就是之前提到的unit类型
  • systemctl list-dependencies <unit> <--reverse>:追踪一个unit的依赖性

与 systemd 的 daemon 运行过程相关的目录简介

  • /usr/lib/systemd/system/:Centos 官方提供的软件安装后,默认的启动脚本配置方式都在这里
  • /run/systemd/system/:系统执行过程中产生的执行脚本,优先级比上面的高
  • /etc/systemd/system/:管理员根据系统需求建立的执行脚本,优先级比上面的高
  • /etc/sysconfig/*:几乎所有的服务都会将初始化的一些选项设置写入到这个目录
  • /var/lib/:一些会产生数据的服务都会将他的数据写入到这个目录中
  • /run/:放了很多daemon的缓存,包括lock文件以及PID文件
  • /etc/services:通过这里面的设置来让服务和端口对应一起

针对 service 类型的配置文件

如果你想要额外修改配置文件,应该放置在 /etc/systemd/system/ 目录中。 可能在系统中的服务

  • dovecot:可以设置收发邮件的服务,除非你的 Linux 是邮件服务器才需要这个服务
  • httpd:这个服务可以让Linux服务器称为网站服务器
  • named:也就是Domain Name System, DNS的服务
  • nfs | nfs-server:也就是Network Filesystem
  • smb | nmb:这个服务可让 Linux 称为网络邻居
  • vsftpd:作为文件传输服务器使用FTP
  • sshd:远程服务器的功能,它可以加密
  • rpcbind:完成 RPC 协议的重要服务,包括NFSNIS都需要这个东西的协助
  • postfix:邮件发送主机

日志

日志文件就是记录系统活动信息的几个文件,何时何地何人做了什么操作等

  • Linux 常见的日志文件文件名
    • /var/log/boot.log:科技启动的时候系统内核回去检测和启动硬件,这些流程会记录在这个文件中
    • /var/log/croncrontab任务的执行
    • /var/log/dmesg:记录系统在开机的时候内核检测过程所产生的各项信息
    • /var/log/lastlog:可以记录系统上所有账号最后一次登录系统时的相关信息
    • /var/log/maillog | /var/log/mail/*:记录邮件的往来信息
    • /var/log/messages:几乎系统发生的所有错误信息都会记录在这个文件中
    • /var/log/secure:只要牵涉到需要输入账号密码的软件,都会记录到这个文件中
    • /var/log/wtmp | /var/log/faillog:这两个文件可以记录正确登录系统者的账户信息和错误登录时所使用的账户信息
    • /var/log/httpd/* | /var/log/samba/*:不同的网络服务会使用它们自己的日志文件来记录它们自己所产生的各种信息
  • 针对日志文件所需要的功能,我们需要的服务和进程有
    • systemd-journald.service:最主要的信息记录者,由systemd提供,作为二进制文件放置在内存中
    • rsyslog.service:主要手机登录系统与网络等服务的信息
    • logrotate:主要在进行日志文件的轮询功能

文件内容格式

一般来说,系统产生的信息并记录下来的内容中,每条信息均会记录下面的几个重要内容

  • 事件发生的日期与实践
  • 发生此事件的主机名
  • 启动此事件的服务名或命令与函数名称
  • 该信息的实际内容

rsyslog.service 记录日志文件的服务

  • rsyslogd:此daemon可以负责主机产生的各种信息的记录,rsyslogd针对各种服务与信息的配置文件就是/etc/rsyslog.conf,这个文件规定了
    1. 什么服务
    2. 什么等级信息
    3. 需要被记录在哪里
  • 可以将日志文件传送到其他远程主机上,通过man查询,更改/etc/rsyslog.conf

logrotate

rsyslog 使用 daemon 的方式来启动,当有需求的时刻会立即执行,但 logrotate 确实在规定的时间到了之后才来进行日志文件的轮询,所以这个 logrotate 程序是挂在 cron 下进行的

  • logrotate的配置文件在
    • /etc/logrotate.conf:主要的参数文件
    • /etc/logrotate.d/:该文件的所有文件都会被主动地读入/etc/logrotate.conf当中使用
  • logrotate <logfile>:用于轮询
    • -v:启动显示模式,会显示logrotate运行的过程
    • -f:不论是否符合配置文件的数据,强制每个日志文件都进行轮询的操作

systemd-journald.service

systemd-journald 只会在内存中写入,所以只会记录此次开机启动的所有信息,记录到 /run/log

  • journalctl [--since TIME] [--until TIME] <optional>:用于查看systemd-journald.service的数据
    • -n:显示最近几行
    • -r:反向输出
    • -p:限制后面所接的信息重要性排序
    • -f:类似tail -f的功能
  • logger [-p 服务名称.等级] <"信息">
  • logwatch:每天分析一次日志文件,并且将数据以 email 的格式发送给root