Shell脚本编程
shell的特性
1.别名
alias 查看本用户下的alias配置
自定义别名:alias 别名=‘shell命令’
cat $HOME/.bashrc 在这个用户下配置着alias名的配置
2.命令替换
命令替换即单反号的使用
补充说明:ls [目录名] -l 命令行键入命令会打印目录下的文件列表
单反号`在shell中表示执行单反号中内容的意思
3.后台处理
nohup command &
一个终端可以同时运行多个程序
命令行键入 jobs -l 可以查看后台正在运行的命令
例如:tar cvf abc.tar abc > /dev/null &
tar是打包命令,参数-f表示命名新的文件,-v表示打印打包过程中的详细信息,-c创建包文件
命令"tar cvf abc.tar abc"表示将文件abc打包成abc.tar,但是由于tar参数-v的原因,会在终端上打印信息
“>” 表示重定向,"/dev/null"表示不打印在终端上,"> /dev/null"就表示将详细信息重定向到/dev/null上
"&"表示后台处理
4.管道
把一个名的输出作为另一个命令的输入
5.重定向
“<” 输入 ">"输出
与管道相关,可以改变程序运行的输入来源和输出地点
例如:sort < 1.c > 2.c 命令由左向右执行,先将1.c中的数据排序,将结果重定向到2.c
6.模式匹配
显示以txt为扩展的文件或者显示以a开头的文件,这种能力叫做模式匹配
正则表达式
7.特殊符号
双引号:用来使shell无法认出空格、制表符和其他大多数特殊字符,例如建立一个带空格的文件 touch “wang bao ming”
单引号:用来使shell无法认出所有特殊字符
单反号(`):用来替换命令
反斜杠():用来使shell无法认出特殊字符,使其后的字符失去特殊含义,转义字符。例如创建带空格的文件名 touch my\ file
分号:允许在一行上放多个命令。例如:mv 1.txt 2.txt;mv 2.txt 3.txt;
&:命令后台执行
括号():创建成组的命令
大括号{}:创建命令块
竖杠(|):管道标示符
<>:重定向表示符
*?[]:表示模式匹配
$:变量名开头
#:表示注释
空格、制表符、换行符:当作空白
shell脚本编程
1.创建shell脚本
一个shell脚本通常包含如下部分:
首行
第一行内容在脚本的首行左侧,表示脚本将要调用的shell解释器,内容如下:
#!/bin/bash
#!符号能够被内核识别成是一个脚本的开始,这一行必须位于脚本的首行,/bin/bash是bash程序的绝对路径,在这里表示后续的内容将通过bash程序解释执行。
注释
注释符号# 放在需注释内容的前面
内容
可执行内容和shell结构
2.执行
(1)输入脚本的绝对路径或相对路径
/root/Helloworld.sh
./Helloworld.sh
(2)bash或sh +脚本
bash /root/Helloworld.sh
sh Helloworld.sh
(当脚本没有x权限时,root和文件所有者通过该方式可以正常执行。)
(3)在脚本的路径前再加". " 或source
source /root/Helloworld.sh
. ./Helloworld.sh
PXE自动安装Linux系统
原理
PXE即预启动执行环境,是在没有软驱、硬盘、CD-ROM的情况下引导计算机的一种方式,BIOS将使用PXE协议从网络引导。
PEX环境搭建
1.DHCP服务
Linxu DHCP服务安装:
yum install dhcp
用以上命令就可以安装dhcp服务了
安装完之后dhcp服务脚本为dhcpd
2.TFTP服务
tftp服务搭建:
配置tftp server
yum -y install tftp-server:安装tftp服务
chkconfig tftp on:将tftp设置成开机自启动
service xinetd restart:由于tftp服务是又xinetd服务代为监控的所以要重启xinetd服务
配置启动:
1,chkconfig SERVICE_NAME on
2,编辑配置文件,确保没有被禁用
disable = no
修改后的生效需要重启超级守护进程:
service xinetd restart
提供PXE的工作环境
yum install syslinux:syslinux提供pxelinux.0这个启动文件
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/:将pxelinux.0文件复制到tftp服务目录下
pxelinux.0:pxe启动文档
提供引导内核等文件
cp /media/cdrom/p_w_picpaths/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/
复制:vmlinuz,initrd.img文件到tftp目录
cp /media/cdrom/isolinux{splash.jpg,vesamenu.c32,boot.msg} /var/lib/tftpboot
复制:splash.jpg,vesamenu.c32,boot.msg文件到tftp目录
mkdir /var/lib/tftpboot/pxelinux.cfg/:新建目录pxelinux.cfg
cp /media/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pexlinux.cfg/default
复制:isolinux.cfg文件到tftp目录下的pxelinux.cfg目录下改名为default,
vmlinuz:内核
initrd.img:引导文件
splash.jpg:启动后的背景文件
vesamenu.c32:启动后的图像界面文件
boot.msg:启动后提示文件
pexlinux.cfg:pxe引导文件,主要是显示vesamenu.32的菜单
3.HTTP服务
http服务为提供安装源
yum -y install httpd:安装http服务
mkdir -pv /var/www/html/centos/6/x86_64:建立源目录,-pv代表有子目录,需要递增建
mount --bind /media/cdrom /var/www/html/centos/6/x86_64:--bind是绑定cdrom与x86这个文件夹,代表两个文件内容一样了.
安装
1.安装syslinux,并将pxelinux.0,menu.c32(提供选单),mboot.c32(能够通过内存引导),memdisk(将内存模拟为磁盘),chain.c32(基于bootloader引导系统)复制到/var/lib/tftpboot/下
yum install syslinux -y
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
cp /usr/share/syslinux/{chain.c32,memdisk,menu.c32,mboot.c32} /var/lib/tftpboot/
2.从安装光盘复制vmlinuz和initrd.img到tftp的根目录下
cp vmlinuz initrd.img /var/lib/tftpboot/
3.创建菜单加载的配置文件信息,在tftp的根目录下创建pxelinux.cfg目录,在pxelinux.cfg目录下创建default
mkdir pxelinux.cfg
default配置文件
default menu.c32
prompt 5 (此处为选单出现后几秒内没有动作选择默认选项)
timeout 30(设定选单超时时间)
MENU LABEL THIS IS CENTOS(选单的大标题)
LABEL linuxzidong (在命令行下直接输入此处定义字符能启动该选项)
MENU LABEL install(选单的选项)
KERNEL vmlinuz
APPEND initrd=initrd.img inst.repo=ftp://10.1.1.1/pub/centos (安装文件路径)ks=ftp://10.1.1.1/pub/centos7.cfg (应答文件路径)
4.在ftp的共享目录创建上面定义的目录,并将光盘挂载
mkdir centos
mount /dev/sr0 /var/ftp/pub/centos/
5.在/root下的anaconda-ks.cfg是保存了本机安装系统时选择的应答文件
本次采用的应答文件centos7.cfg,只包含了最基础的安装包
Keyboard layouts
old format: keyboard us
new format:
keyboard –vckeymap=cn –xlayouts=‘cn’
Reboot after installation
reboot
Root password
rootpw –iscrypted 1 1 1HDHf2v4i$LMo.xGHfxQDOf8e043C.g/
System timezone
timezone Asia/Shanghai
Use network installation
url –url=“ftp://10.1.1.1/pub/centos”
System language
lang zh_CN
user –groups=wheel –name=mageedu –password=$6 1 e W r O e t Y 1eWrOetY 1eWrOetYDfLZgquGiOaNkwpEF4ItMipz.1kpn7Q.s6oXyoW2bALkWesRWHCCACICkJ.2zBXDbwEw0ibR.wxSt
LI41ZhfF1 –iscrypted –gecos=“MageEdu”
Firewall configuration
firewall –disabled
Network information
network –bootproto=dhcp –device=eth0
System authorization information
auth –useshadow –passalgo=sha512
Use text mode install
text
firstboot –disable
SELinux configuration
selinux –permissive
ignoredisk –only-use=sda
System bootloader configuration
bootloader –location=mbr –boot-drive=sda
Clear the Master Boot Record
zerombr
Partition clearing information
clearpart –all –initlabel
Disk partitioning information
part /boot –asprimary –fstype=“xfs” –size=512
part swap –fstype=“swap” –size=2048
part /usr –fstype=“xfs” –size=20480
part / –fstype=“xfs” –size=20480
%packages
@base
@core
6.将应答文件复制到ftp的根所在的目录
mv centos7.cfg /var/ftp/pub/
7.将服务器和要安装系统的机器配置在同一个网络内通过网卡启动要安装系统的机器就可以完成自动安装
NFS服务器搭建与autofs自动挂载
NFS服务器搭建
1.关闭防火墙
[root@localhost wuqiong]# systemctl stop firewalld.service
[root@localhost wuqiong]# systemctl disable firewalld.service
[root@localhost wuqiong]# firewall-cmd --state
not running
2.关闭selinux
临时关闭
[root@localhost wuqiong]# setenforce 0
永久关闭
[root@localhost wuqiong]# sed -i 's/^ SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config
重启后配置生效
[root@localhost wuqiong]# sestatus
SELinux status: disabled
3.服务端安装NFS软件
[root@localhost wuqiong]# yum -y install nfs-utils
4.编辑参数exports
[root@localhost wuqiong]# view /etc/exports
/backup 172.27.34.0/24(rw,sync,no_root_squash)
/backup 172.27.9.0/24(rw,sync,no_root_squash)
表示允许172.27.34.0和172.27.9.0两个网段的服务器访问,若对所有ip地址都可以访问则可设置为:
/backup *(rw,sync,no_root_squash)
5.新建共享目录并修改权限
[root@localhost wuqiong]# mkdir /backup
[root@localhost wuqiong backup]# chmod -R 777 /backup/
6.启动服务并设置为开机启动
[root@localhost wuqiong]# systemctl enable rpcbind.service
[root@localhost wuqiong]# systemctl enable nfs-server.service
[root@localhost wuqiong]# systemctl start rpcbind.service
[root@localhost wuqiong]# systemctl start nfs-server.service
autofs自动挂载
1.安装autofs
[root@imxhy data]# yum -y install autofs
2. 编辑自动挂载相关配置
修改master
[root@imxhy ~]# vi /etc/auto.master
vim /etc/sysconfig/nfs
RPCNFSDARGS="-V 4.2 " #高版本才能支持keytab加密
vim /etc/exports
/protected 172.24.8.0/24(rw,sync,sec=krb5p) #设置共享,加密采用krb5p
systemctl restart nfs-server nfs-secure-server #重启相关服务
/mnt /etc/auto.nfs #auto.nfs表示另一个文件
创建挂载项
[root@imxhy ~] cp /etc/auto.misc /etc/auto.nfs
#misc为标准文件不建议直接修改,单以此为模板修改nfs
[root@imxhy ~]# vi /etc/auto.nfs
data -fstype=nfs,rw,all_squash,sync 192.168.10.10:/mywork #设置对应的挂载情况
ip-san搭载
IP-SAN的操作流程大致如下:
initiator作为服务器端去使用远程target上的一个lun(逻辑单元号),一个target即一个主机,一个主机上可以共享多个硬盘给initiator使用,我们把每一个硬盘叫做一个lun。为了使用iscsi协议,initiator上要封装scsi driven,iscsi driven和tcp/ip的报文通过网络发送给target上,target以此扯掉这些报文,发现对方发送的scsi协议,进而交给本地的硬盘驱动处理。所以target上不用必须装scsi的硬盘,像传统的sata盘都可以在这个架构中使用。从用户的角度来看,就像在使用本地的客户端一样,方便简单。
target →Lun→Server
首先存储把Lun共享给server,Server 去发现这个存储,登陆存储认证。
配置
Target 存储端
192.168.1.122的操作流程如下:
# yum install scsi-target-utils
# rpm -ql scsi-target-utils(可以查看一些包信息)
# service tgtd restart
# chkconfig tgtd on
# tgtadm --lld iscsi --mode target --op new --tid 1 --targetname iqn.2014-05.com.qiguo.node:target1
解释:–lld指定driven,–mode指定模式,–op指定模式操作,–tid指定target_id,–targetname指定target的名称,这里使用iqn的命名方式,这里就是新增了一个target,并且target_id为1,target的名称为iqn.2014-05.com.qiguo.node:target1
# tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 1 --backing-store /dev/sda
解释:这里就是在target_id为1的上面增加了一个lun,其值为1,后端的存储设备为/dev/sda。
# tgtadm --lld iscsi --mode target --op show
解释:可以查看当前的target信息和lun信息
# tgtadm --lld iscsi --mode target --op bind --tid 1 --initiator-address 192.168.1.121
解释:target_id为1的允许IP为192.168.1.121的这台主机访问
Server 端
192.168.1.121的操作流程如下:
# yum install iscsi-initiator-utils
# echo “InitiatorName=iscsi-iname -p iqn.2013-05.com.qiguo.initiator1
” >/etc/iscsi/initiatorname.iscsi #生成initiator的名称
# iscsiadm -m discovery -t st -p 192.168.1.122:3260 #使用的时候会自动启动iscsid进程。意思为在192.168.1.122的3260端口以sendtargets的类型寻找iscsi target设备
显示内容如下:192.168.1.122:3260,1 iqn.2014-05.com.qiguo.node:target1
# iscsiadm -m node -d 2 -T iqn.2014-05.com.qiguo.node:target1 -p 192.168.1.122:3260 -l #-d显示debug的级别,-T指定远程主机的targetName,-l选择登陆到远程主机
# fdisk -l
DNS服务器搭建
1、 首先给Linux主机配IP地址,本文Linux的IP地址192.168.1.25,用于访问网站的win7虚拟机的IP地址为192.168.1.50,提供网站服务的win7虚拟机的IP地址为192.168.1.100。
2、在Linux上安装Bind服务,系统光盘中自带了bind软件包,挂载后直接安装。
3、安装成功后,会自动增加一个named的系统服务,下面主要修改named服务的配置文件,主要有3个/etc/named.conf、/etc/named.rfc1912.zones、/var/named/目录下的模板文件。
4、首先修改/etc/named.conf主配置文件。
5、下面修改/etc/named.rfc1912.zones区域配置文件,添加或者直接在里面修改两块块zone区域,一块用于正向解析,另外一块用于反向解析。
6、 最后修改/var/named/目录下的区域配置文件模板,首先复制一份named.localhost模板文件在里面修改,这里注意,在复制时要保留原文件的属主和属组。
7、修改配置文件。
8、复制一份文件用于反向解析
9、配置文件修改完后,关闭防火墙和系统增强安全功能(为以后的访问做好准备),并启动named服务。
10、使用host工具测试一下正向和反向解析。
11、下面到提供网站服务的win7虚拟机中开启web服务,并到IIS管理器中绑定域名和IP地址
12、最后到访问网站服务的win7虚拟机中设置IP和DNS服务器地址。
13、注意一定要关闭win7的防火墙。
14、最终访问成功。
静态路由与BFD联动
静态路由本身没有检测网络故障的机制,网络发生故障时不能实现收敛。为了提高故障发现的及时性,可通过静态路由与BFD联动进行绑定,利用BFD会话快速检测静态路由的链路状态,实现毫秒级快速主备链路切换。
主要实现机制: 如果某静态路由上的BFD检测到链路中断,BFD上报系统,促使路由失效,该路由在IP路由表中消失。 如果某静态路由上的BFD检测到链路恢复,BFD上报系统,重新激活该路由,使该路由重新出现在IP路由表中。
PC1和PC2实现通信,要求实现毫秒级的链路故障感知,只有通过与BFD会话进行绑定,可以再R2和R3分贝创建双向BFD会话,并绑定R2到达外部网络的静态路由。
R1的配置: interface GigabitEthernet0/0/0
ip address 172.31.0.1 255.255.255.252
#interface GigabitEthernet0/0/1
ip address 172.31.1.1 255.255.255.252
#ip route-static 192.168.1.0 255.255.255.0 172.31.0.2
ip route-static 192.168.2.0 255.255.255.0 172.31.1.2
R2的配置
#interface GigabitEthernet0/0/0
ip address 192.168.1.1 255.255.255.0
#interface GigabitEthernet0/0/1
ip address 172.34.2.1 255.255.255.252
#interface GigabitEthernet0/0/2
ip address 172.31.0.2 255.255.255.252
#bfd r2tor3 bind peer-ip 192.168.2.1 discriminator local 10 discriminator remote 20 commit
#ip route-static 172.31.1.0 255.255.255.252 172.31.0.1
ip route-static 192.168.2.0 255.255.255.0 172.31.0.1
ip route-static 192.168.2.0 255.255.255.0 172.34.2.2
R3的相关配置 interface GigabitEthernet0/0/0
ip address 192.168.1.1 255.255.255.0
#interface GigabitEthernet0/0/1
ip address 172.34.2.1 255.255.255.252
#interface GigabitEthernet0/0/2
ip address 172.31.0.2 255.255.255.252
#bfd r2tor3 bind peer-ip 192.168.2.1 discriminator local 10 discriminator remote 20 commit
#ip route-static 172.31.1.0 255.255.255.252 172.31.0.1
ip route-static 192.168.2.0 255.255.255.0 172.31.0.1
ip route-static 192.168.2.0 255.255.255.0 172.34.2.2
在路由器R2上执行如下操作: int g 0/0/2 shu 之后在R1上tracert 192.168.2.2的执行结果如下图所示,上半部分是执行之前的路由,下半部分是执行之后的路由,可以看到实现了路由切换