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---

title: "鸟哥的 linux 私房菜——基础篇" date: "2022-06-03" path: "/notes/server/鸟哥的linux私房菜" category: "linux" description: "鸟哥的linux私房菜——基础篇" tags: ["linux","书"] slug: "linux-Private-kitchen-Basis" thumbnail: "/book/鸟哥的linux私房菜.webp" type: "note"

title: "鸟哥的 linux 私房菜——基础篇" date: "2022-06-03" path: "/notes/server/鸟哥的linux私房菜" category: "linux" description: "鸟哥的linux私房菜——基础篇" tags: ["linux","书"] slug: "linux-Private-kitchen-Basis" thumbnail: "/book/鸟哥的linux私房菜.webp" type: "note"

title: "鸟哥的 linux 私房菜——基础篇" date: "2022-06-03" path: "/notes/server/鸟哥的linux私房菜" category: "linux" description: "鸟哥的linux私房菜——基础篇" tags: ["linux","书"] slug: "linux-Private-kitchen-Basis" thumbnail: "/book/鸟哥的linux私房菜.webp" type: "note" ----,即只有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 表示修改自己的密码
  • chage:用于详细的密码参数显示

    • -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 -<singnal> %<jobnumber>:可以直接将任务删除,如果没有%,则会以PID处理

    • -l:列出目前kill能够使用的信号有哪些
    • singnal:代表基于后面接的任务什么样的只是 - -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:连接状态,主要有建立ESTABLISED以及监听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