一、认识shell脚本:
在一些复杂的Linux维护工作中,大量重复性的输入和交互操作不仅费时费力.而且容易出错.而编写一个恰到好处的Shell脚本程序,可以批量处理、自动化地完成一系列维护任务.大大减轻管理员的负担。
简单的脚本编写:
[root@xiao ~]# vim first.sh ##新建first.sh文件##
cd /boot/
echo "路径为:"
pwd
echo "开头为vml的文件有:"
ls -lh vml*
[root@xiao ~]# chmod +x first.sh ##赋予权限##
[root@xiao ~]# ./first.sh ##执行脚本文件##
结果展示:
执行脚本文件的方式有多种:
[root@xiao ~]# sh first.sh /通过/bin/sh来解释脚本
[root@xiao ~]# . first.sh //通过点号来加载脚本
二、重定向与管道操作:
1.重定向操作
Linux系统使用文件来描述各种硬件、设备等资源.如以前学过的硬盘和分区.光盘等设备文件。
用户通过操作系统处理信息的过程中,包括以下几类交互设备文件。
标准输入(STDN):默认的设备是键盘.文件编号为0,命令将从标准输入文件中读取在执行过程中需要的输入数据。
标准输出(STDOUT):默认的设备是显示器,文件编号为1,命令将执行后的输出结果发送到标准输出文件。
标准错误(STDERR):默认的设备是显示器,文件编号为2,命令将执行期间的各种错误信息发送到标准错误文件.
重定向输出:
重定向输出指的是将命令的正常输出结果保存到指定的文件中.而不是直接显示在显示器的屏幕上。重定向输出使用">"或">>"操作符号,分别用于覆盖或追加文件。
[root@xiao ~]# uname -p > kernel.txt
[root@xiao ~]# cat kernel.txt
x86_64
当需要保留目标文件原有的内容时,应改用">"操作符号,以便追加内容而不是全部覆盖。例如,执行以下操作可以将内核版本信息追加到kernel , txt 文件中。
[root@xiao ~]# uname -r >> kernel.txt
[root@xiao ~]# cat kernel.txt
x86_64
3.10.0-957.el7.x86_64
重定向输入:
重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件.而不是等待从键盘输入。重定向输入使用"<"操作符。
[root@xiao ~]# vim pass.txt /添加初始密码串内容"123456"
123456
[root@xiao ~]# passwd --stdin jerry < pass.txt /从pass.txt文件中取密码
2.管道操作:
管道(pipe〉操作为不同命令之间的协同工作提供了--种机制,位于管道符号"左侧的命令输出的结果.将作为右侧命令的输入〈处理对象).同一行命令中可以使用多个管道。
##提取前##
[root@xiao ~]# grep "/bin/bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
xiaowei:x:1000:1000:xiaowei:/home/xiaowei:/bin/bash
##提取后##
[root@xiao ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
xiaowei /bin/bash
[root@xiao ~]#
若要提取根分区(/)的磁盘使用率信息,可以执行以下操作.其中用到了df、grep 、awk命令和管道操作。
[root@xiao ~]# df -hT ##提取前##
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 18G 8.3G 9.7G 47% /
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 13M 1.9G 1% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 179M 836M 18% /boot
tmpfs tmpfs 378M 12K 378M 1% /run/user/42
tmpfs tmpfs 378M 0 378M 0% /run/user/0
[root@xiao ~]# df -hT | grep "/$" | awk '{print $6}' //提取之后其中grep "/$"表示提取以"/"结尾的行
47%
三、Shell的变量使用 :
各种Shell环境中都使用到了"变量"的概念。Shell变量用来存放系统和用户需要使用的特定参数〈值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell程序能够提供更加灵活的功能.适应性更强。
常见Shell变量的类型包括自定义变量.环境变量.位置变量.预定义变量。本节将分别介绍这四种Shell变量的使用。
定义变量:
Bash中的变量操作相对比较简单,不像其他高级编程语言〈如C/C++、Java等〉那么复杂。在定义--个新的变量时,...般不需要提前进行声明,而是直接指定变量名称并赋给初始值(内容)即可。
定义变量的基本格式为"变量名=变量值".等号两边没有空格。变量名称需以字母或下划线开头.名称中不要包含特殊字符〈如+、一、*、/ 、..?.%、&.#等)。
[root@xiao ~]# product=python
[root@xiao ~]# version=1.2.3.4
查看和应用变量的值:
通过在变量名称前添加前导符号"$",可以引用一个变量的值。使用echo命令可以查看变量.可以在-一条echo命令中同时查看多个变量值。
[root@xiao ~]# echo $product
python
[root@xiao ~]# echo $product $version
python 1.2.3.4
[root@xiao ~]#
当变量名称容易和紧跟其后的其他字符相混淆时,需要添加大括号"{}"将其括起来.否则将无法确定正确的变量名称。对于未定义的变量,将显示为空值。
[root@xiao ~]# echo $product2.5
.5
[root@xiao ~]# echo ${product}2.5
python2.5
[root@xiao ~]#
变量赋值的特殊操作:
在等号"="后边直接指定变量内容是为变量赋值的最基本方法.除此之外.还有一些特殊的赋值操作,可以更灵活地为变量赋值,以便适用于各种复杂的管理任务。
双引号(""):
双引号主要起界定字符串的作用,特别是当要赋值的内容中包含空格时,必须以双引号括起来;其他情况下双引号通常可以省略。
[root@xiao ~]# python="python 2.1.22"
[root@xiao ~]# echo $python
python 2.1.22
[root@xiao ~]#
在双引号范围内.使用"$"符号可以引用其他变量的值(变量引用).从而能够直接调用现有变量的值来赋给新的变量。
[root@xiao ~]# sqlserver="sqlserver $version"
[root@xiao ~]# echo $sqlserver
sqlserver 1.2.3.4
单引号('')
当要赋值的内容中包含$."、\等具有特殊含义的字符时,应使用单引号括起来。在单引号的范围内,将无法引用其他变量的值.任何字符均作为普通字符看待。但赋值内容中包含单引号(')时,需使用\′符号进行转义,以免冲突。
[root@xiao ~]# sqlserver='sqlserver $version'
[root@xiao ~]# echo $sqlserver
sqlserver $version
反撇号(`)
反撇号主要用于命令替换.允许将执行某个命令的屏幕输出结果赋值给变量。反撤号括起来的范围内必须是能够执行的命令行,否则将会出错。例如,若要在一行命令中查找useredd命令程序的位置并列出其详细属性,可以执行以下操作。
[root@xiao ~]# ls -lh `which useradd`
-rwxr-x---. 1 root root 116K 10月 31 2018 /usr/sbin/useradd
若要提取 vsftpd服务的禁止登录用户列表,并将其赋值给变量DenyList,可以执行以下操作。
[root@xiao ~]# denylist=`grep -v "^#" /etc/vsftpd/ftpusers`
若要查询提供useradd命令程序的软件包所安装的配置文件位置,可以执行以下操作(从里到外先后执行替换)。
[root@xiao ~]# rpm -qc $(rpm -qf $(which useradd))
/etc/default/useradd
/etc/login.defs
read命令:
除了上述赋值操作以外,还可以使用Bash的内置命令read 来给变量赋值。reed命令用来提示用户输入信息,从而实现简单的交互过程。执行时将从标准输入设备〈键盘)读入一行内容,并以空格为分隔符.将读入的各字段依次赋值给指定的变量〈多余的内容赋值给最后一个变量)。若指定的变量只有一个,则将整行内容赋值给此变量。
[root@xiao ~]# read asdf1
123.123
[root@xiao ~]# echo $asdf1
123.123
设置变量的作用范围
默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或新的子Shell环境时,局部变量将无法再使用。
[root@xiao ~]# echo "$sqlserver $version"
sqlserver $version 1.2.3.4
[root@xiao ~]# export sqlserver version
[root@xiao ~]# bash
[root@xiao ~]# echo "$sqlserver $version"
sqlserver $version 1.2.3.4
数值变量的运算
Shell变量的数值运算多用于脚本程序的过程控制〈如循环次数.使用量比较等.后续章节会介绍)。在Bash Shell环境中.只能进行简单的整数运算,不支持小数运算。整数值的运算主要通过内部命令expr进行,基本格式如下所示。需要注意,运算符与变量之间必须有至少一个空格。
特殊变量:
1.环境变量
环境变量指的是出于运行需要而由Linux系统提前创建的一类变量,主要用于设置用户的工作环境.包括用户宿主目录、命令查找路径.用户当前目录、登录终端等。环境变量的值由Linux系统自动维护,会随着用户状态的改变而改变。
2.位置变量
为了在使用Shell脚本程序时,方便通过命令行为程序提供操作参数,Bash引入了位置变量的概念。当执行命令行操作时,第一个字段表示命令名或脚本程序名.其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
3.预定义变量
预定义变量是由Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量.也不能直接为预定义变量赋值。预定义变量使用"$"符号和另一个符号组合表示.较常用的几个预定义变量的含义如下。
$#:表示命令行中位置参数的个数。
$*;表示所有位置参数的内容。
$?:表示前-条命令执行后的返回状态,返回值为О表示执行正确.返回任何非О值均表
示执行出现异常。关于$?变量的使用将在下一章介绍。
s0:表示当前执行的脚本或程序的名称。
四、实验:(shell脚本与计划任务)
1.确认备份方案:
备份主机:P地址为172.16.16.220,通过机柜内网络连接目标主机。
数据库服务器:P地址为172.16.16.22,MySQL服务监听的端口为3306。
备份内容:对MySQL服务器中的studydb、coursedb库进行远程备份.每天凌晨2∶30执行.每个库备份为独立的.sql文件,然后压缩为".tar . gz"格式,文件名中嵌入执行备份时的日期和时刻
mysql> GRANT select,lock tables ON studydb.* TO 'operator'@'localhost' IDENTIFIED BY 'pwd123';
mysql> GRANT select,lock tables ON coursedb.* TO 'operator'@'localhost' IDENTIFIED BY 'pwd123';
从备份主机中测试数据库访问.查询授权等是否有效.或者直接使用mysqldump备份工具进行测试。
[root@xiao ~]# mysqldump -u operator -ppwd123 -h localhost --databases studydb > test.sql
Warning: Using a password on the command line interface can be insecure.
[root@xiao ~]# ls -lh test.sql
-rw-r--r-- 1 root root 1.4K 12月 19 01:30 test.sql
[root@xiao ~]#
2.编写MySQL备份脚本
在备份主机中.创建用来存放备份文件的目录(如/opt/qnzx_dbbak),并编写相应的备份脚本(如qnzx_dbbak , sh),确认能够成功执行备份。脚本代码中,对于目标主机的P地址、用户名、密码、备份路径.文件名等信息.可能会在必要的时候变更。为了方便更新脚本,这些内容最好存放到固定名称的变量中。
[root@xiao ~]# mkdir -p /opt/qnzx_dbbak/
[root@xiao ~]# vim qnzx_dbbak.sh
#!/bin/bash
# 这是一个简化的MySQL数据库逻辑备份脚本
# 1.定义数据库连接、目标库信息
MY_USER="operator"
MY_PASS="pwd123"
MY_HOST="localhost"
MY_CONN="-u $MY_USER -p -h $MY_HOST"
MY_DB1="studydb"
MY_DB2="coursedb"
# 2.定义备份目录、工具、时间、文件名主体
BF_DIR="/opt/qnzx_dbbak/"
BF_CMD="/usr/local/mysql/bin/mysqldump"
BF_TIME=`date +%Y%m%d-%H%M`
NAME_1="$MY_DB1-$BF_TIME"
NAME_2="$MY_DB2-$BF_TIME"
# 3.先导出为.sql脚本,然后进行压缩(打包后删除源文件)
cd $BF_DIR
$BF_CMD $MY_CONN --databases $MY_DB1 > $NAME_1.sql
$BF_CMD $MY_CONN --databases $MY_DB2 > $NAME_2.sql
/bin/tar zcf $NAME_1.tar.gz $NAME_1.sql --remove &> /dev/null
/bin/tar zcf $NAME_2.tar.gz $NAME_2.sql --remove &> /dev/null
[root@xiao ~]# chmod +x qnzx_dbbak.sh
[root@xiao ~]# ./qnzx_dbbak.sh
Enter password:
[root@xiao ~]# ls-lh /opt/qnzx_dbbak/*.gz
bash: ls-lh: 未找到命令...
[root@xiao ~]# ls -lh /opt/qnzx_dbbak/*.gz
-rw-r--r-- 1 root root 622 12月 19 01:38 /opt/qnzx_dbbak/coursedb-20231219-0138.tar.gz
-rw-r--r-- 1 root root 621 12月 19 01:38 /opt/qnzx_dbbak/studydb-20231219-0138.tar.gz
[root@xiao ~]#
------------------------------------------------
设置计划任务
有了批量备份的Shell脚本以后,接下来可按照备份要求设置计划任务,以便自动、定期执行备份操作。在crontab配置记录中.直接指定qnzx_dbbak . sh脚本程序的路径作为执行命令。
[root@xiao ~]# mv qnzx_dbbak.sh /opt/qnzx_dbbak/
[root@xiao ~]# crontab -e
51 1 * * * /opt/qnzx_dbbak/qnzx_dbbak.sh
[root@xiao ~]# systemctl status crond
结果: