《Linux 就该这么学》学习笔记

这个系列主要记录了 Linux 的学习过程中我觉得有必要记录的知识点

Day 01


1.5 RPM(红帽软件包管理器)

  1. 本质:将安装规则与源代码打包
  2. 目的:降低安装难度
  3. 原理:通过将安装规则打包到一起降低难度
命令 作用
rpm -ivh filename.rpm 安装软件的命令格式
rpm -Uvh filename.rpm 升级软件的命令格式
rpm -e filename.rpm 卸载软件的命令格式
rpm -qpi filename.rpm 查询软件描述信息的命令格式
rpm -qpl filename.rpm 列出软件文件信息的命令格式
rpm -qf filename 查询文件属于哪个 RPM 的命令格式

1.6 Yum 软件仓库

Yum 软件仓库可以 根据用户的要求分析出所需软件包及其相关的依赖关系,然后自动从服务器下载软件包并安装到系统。

  1. 目的:进一步降低软件安装难度
  2. 原理:将大量的常用的 RPM 软件包收集到一起
  3. 通过:自动解决依赖关系
命令 作用
yum repolist all 列出所有仓库
yum list all 列出仓库中所有软件包
yum info 软件包名称 查看软件包信息
yum install 软件包名称 安装软件包
yum reinstall 软件包名称 重新安装软件包
yum update 软件包名称 升级软件包
yum remove 软件包 移除软件包
yum clean all 清除所有仓库缓存
yum check-update 检查可更新的软件包
yum grouplist 查看系统中已经安装的软件包组
yum groupinstall 软件包组 安装指定的软件包组
yum groupremove 软件包组 移除指定的软件包组
yum groupinfo 软件包组 查询指定的软件包组信息

1.7 systemd 初始化进程

systemctl 命令 作用
systemctl restart 服务名称 重启服务 (PID 值不变)
systemctl reload服务名称 重新加载配置文件(不终止服务,不修改 PID 值)
systemctl start 服务名称 启动服务
systemctl stop 服务名称 停止服务
systemctl enable 服务名称 加入到启动项
systemctl status 服务名称 查看服务状态

2.2 Linux 命令格式

命令名称 [命令参数] [命令对象]

其中命令名称、命令参数、命令对象之间要有空格来分隔。

Linux 的命令参数有两种格式:

长格式 短格式
--命令前缀 -命令前缀
--list -l
--all -a

短格式和短格式的参数可以合并(只保留一个减号)
短格式和长格式的参数不能合并
长格式和长格式的参数不能合并
长格式和短格式的参数不能合并

举个例子如果要合并 -a-l 这两个短格式,那么可以写成 -al


2.3 常用系统工作命令

2.3.6 Linux 的 5 种常见进程状态:

状态 意义
R(运行) 进程正在运行或在运行队列中等待
S(中断) 进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该状态
D(不可中断) 进程不响应系统异步信号,即便用 kill 命令也不能将其中断
Z(僵死) 进程已经终止,但进程描述符依然存在, 直到父进程调用 wait4()系统函数 后将进程释放
T(停止) 进程收到停止信号后停止运行

2.3.7 top 命令

top 命令是用来动态监视进程活动与系统负载等信息的命令。

可以看作是 Windows 系统中的任务管理器。

image

在上面的图片中,top的前五行为系统整体的统计信息,分别代表以下含义:

  1. 第 1 行:系统时间、系统以及运行时间、登录终端数、系统负债(三个三个数值分别为 1 分钟、5 分钟、15 分钟内的平均值,数值越小意味着负载越低。)
  2. 第 2 行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。
  3. 第 3 行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源百分比等。
  4. 第 4 行:物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量。
  5. 第 5 行:虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量。
信息 意义
top 当前系统时间
up 系统已经开机时间
user 系统当前终端数量
load average 系统负载情况
Tasks 进程总数量
running 运行进程
sleeping 等待进程
stopped 停止进程
zombie 僵尸进程
%Cpu(s) CPU 使用情况
us CPU 使用率
id CPU 空闲率
Kib Mem 内存大小
total 内存总大小
used 已使用内存
free 空闲内存
Kib Swap 交换分区
PID 进程号码
USER 用户发起人
PR-NI 进程优先级(数值越低优先级越高)
S 进程状态
%CPU 进程占用 CPU 百分比
%MEM 进程占用内存百分比
TIME+ 进程运行时间

Day 02


2.4 系统状态检测命令

2.4.1 ifconfig 命令

获取网卡配置与网络状态信息,格式为 ifconfig [网络设备] [参数]

例如:

[root@linux ~]# ifconfig
image

从上图的可得 ip 地址、子网掩码:

image

网卡 MAC 地址(物理地址,唯一值)

image

收到数据包大小(收到 14.7 KiB)

image

发送数据包大小(发送 16.1 KiB)

image

2.4.2 uname -a 命令

用于查看系统内核与系统版本等信息,格式为 uname [-a]

例如:

[root@linux ~]# uname -a
image

其中上图中,
zhuzongxiao.com 是主机名称;
3.10.0-862.el7.x86_64 是内核版本号;
#1 SMP Wed Mar 21 18:14:51 EDT 2018 系统打包发布时间;
x86_64 系统架构。


2.4.4 free 命令

查看当前系统中内存的使用量信息,格式为 free [-h]

例如:

[root@linux ~]# free -h 

可以得到如下的图片:
其中 Mem 表示物理内存、 Swap 表示交换分区。

image

代表以下信息:

内存总量 已用量 可用量 进程
共享的
内存量
磁盘
缓存的
内存量
缓存的
内存量
total used free shared buff/cache available
Mem 3.7G 848M 2.0G 11M 860M 2.6G
Swap 819M 0B 819

2.4.5 who 命令

可以查看当前登入主机的用户终端信息,格式为 who [参数]

例如:

[root@linux ~]# who
image

2.4.7 history 命令

用于显示历史执行过的命令,格式为 history [-c]

用这个命令可以查看当前用户执行过的最近的 1000 条命令,也可以修改 /etc/profile 中的 HISTSIZE 变量值。
用户可以使用键盘上的上下键进行选择,也可以使用 !编码数字 的方法来重复执行。
使用 history -c 即可清空记录。


2.4.8 sosreport 命令

用于收集系统配置及框架信息并输出诊断文档,格式为 sosreport


2.5 工作目录切换命令

2.5.1 pwd 命令

用于显示用户当前所处的工作目录,格式为 pwd [选项]


2.5.2 cd 命令

用于切换工作路径,格式为 cd [目录名称]
也可以通过 cd - 返回上一次所在的目录,
或是通过 cd.. 进入上级目录,
以及通过 cd~ 切换到当前用户的家目录,
还有通过 cd ~username 切换到其他用户的家目录。

2.5.3 ls 命令

用于现实目录中的文件信息,格式为 ls [选项] [文件]
ls -a 可以看到所有文件包括隐藏文件,
如果要查看目录属性,可以添加一个 -d 参数。

Linux 中所有以 . 开头的文件都是隐藏文件。


2.6 文本文件编辑命令

2.6.1 cat 命令

用于查看纯文本文件(内容较少),格式为 cat [选项] [文件]

2.6.2 more 命令

用于查看纯文本文件(内容较多),格式为 more [选项] [文件]

2.6.3 head 命令

用于查看纯文本文档的前 N 行,格式为 head [选项] [文件]

如果只想看前 15 行,那么可以使用 head -n 15 文件名 即可。

2.6.4 tail 命令

head 命令相反,看纯文本文档的后 N 行或者是持续刷新内容,格式为 tail [选项] [文件]

如果需要持续刷新一个文件的内容,格式为 tail -f 文件名

Day 05


5.1 Linux 系统三种用户身份

身份 名称 UID 值
管理员 root UID:0
系统用户 UID:1~999
早期Linux RHELE5/6 UID:1~499
普通用户 UID:1000~
早期Linux RHELE5/6 UID:500~65535

5.1.1 useradd 命令

使用 useradd 命令,格式为 useradd [选项] 用户名
默认的用户家目录会在 /home 目录中,默认的 Shell 解释器为 /bin/bash

参数 作用
-d 指定用户的家目录(默认为/home/username)
-e 账户的到期时间,格式为 YYYY-MM-DD.
-u 指定该用户的默认 UID
-g 指定一个初始的用户基本组(必须已存在)
-G 指定一个或多个扩展用户组
-N 不创建与用户同名的基本用户组
-s 指定该用户的默认 Shell 解释器

如果要创建一个普通用户并且指定家目录的路径、用户的 UID 以及 Shell 解释器,
使用 useradd -d /home/linux -u 8888 -s /sbin/nologin xxx
意思是创建了一个家目录为 /home/linux , 用户的 UID 为 8888,默认解释器是 /sbin/nologinxxx 用户,其中用户的解释器被设置为 nologin,则代表该用户不能登录到系统中。

系统中的用户组分为基本组扩展组
基本组:用户与生俱来,创建好用户后,默认有一个与其同名的用户组。基本组只能有一个。
扩展组:加入的其它组就是扩展组,可以有 N 个扩展组。


5.1.2 groupadd 命令

可以创建用户组,格式为 gourpadd [选项] 群组名

例如:

[root@linux home]# groupadd groupA

5.1.3 usermod 命令

用于修改用户属性,格式为 usermode [选项] 用户名

因为 Linux 系统的一切都是文件,因此可以在系统中创建用户也就是修改配置文件。可以直接用文本编辑器修改用户参数项目,也可以用 usermod 命令进行修改已创建的信息。比如用户的 UID、基本/扩展用户组、默认终端。

参数 作用
-c 填写用户账户的备注信息
-d -m 参数-m 与参数-d 连用,可重新指定用户的家目录并自动把旧的数据转移过去
-e 账户的到期时间,格式为 YYYY-MM-DD
-g 变更所属用户组
-G 变更扩展用户组
-L 锁定用户禁止其登录系统
-U 解锁用户,允许其登录系统
-s 变更默认终端
-u 修改用户的 UID

例如:

假设账户 chiperman 的信息如下:

[root@linux ~]# id chiperman
uid=1000(chiperman) gid=1000(chiperman) groups=1000(chiperman) 

将用户 chiperman 加入到 root 用户组中,扩展列表会多出 root 用户组而基本组不受影响:

[root@linux ~]# usermod -G root chiperman
[root@linux ~]# id chiperman
uid=1000(chiperman) gid=1000(chiperman) groups=1000(chiperman),0(root) 

5.1.4 passwd 命令

用于修改用户密码、过期时间、认证信息等,格式为 passwd [选项] [用户名]

管理员可以修改自己和所有用户的密码,还不需要验证旧密码。
用户只能使用 passwd 修改自己的密码。

参数 作用
-l 锁定用户,禁止其登录
-u 解除锁定,允许用户登录
–stdin 允许通过标准输入修改用户密码,如 `echo "NewPassWord"
-d 使该用户可用空密码登录系统
-e 强制用户在下次登录时修改密码
-s 显示用户的密码是否被锁定,以及密码所采用的加密算法名称

5.1.5 userdel 命令

用于删除用户,格式为 userdel [选项] 用户名

执行删除操作时,用户的家目录会默认保留,使用 -r 参数可以将其删除

参数 作用
-f 强制删除用户
-r 同时删除用户及用户家目录

5.2 文件权限与归属

Linux 系统的权限区分

符号 意义
- 普通文件
d 目录文件
l 链接文件
b 块设备文件
c 字符设备文件
p 管道文件

5.2.1 文件

对于每一个文件,都有都有所属的所有者所有组,并且规定了文件的所有者所属组以及其他用户对文件所拥有权限,分别是“可读”、“可写”、“可执行”。

权限 权限具体内容
可读 示能够读取文件的实际内容
可写 能够编辑、新增、修改、删除文件的实际内容
可执行 能够运行一个脚本程序

5.2.2 目录文件

权限 权限具体内容
可读 能够读取目录内的文件列表
可写 能够在目录内新增、删除、重命名文件
可执行 能够进入该目录

5.2.3 读、写、执行权限

读、写、执行权限简写为 r、w、x
也可以用数字 4、2、1 来表示

权限分配 文件所有者 文件所属组 其他用户
权限项 执行 执行 执行
字符表示 r w x r w x r w x
数字表示 4 2 1 4 2 1 4 2 1

文件权限的数字法表示基于字符表示(rwx)的权限计算而来。
注意:数字法不可相加求累计和。
假设一个文件的权限为 7 ,那么可读、可写、可执行(4+2+1);
一个文件的权限为 6 ,那么可读、可写(4+2)。

假设一个文件,其所有者拥有可读、可写、可执行的权限,其文件所属组拥有可读、可写的权限,而其他人只有可读的权限。那么权限就是 rwxrw-r– ,数字法为 764,如果没有这个权限,用 - 代替,不能使用 空格

image

在上图中,包含了文件的类型、访问权限、所有者(属主)、所属组(属组)、占用磁盘大小、修改时间和文件名称的信息。
该文件的类型为普通文件,所有者权限为可读、可写 rw-,所属组的权限为可读 r--,其他用户的权限为可读 r--,所有者是 root,所属组是 root,文件的磁盘占用大小是 1977 字节,最近一次修改时间是 2 月 15 日 02:24 分,文件名称是 initial-setup-ks.cfg


5.3 文件的特殊权限

5.3.1 SUID

SUID 是一种可对二进制程序进行设置的特殊权限,让执行者临时拥有所有者的权限(仅针对拥有执行权限的二进制程序有效)

查看 passwd 命令属性时,发现所有者的权限由 rwx 变为 rws,其中的 x 变为 s,就意味着这个文件被赋予了 SUID 权限。

如果本身权限为 rw-,那么被赋予特殊权限后,变为大写的 S


5.3.2 SGID

SGID 有以下两种功能:

  1. 文件(二进制的可执行文件):临时获得所属组的权限
  2. 目录:将一个目录设置了 SGID 权限,新建的所有文件都会默认归属于这个所属组

SGID 的第一种功能是参考 SUID 而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。

如果有 SGID 权限,那么所属组的可执行权限会被修改为 s

chomd 和 chown 命令

chomd 是用来设置文件和目录的权限,格式为 chomd [参数] 权限 文件或目录名
chomd 760 test 意思是把 test 文件的权限修改为 760,意味着所有者、所属组、其他用户的权限分别是:“可读可写可执行”、“可读可写”、“无权限”。

chown 是用来设置文件或目录的所有者和所属组,格式为 chwon [参数] 所有者:所属组 文件或目录名称
chown root:bin test 意思是把 test 文件的所有者和所属组分别设置为 rootbin

chomdchown 针对目录进行操作的时候,需要加上大写参数 -R 来表示递归操作,即表示对目录内所有的文件进行整体操作。


5.3.3 SBIT

SBIT(粘滞位),当目录被设置 SBIT 特殊权限位后,文件的其他人权限部分的 x 执行权限就会被替换成 t 或者 T,原本有 x 执行权限则会写成 t,原本没有 x 执行权限则会被写成 T

特殊权限的数字表示法

SUID 4
SGID 2
SBIT 1

特殊权限法写在一般权宪法之前,7 654 意思是特殊权限是都有,文件所有者、文件所属组 以及其他用户的可读可写可执行的权限分别是:654

下面的表格做一个简单的示例

字符表示 数字表示
rwsrw-r-- 4 764
rwxrw-r– 764
rwsrw-rwT 5 766(原本所有者有 可执行 权限为,而其他用户没有 可执行 权限)
rwSr-s-wT 7 652(原本所有者、其他用户都没有 可执行 权限)

因为如果是大写的特殊权限,那么代表原本没有这个权限,原本表示为 -。否则特殊权限应为小写字母。


5.4 文件的隐藏属性

默认情况下用户不能直接发觉,保障了系统安全性。

5.4.1 chattr

用于设置文件的隐藏权限,格式为 chatter [参数] 文件
如果要添加隐藏权限,在 chatter 后加上 +参数
移除隐藏权限,在 chatter 后加上 -参数

假设一个文件 testfile 被使用了 chatter +i testfile 命令,那么这个文件不能被进行修改。
如果想要删除这个文件,rm testfile 会提示权限不足(即使使用 rm -f testfile 依旧不行,甚至是 root 用户也不行),
那么我们需要先用下面的 lsatter testfile 命令查看这个文件的隐藏权限,
可以得知 testfile 文件有隐藏权限,
那么我们再使用 chatter -i testfile 来移除隐藏权限,
之后再使用 rm testfile 就可以成功删除文件。


5.4.2 lsattr

用于查看文件的隐藏权限,配合 chattr 使用。


5.5 文件访问控制列表

一般权限、特殊权限、隐藏权限都是对一类用户设置。
如果对普通文件和目录设置 ACL 就是针对指定的用户或用户组设置操作权限。

另外,如果针对某个目录设置了 ACL,则目录中的文件会继承其 ACL;若针对文件设置了 ACL,则文件不再继承其所在目录的 ACL。

5.5.1 setfacl 命令

管理文件的 ACL 规则,格式为 setfacl [参数] 文件名称
使用 setfacl 命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。
如果要针对目录文件需要用 -R 递归参数,针对普通文件则使用 -m 参数。
如果要删除某个文件的 ACL ,这可以使用 -b 参数。

例如:

[root@linux home]# setfacl -Rm u/g:chiperman:rwx testfile

-R 是对一个目录设置 facl 的权限,
-m 指的是对文件设置 facl 的权限,
u 代表对一个用户进行权限设置,
也可以用 g 代替表示对一个组进行权限设置,
这里是对 chiperman 用户设置了 rwx 权限,
对于 testfile 目录进行的操作。
这个时候查看文件的权限最后一个 . 变为了 +
这就代表我们已经对该文件设置了 ACL

image

5.5.2 getfacl 命令

getfacl 可以查看对于这个文件设置的 ACL 信息,格式为 getfacl 文件名称

例如:

[root@linux home]# getfacl testfile/

可以看到已经针对于 chiperman 用户设置的 rwx 权限。

image

su 命令与 sudo 服务

su 命令可以切换用户身份,使得当前用户不退出登录的情况下,切换到其他用户。

例如:从 root 管理员切换到 chiperman 账户

[root@linux ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@linux ~]# su - chiperman
Last login: Sun Feb 16 05:33:07 EST 2020 on :0

su 命令和用户名之间有一个 -,意味着完全切换,把环境变量信息也变更为新用户的信息,建议添加 -

此外,从 root 管理员切换到普通用户不需要验证密码,相反则需要,也是为了安全保证。

sudo 命令可以把特定的执行权限赋予给指定用户,可以避免泄露 root 密码,还能保证普通用户完成工作。格式为 sudu [参数] 命令名称

参数 作用
-h 列出帮助信息
-l 列出当前用户可执行的命令
-u 用户名或 UID 值 以指定的用户身份执行命令
-k 清空密码的有效时间,下次执行 sudo 时需要再次进行密码验证
-b 在后台执行指定的命令
-p 更改询问密码的提示语

中的来说,sudo 有以下功能:

  1. 限制用户执行指定的命令
  2. 记录用户执行的每一条命令
  3. 配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数
  4. 验证密码的后 5 分钟内(默认值)无须再让用户再次验证密码

如果担心直接修改配置文件出错,可以用 visudo 命令赋予权限。

Day 06


6.x 待定

ihard 总个数

bhard 总大小


本文的封面图片来自 Unspalsh 的 unsplash-logoSai Kiran Anagani