1 总结linux安全模型

三A认证,资源分配:

  • Authentication:认证,验证用户身份;
  • Authorization:授权,不同的用户设置不同的授权;
  • Accouting|Audition:审计。

1.1 Linux中每个用户通过User id(UID)做唯一标识

  • 管理员:root,o。权限最大,也意味着危险与不安全,慎用此账号;
  • 普通用户:1-60000自动分配
  • 系统用户:1-499(CentOS6以前),1-999(CentOS7以后),对守护进程获取资源进行权限分配;
  • 登录用户:500+(CentOS6以前),1000+(CentOS7以后)给用户进行交互式登录使用。
  • (Ubuntu又是如何?)

1.2 用户组

LInux可以将一个或多个加入到用户组中,用户组通过Group id(GID)做唯一标识。

  • 管理员组:root,0;
  • 普通组:
  • 系统组:1-499(CentOS6以前),1-999(CentOS7以后),对守护进程获取资源进行权限分配;
  • 登录组:500+(CentOS以前),1000+(CentOS7以后),给普通用户。

1.3 用户和组的关系

  • 用户的主要组(primary group,主组):用户必须有且仅有一个主组,默认创建用户时自动创建与用户名同名的用户组作为主组。由于词组只有一个用户,又称私有组。
  • 用户的附加组(supplementary group,附加组):一个用户可以有0个或多个附加组。

id USERNAME :查看用户所属

[10:44:57 root@rocky8 ~]#id root;id wang
 uid=0(root) gid=0(root) groups=0(root)
 uid=1000(wang) gid=1000(wang) groups=1000(wang)

1.4 安全上下文

Linux安全上下文Context:运行中的程序,即进程(process),以进程发起者的身份运行,进程所能够访问资源的权限取决于进程运行者的身份。

比如:分别以root和普通用户(wang)的身份运行/etc/shadow,得到的结果不同。


2 总结学过的权限,属性及ACL相关命令及选项,示例。

程序访问文件时的权限,取决于次程序的发起者

  • 进程的发起者,同文件的属主,则应用文件属主权限
  • 进程的发起者,属于文件属组,则应用文件属组权限
  • 应用文件“其他”权限

3 结合vim几种模式,学会使用vim几个常见操作。

1)如何打开文件。并在打开文件(命令模式)之后如何退出文件。

打开文件:vim FILE。

打开文件后,按“esc”键(可选),转换到命令行模式,按“q”不保存退出或“q!”不保存强制退出。

2)打开文件(命令模式)之后,进入插入模式。并在插入模式中如何回到打开文件的状态(命令模式),并在命令模式之后如何退出文件。

按“esc”键,转换到命令行模式,按“q”不保存退出或“q!”不保存强制退出。

3)打开文件(命令模式)之后,进入插入模式,编写一段话,"马哥出品,必属精品", 之后从插入模式中如何回到打开文件的状态(命令模式),并在命令模式之后如何退出文件。

4)使用cat命令验证文件内容,是刚刚自己写的内容。

5)(可选),命令模式下,光标在单词,句子上进行前后,上下跳转。行复制粘贴。行删除。


4 总结学过的文本处理工具,文件查找工具,文本处理三剑客, 文本格式化命令(printf)的相关命令及选项,示例。(未完善)

4.1 文本处理工具

cat [OPTION]... [FILE]... :查看文本内容

OPTION

解释

-E

显示行结束符$

-A

显示所有控制符

-n

对每行编序号

-b

对非空行编序号

-s

压缩连续的空行成一行

示例:

[16:20:12 root@rocky8 data]#cat -A a.txt
 line1 2^I3$
 line2$
 $
 $
 3$

tac:垂直反向查看文本内容,与cat相反

[16:17:02 root@rocky8 data]#tac a.txt
 3
 
 
 line2
 line1 2 3

rev:水平反向查看文本内容,与cat相反

[16:22:22 root@rocky8 data]#rev a.txt
 3       2 1enil
 2enil
 
 
 3

hexdump:查看非文本文件内容

[16:23:39 root@rocky8 data]#hexdump a.txt
 0000000 696c 656e 2031 0932 0a33 696c 656e 0a32
 0000010 0a0a 0a33
 0000014
 
 [16:25:02 root@rocky8 data]#hexdump /etc/shadow
 0000000 6f72 746f 243a 2436 6266 5676 7836 5a54
 0000010 416d 3957 3868 5477 5224 4136 6750 727a
 0000020 7454 4b36 5854 7944 ............
 [16:25:48 root@rocky8 data]#cat !*
 cat /etc/shadow
 root:$6$fbvV6xTZmAW9h8wT$R6APgzrTt6KTXDyFRrLVn0y1z96NC49rqHyeQNpvaIHEkDPir3xp62Qm5LKQoTAOT2cNFL/.OLt9M7ykhCCUN0::0:99999:7:::
 bin:*:19265:0:99999:7:::
 ..........

分页查看文本内容

more [options] <file>...:分页查看文本内容,可以配合管道

options

解释

-d

显示翻页及退出提示

窗口按键


回车

往下移动一行,移动到最后一行退出

b

往上翻页

less:分页查看文本内容,可以配合管道,移动到最后一行不会退出

窗口按键


上下方向键

上下移动

空格键

切换到下一个屏幕

b

退回到上一个屏幕

g

光标切换到文件开始

G

切换到最后一幕

/string

往下寻找对应字符串,配合n和N上下翻找

?string

往上寻找对应字符串,配合n和N上下翻找

head:默认输出文本内容前10行内容


5 总结文本处理的grep命令相关的基本正则和扩展正则表达式。(补示例)

grep

grep [OPTION]... PATTERN [FILE]... :打印文件匹配内容,PATTERN为正则表达式

OPTION


--color

对匹配的文本着色,已默认上色

-v

显示不匹配文本,即取反

-i

忽略大小写

-n

显示匹配文本的行号

-c

统计匹配的行数,不打印内容

-A #(-B -C同理)

显示匹配行及后面#行

-w

按单词匹配

-E

扩展正则表达式,相当于egrep

正则表达式

  • 使用一定特殊字符用来表示特定功能,这些字符叫元字符
  • 类似于通配符,但又与之不同,通配符处理文件名,正则表达式处理文本内容字符
  • 正则表达式有两种:标准正则表达式和扩展正则表达式
  • 正则表达式引擎:采用不同算法,检查处理正则表达式的软件模块,如:PCRE
  • 元字符分类:字符匹配,匹配次数,位置铆钉,分组
  • 帮助:man 7 regex
  • 应用广泛,其他语言也通用

标准正则表达式

字符匹配

字符

通常匹配数字,字符及其他字符

.

小数点。代表任意单个字符,甚至是汉字和其他国家的文字

[ ]

中括号。匹配阔号内任意单个字符

[^]

取反

[:blank:]

代表空格和TAB键制表符

[:graph:]

代表可打印非空百字符

[:print:]

代表可打印字符

[:punct:]

代表标点符号


数字和字母同通配符

次数匹配

次数


*

代表前面匹配的字符的出现任意次,包括0次

\?

代表前面匹配的字符最多出现了1次

\+

代表前面匹配的字符最少出现了1次

\{n\}

代表前面匹配的字符最多出现了n次

\{m,n\}

代表前面匹配的单个字符最少出现了m次,最多出现了n次

\{,n\}

代表前面匹配的单个字符最多出现了n次

\{m,\}

代表前面匹配的单个字符最少出现了m次

位置锚定

位置


^

行首

$

行尾

^PATTERN$

打印出匹配内容行

^$

打印匹配的空行

^[[:space:]]*$

空白行

\<或\b(词首)

词首锚定,用于匹配单词首内容

\>或\b(词尾)

词首锚定,用于匹配单词尾内容

\<PATTERN\>

单词锚定,打印匹配单词所在行

分组和逻辑处理

分组和逻辑


\( \)

相当于提取公因式

\


示例

查找ss开头,且第三个字符有可能包含甚至没有s的单词

[19:50:36 root@rocky8 data]#grep -n "ss"s*"" /etc/passwd
 14:dbus:x:81:81:System message bus:/:/sbin/nologin
 17:tss:x:59:59:Account used for TPM access:/dev/null:/sbin/nologin
 35:sssd:x:981:981:User for sssd:/:/sbin/nologin
 43:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

查找 /etc/fstab 内的home

[21:16:45 root@rocky8 data]#grep -n "\<home\>" /etc/fstab
 14:/dev/mapper/rl-home     /home                   xfs     defaults        0 0

扩展正则表达式

相当于去掉\转义符




匹配至少1次

+

匹配最多1次

{n}

匹配n次

{m,n}

匹配最多m次,最少n次

()

相当于提取公因式

|



6 总结变量命名规则,不同类型变量(环境变量,位置变量,只读变量,局部变量,状态变量)如何使用。

6.1 变量是什么

表示命名的内存空间,将数据存放在内存中,通过变量名引用获取数据。

6.2 变量命名规则

基本命名要求

  • 以字母开头
  • 且只是用字母、数据和下划线“_”
  • 不能使用自带保留字和内置变量:if、for

命名习惯

  • 变量名大写
  • 局部变量名小写
  • 函数名小写
  • 大驼峰:多单词直接拼接,且单词首字母大写,其余小写,如:StudentFirstName
  • 小驼峰:多单词直接拼接,且次单词开始的单词首字母大写,其余小写:studentFirstName
  • 下划线:student_name
  • 使用英语单词:见名知义,并体现实际作用,不写如“ATM”的简写

6.3 变量的类型及其使用方式

环境变量,位置变量,只读变量,局部变量,状态变量

局部变量

定义:

只能在函数体内使用

使用:

声明并赋值:local name=value

范例:
[21:41:14 root@rocky8 script]#cat function_a.sh
 #!/bin/bash
 
 #定义函数
 function func(){
    local a=100
 }
 
 #调用函数
 func
 
 #输出结果,结果为空
 echo $a

环境变量

定义:
  • 生效范围为当前shell进程及其子进程
  • 子进程可以继承父进程的变量,但父进程无法使用子进程的变量
  • 子进程修改父进程传递的变量后,也会影响孙子进程
  • 一般只在系统配置文件使用,很少在脚本使用
使用:
  • 声明并赋值:local name=value或declare -r name=value
  • 变量引用:$name或${name}
  • 删除变量:unset name
  • 显示所有环境变量:env、printenv、export、declare -x
  • 查看指定进程的环境变量:cat /proc/$PID/environ
  • bash内建的环境变量:PATH、SHELL、USER、UID等

位置变量

定义:

在bash shell中内置的变量,在脚本代码中调用通过命令行传递给脚本的参数

使用:

在脚本后写上参数

  • $1、$2、.......$n:对应第1个、第2个等参数,shift [n]换位置
  • $0:命令本身,包括路径
  • $*:传递给脚本的所有参数,全部参数合为一个字符串
  • $@:传递给脚本的所有参数,每个参数为独立的字符串
  • $#:传递给脚本的参数个数
范例:
[20:11:39 root@rocky8 script]#cat arg.sh
 #!/bin/bash
 echo "1st arg is $1"
 echo "1st arg is $2"
 echo "1st arg is $3"
 echo "1st arg is ${10}"
 echo "1st arg is ${11}"
 
 echo "The number of arg is $#"
 echo "All args are $*"
 echo "All args are $@"
 echo "The scriptname is `basename $0`"  #必须加上basename
 
 [20:25:01 root@rocky8 script]#bash arg.sh {a..z}
 1st arg is a
 1st arg is b
 1st arg is c
 1st arg is j
 1st arg is k
 The number of arg is 26
 All args are a b c d e f g h i j k l m n o p q r s t u v w x y z
 All args are a b c d e f g h i j k l m n o p q r s t u v w x y z
 The scriptname is arg.sh

$*和$@的区别,$*合成一个字符串,$@不合成,就是独立的字符串

[21:04:22 root@rocky8 script]#cat f1.sh
 #!/bin/bash
 echo "f1.sh:all args are $@"
 echo "f1.sh:all args are $*"
 bash file.sh "$*"
 
 [21:04:46 root@rocky8 script]#cat f2.sh
 #!/bin/bash
 echo "f1.sh:all args are $@"
 echo "f1.sh:all args are $*"
 bash file.sh "$@"
 
 [21:04:50 root@rocky8 script]#cat file.sh
 #!/bin/bash
 echo "file.sh:1st arg is $1"
 
 [21:03:51 root@rocky8 script]#bash f1.sh a b c
 f1.sh:all args are a b c
 f1.sh:all args are a b c
 file.sh:1st arg is a b c
 
 [21:04:16 root@rocky8 script]#bash f2.sh a b c
 f1.sh:all args are a b c
 f1.sh:all args are a b c
 file.sh:1st arg is a

只读变量

定义

只能声明定义,不能删改,即常量

使用
  • 声明:readonly name或declare -r name
root@ubuntu2004:~# readonly PI=3.14159
 root@ubuntu2004:~# echo $PI
 3.14159
 
 root@ubuntu2004:~# declare -r C=10
 root@ubuntu2004:~# echo $C
 10
  • 查看:readonly [-p]或declare -r
root@ubuntu2004:~# declare -r
 declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath"
 declare -ar BASH_VERSINFO=([0]="5" [1]="0" [2]="17" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
 declare -r C="10"           #
 declare -ir EUID="0"
 declare -r PI="3.14159"     #
 declare -ir PPID="8403"
 declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
 declare -ir UID="0"
 
 
 root@ubuntu2004:~# readonly
 declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath"
 declare -ar BASH_VERSINFO=([0]="5" [1]="0" [2]="17" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
 declare -r C="10"           #
 declare -ir EUID="0"
 declare -r PI="3.14159"     #
 declare -ir PPID="8403"
 declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor"
 declare -ir UID="0"

状态/状态码变量

定义:

表示错误信息的数字,如浏览错误网页所提示的数字。

使用:

进程执行后,使用变量$?保存状态码,取值范围是0-255

  • $?值为0,表示成功;$?值为1-255.表示失败
  • 建议:可在脚本命令下定义退出状态码——exit [n]
  • 使用exit命令,脚本立马终止
  • 退出状态取决于命令所跟数字
  • 如果不指定状态码,那么脚本退出状态码取决于最后一条命令的状态码
范例:
[23:22:13 root@rocky8 ~]#curl -fs http://www.wangxiaochun.com >/dev/null
 [23:24:26 root@rocky8 ~]#echo $?
 0

7 通过shell编程完成,30鸡和兔的头,80鸡和兔的脚,分别有几只鸡,几只兔?


结合编程的for循环,条件测试,条件组合,完成批量创建100个用户, 1)for遍历1..100 2)先id判断是否存在 3)用户存在则说明存在,用户不存在则添加用户并说明已添加。

磁盘存储术语总结: head, track, sector, sylinder.

总结MBR,GPT结构。:

总结学过的分区,文件系统管理,SWAP管理相关的命令及选项,示例 fdisk, parted, mkfs, tune2fs, xfs_info, fsck, mount, umount, swapon, swapoff

总结raid 0, 1, 5, 10, 01的工作原理。总结各自的利用率,冗余性,性能,至少几个硬盘实现。

完成不影响业务对LVM磁盘扩容及缩容示例。