Shell脚本编程进阶及启动流程学习笔记
2019-05-11 本文已影响0人
Villa_7ca5
1、用shell脚本实现自动登录机器
#!/usr/bin/expect
spawn ssh root@192.168.37.201
expect {
"yes/no" { send "yes\n";exp_cotinue}
"password" {send "$password\n"}
}
interact
2、shell 判断一个值bone是否在数组arrayZ=( one two three four five five )中
#!/bin/bash
declare -a arrayZ
arrayZ=( "one" "two" "three" "four" "five" "five" )
for i in `seq $[${#arrayZ[*]}-1]`;do
echo ${arrayZ[$i]}
if [ ${arrayZ[$i]} == bond ];then
echo yes
else
echo no
fi
done
unset arrayZ
3、用命令或者脚本实现 0057AF051EFF 变为 00:57:AF:05:1E:FF
a=0057AF051EFF
echo ${a:0:2}:${a:2:2}:${a:4:2}:${a:6:2}:${a:8:2}:${a:10:2}
4、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 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 1 2 3 4 5 6 7 8 9 0 ! @ # $ % ^ & * ( ) - _ = + \ / ' " ; : [ ] { } , . ?
用以上字符,结合数组,实现一个随机生成20位密码的脚本
#!/bin/bash
declare -a a
a=(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 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 1 2 3 4 5 6 7 8 9 0 \! \@ \# \$ \% \^ \& \* \(
\) \- \_ \= \+ \\ \/ \' \" \; \: \[ \] \{ \} \, \. \?)
for i in `seq 0 19`;do
let i=$[$RANDOM%${#a[*]}]
echo -e "${a[$i]:0:20}\c"
done
5、详细叙述centos7开机流程
第一步:POST加电自检
主要实现的功能是检测各个外围硬件设备是否存在而且能够正常运行起来,实现这一自检功能的是固化
在主板上的ROM(主要代表为CMOS)芯片上的BIOS(Basic Input/Output System)程序;例如BIOS
会检测CPU、Memory以及I/O设备是否能够正常运行,如果是个人计算机的话可能还会检测一下显示器
只要一通电,CPU就会自动去加载ROM芯片上的BIOS程序,是这样来实现的。而检测完成之后就进行硬
件设备的初始化。
第二步:Boot Sequence(选择启动设备以加载MBR)
主要实现的功能是选择要启动的硬件设备,选择了之后就可以读取这个设备上位于MBR里头的bootloa
der了。这一步的实现是这样的:根据BIOS中对启动顺序的设定,BIOS自己会依次扫描各个引导设备
然后第一个被扫描到具有引导程序(bootloader)的设备就被作为要启动的引导设备。
第三步:加载bootloader(MBR)
这一步实现起来的步骤比较多,前面的BIOS通过读取并执行启动设备的MBR中的bootloader,而boo
tloader要实现的功能就是提供一个菜单给用户,让用户去选择要启动的系统或不同的内核版本,然后
把用户选择的内核版本加载至RAM中的特定空间,接着在RAM中解压、展开,而后把系统控制权移交给
内核。
grub是bootloader中的一种,就grub来说,为了打破在MBR中只有446Bytes用于存放bootloader
这一限制,所以这一步的实现是这样的:grub是通过分成三个阶段来实现加载内核这一功能的,这三个
阶段分别是:stage1, stage1.5以及stage2。其中:
stage1:存放于MBR的前446Bytes,用于加载stage1.5阶段,目的是为了识别并驱动stage2(或者
/boot)所在分区的文件系统;
stage1.5:存放于MBR之后的扇区,加载stage2所在分区的文件系统驱动,让stage1中的bootloa
der能识别stage2所在分区的文件系统;
stage2:存放于磁盘分区之上,具体存放于/boot/grub目录之下,主要用于加载内核文件(vmlin
uz-VERSION-RELEASE)以及ramdisk这个临时根文件系统(initrd-VERSION-RELEASE.img或in
itramfs-VERSION-RELEASE.img)。
第四步:Kernel自身初始化
Kerenl在得到系统控制权之后,首先要进行自身初始化,而初始化的主要作用是:
(1)探测可识别到的所有硬件设备;
bootloader将系统控制权移交给内核就好比如后朝推翻前朝,统治者(内核)当权之后,首先要
检查一下有哪些是前朝所留下的,例如有哪些领土、人力、财力、兵力可用等等。
(2)加载硬件驱动程序,即加载真正的根文件系统所在设备的驱动程序(有可能会借助于ramdisk加载
驱动);
这就像统治者(内核)在得知底下存在的人力、财力之后,开始将可以“为我所用”的人力纳入麾下
听自己使唤,而不听使唤的杀掉;
(3)以只读方式挂载根文件系统;
如果有借助于ramdisk这个临时文件系统(虚根),则在这一步之后会执行
根切换;否则不执行根切换。
(4)运行用户空间的第一个应用程序:/sbin/init.
第五步:init管理用户空间服务进程
init可以理解成是内核派来管理用户空间的使者,就好像天使代表上帝来访问人间一样。init这个初
始化程序会根据其配置文件执行一系列操作。虽然CentOS 5、CentOS 6以及CentOS 7的init配置
文件各不相同,但总体的启动流程是不变的。
(1)根据init配置文件设置默认运行级别
对于CentOS 5来说,初始化程序init是SysV init,其配置文件为:/etc/inittab;
对于CentOS 6来说,初始化程序init是upstart,其配置文件为:/etc/inittab,
/etc/init/*.conf,也就是upstart将配置文件拆分成多个,在/etc/init/目录下以conf结尾的
都是upstart风格的配置文件,而/etc/inittab仅用于设置默认运行级别;
对于CentOS 7来说,初始化程序init是systemd,其配置文件为:/usr/lib/system/systemd/*,
/etc/systemd/system/*;
6、编写Nginx的systemd配置文件, 实现nginx进程开机启动
依赖安装
yum install gcc-c++
yum install pcre
yum install pcre-devel
yum install zlib
yum install zlib-devel
yum install openssl
yum install openssl-devel
下载安装Nginx
cd /usr/local
wget http://nginx.org/download/nginx-1.11.5.tar.gz
tar -zxvf nginx-1.11.5.tar.gz
cd nginx-1.11.5
./configure
make & make install
添加配置文件
cd /lib/systemd/system/
vim nginx.service
配置文件内容:
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx reload
ExecStop=/usr/local/nginx/sbin/nginx quit
PrivateTmp=true
Restart=always
[Install]
WantedBy=multi-user.target
Nginx开机自启动
systemctl enable nginx.service
启动nginx
systemctl start nginx.service
结束nginx(只能以这个方式结束进程,kill -9不能杀死进程。)
systemctl stop nginx.service
重启nginx
systemctl restart nginx.service