shell基础

操作系统的启动流程

安全优化

$$
\begin{cases}
单用户模式 破解密码\
grub加密\
光盘修复模式/救援模式 修复操作系统的问题\
BIOS加密\
\end{cases}
$$

shell基础

$$
\begin{cases}
介绍\
交互式环境\
命令语法\
bash解释器特性\
命令查找优先级\
查看帮助信息\
常用命令\
\end{cases}
$$

$$
文件处理相关命令
\begin{cases}
目录结构 单根结构\
系统目录注解(***)\
文件操作基础(增、删、改、查)\
查看文件内容、修改文件内容vim、查找文件find\
打包压缩、软硬连接
\字符处理命令
\begin{cases}
sort\
uniq\
cut\
tr\
wc\
\end{cases}
\路径
\begin{cases}
相对路径\
绝对路径\
\end{cases}
\end{cases}
$$

二、操作系统启动流程

加电
启动BIOS,检测启动项目
读取启动盘第一个扇区512bytes,包含是mbr主引导记录(446引导程序bootloader-grub)
grub启动
加载内核
$$
读取运行级别
\begin{cases}
0-关机\
1-单用户工作,不需要账号密码进入后就是管理员账号,用于系统维护,禁止远程登录\
2-多用户状态(没有NFS),没有网络\
3-完全多用户(有NFS)登录后进入控制台\
4-系统未使用,保留\
5-图形GUI模式\
6-重启\
\end{cases}
$$
centos7启动的第一个程序systemd,pid-0,启动其他服务

三、系统密码破解

1.重启
切换第一个模式,并按E(dit),编辑
进入最底层,找到ro rhgb……修改为:\ rw\ init=/sysroot/bin/sh
按CTRL-X进入单用户模式
执行chroot\ /sysroot/
passwd\ root回车输入密码
一定要再输入:
$$
vim\ /etc/sysconfig/selinux
$$
把selinux修改为disabled#关闭模式
2.为了防止其他人进行修改,可以在对grub进行一次加密
$$
1.执行grub2-setpassword\ 命令\
#\ grub2-setpassword\
enter\ password\
confirm\ password
\
2.在打开文件/boot/grub2/grub.cfg,找到menuentray开头。找到条目后删除–unrestricted参数\
3.reboot重启验证,只有输入账号密码后,才能进入grub菜单修改管理密码
$$
3.BIOS加密,光盘修复
$$
\begin{cases}
#1、进入bios,从光盘启动\
#2、点击troubleshooting\
#3、进入界面\ 选择:rescue\ a\ centos\ Linux\ system\
#4、进入到rescue选项\ 按enter键\ 选1,其余选项为
\begin{cases}
1.continue:救援模式程序会自动查找系统中已有的文件系统,并可读写挂载到/mnt/sysimage目录\
2.read-only:会以只读的方式挂载已有的文件系统\
3.skip\ to\ sheell:手动挂载\
\end{cases}
\#5、sh切换bash模式\
chroot\ /mnt/sysimage\
#6、执行命令\
passwd\ root
\end{cases}
$$
4.扣主板bios电池,锁机柜

系统命令

1、什么是系统命令

shell解释器对系统接口的封装结果
系统命令/shell命令-shell解释器-系统接口-内核-硬件

2、为何要用系统命令

为了使用计算机

3、补充

第一层意思:shell代表的是解释器,是对系统接口的封装,即在系统接口外又加了一层壳,shell只是一种称呼,而bash解释器才是具体的一种shell
第二层意思:shell这门编程预言(一堆命令及语法)

4、 posix(了解)

posix全称可移植的操作系统接口,posix是一种规范

5、shell交互式环境

/#-超级管理员用户
¥-普通用户提示符
~-当前用户的个人文件夹-家目录
$$
useradd\ egon//创建用户\
passwd\ egon//交互式设置密码\
echo\ “123”\ |\ passwd\ –stdin\ egon//非交互式\
$$

6、shell命令的语法格式

命令:就是一个单词,对应着一个功能/程序,运行一条命令就启动一个进程
选项:对命令的描述,控制命令的具体运行
参数:命令的操作对象
ps:硬盘知识补充
硬盘-》水桶
分区-》水桶的隔断
挂载点/文件夹-》某一个具体的隔断

7、开始编写shell脚本程序

先切换到root用户,创建文件,后缀名没有硬性限制,通常以.sh结尾

1
2
3
4
5
6
[root@egon ~~]# mkdir -p /a/b
[root@egon ~~]# vim /a/b/hello.sh
[root@egon ~~]# cat /a/b/hello.sh
#!/bin/bash
#第一个shell小程序
echo "hello world!"

1.第一行表示我们选择使用的shell解释器是bash,也可以用:#!/usr/bin/env bash 此外shell的第一行比较特殊,一般以#!开始来指定使用的shell解释的类型
2.第二行以#开始,表示本行是注释,注释是对代码的解释说明
3.第三行中的echo是Linux中的输出命令

8、运行shell脚本程序

运行方式也存在几种

1.绝对路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 权限:
#1,对沿途文件夹有x权限
#2,对目标文件有r和x权限
#
[root@egon ~~]# ll -d /a
d--------x. 3 root root 15 11月 15 11:05 /a
[root@egon ~~]# ll -d /a/b
d--------x. 2 root root 18 11月 15 11:06 /a/b
[root@egon ~~]# ll /a/b/hello.sh
-rw-r--r-x. 1 root root 10 11月 15 11:06 /a/b/hello.sh
[root@egon ~~]# su -egon
[egon@egon ~~]$ /a/b/hello.sh
hello world!
[egon@egon ~~]$
2.相对路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 权限:
#1,对沿途文件夹有x权限
#2.对目标文件有r和x权限
#
[root@egon ~~]# ll -d /a
d--------x. 3 root root 15 11月 15 11:05 /a
[root@egon ~~]# ll -d /a/b
d--------x. 2 root root 18 11月 15 11:06 /a/b
[root@egon ~~]# ll /a/b/hello.sh
-rw-r--r-x. 1 root root 10 11月 15 11:06 /a/b/hello.sh
[root@egon ~~]# su -egon
[egon@egon ~~]$ /a/b/hello.sh #绝对路径的方式
hello world!
[egon@egon ~~]$ cd /a
[egon@egon /a/a]$ ./b/hello.sh #相对路径的方式,加./作为前缀
hello world!
[egon@egon /a/a]$
3.解释器+文件路径(两种路径都可以)
1
2
3
4
5
6
7
8
9
10
11
# 权限:
#1,对沿途文件夹有x权限
#2. 对目标文件有r权限就可以
#因为我们执行的是解释器,当前用户对解释有执行权限就可以了,这个权限默认就有,而解释器需要读文件内容来执行,所以需要对目标文件有r权限
[root@egon ~~]# chmod -R o=x /a
[root@egon ~~]# chmod o=r /a/b/hello.sh
[root@egon ~~]# su -egon
[egon@egon ~~]$ cd /a
[egon@egon /a/a]$ bash b/hello.sh
hello world!
[egon@egon /a/a]$
4.上述三种方式都是在子shell进程中执行程序,而方式四则是在当前shell进程中执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 例如
#上述三种方式都是在当前shell环境下开启了一个新的shell解释器环境/子shell来执行程序,脚本程序在子shell中运行完毕后,子shell环境随即关闭,然后返回到父级shell即当前shell环境中,如果就想在当前shell环境中执行,需要这么做
[egon@localhost shell]$ cd /home/egon/shell/
[egon@localhost shell]$ ll hello.sh # 当前用户egon对该文件没有执行权限
-rw-r--r--. 1 root root 60 8月 14 18:33 hello.sh
# 下面两种方式都一样
[root@egon ~~]# chmod -R o=x /a
[root@egon ~~]# chmod o=r /a/b/hello.sh
[root@egon ~~]# su - egon
[egon@egon ~~]$ . /a/b/hello.sh # . 后跟空格,然后再跟绝对路径
hello world!
[egon@egon ~~]$ cd /a/b/
[egon@egon /a/b/a/b]$ . hello.sh # . 后跟空格,然后再跟相对路径
hello world!
[egon@egon /a/b/a/b]$ source hello.sh # 跟上述方式一样
hello world!

在当前shell解释器进程中执行脚本与在子shell进程中执行脚本的区别在于作用域

1
2
3
4
5
6
7
8
9
10
11
12
13
# 一个shell环境就是一个单独的全局作用域,不同的shell环境,无法访问彼此shell环境中的变量
[root@egon ~~]# su - egon
[egon@localhost ~]$ x=111
[egon@localhost ~]$ cat /a/b/hello.sh
#!/bin/bash
echo "hello world!"
echo $x # 我们在这里访问一下全局变量x
[egon@localhost ~]$ source /a/b/hello.sh # 在当前shell环境执行,可以访问到x
hello world!
111 # 取到了x的值
[egon@localhost ~]$ bash /a/b/hello.sh # 在子shell环境执行,不能访问到x
hello world!
# 此处打印空
9、调试shell程序
方法一、以调试的方式运行
1
[root@egon test]# sh -vx login.sh #不加-v选项,只会显示程序中运行的代码,不会显示注释信息
方法二、只调试语法是否有问题,比如if判断少了结尾
1
[root@egon test]# sh -n login.sh 
方法三、仅调试脚本的一部分,用set -x 与set +x包含,运行过程中会只打印它们包含的代码段的运行情况
1
2
3
4
5
6
7
8
9
10
11
12
[root@egon test]# cat login.sh
#!/usr/bin/env bash
set -x
read -p "请输入您的名字: " name
read -p "请输入您的密码: " pwd
set +x
if [[ "$name" == "egon" && "$pwd" == "123" ]];then #中括号两端需要留有空格
echo "登录成功"
else
echo "账号或密码错误"
fi
[root@egon test]# . login.s