一.shell编程的相关练习
1.练习题1:ssh的管理
编写脚本实现功能:
(1)在/var/log/secure查找连接失败的主机,并统计次数
(2)累计连接失败超过3次,将此主机加入系统黑名单(/etc/hosts.deny),黑名单的格式为sshd:IP
脚本内容:
或者:
脚本运行结果:
2.练习题2:数据库的管理
实验环境:安装好数据库并进行安全初始化
<1>编写脚本实现功能:
(1)建立三个数据库,名字分别为tom,harry,natasha
(2)并分别对其进行压缩备份到/home/backup目录下,备份文件名称为“库名称_日期.sql.gz”。其中日期是通过"data +%F"命令得到的。
脚本内容:
脚本运行结果:
<2>编写脚本实现功能:
(1)在已有的tom,harry和natasha数据库中创建test数据表,并向数据表中插入值
脚本内容:
- 值的注意的是11行中,进入数据库,创建表,以及插入数据,必须写在一个命令中,不能分开写;
- 11行中要进入数据库,这里使用的是USE $daname,这里必须是双引号,(也不可以USE $daname用单引号,给里面的$dbname加上双引号。)否则识别不了$dabname这个变量的值。
- varchar类型的必须是单引号,不可以是双引号。
脚本运行结果:
<3>编写脚本实现功能:
(1)显示已有的tom,harry和natasha数据库中test数据表中的内容
脚本内容:
脚本运行结果:
<4>编写脚本实现功能:
(1)数据库备份,执行script.sh $dbpasswd 备份数据库中所有库(除了mysql数据库)到/mnt/mysqldump目录中,备份文件名称为“库名称.sql”,
(2)当此文件存在时进入交互模式,询问动作,输入“s”跳过备份,输入“b”,备份“库名称.sql”为“库名称_backup.sql”,输入“O”时,覆盖原文件,e表示退出
脚本内容:
或者(teacher)
脚本运行结果:
二.数组
所谓数组,是有序的元素序列。 [1] 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的 各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。 [1] 这些无序排列的同类数据元素的集合称为数组。
数组是用于储存多个相同类型数据的集合。
1.数组的定义方法
数组的定义方法主要有三种:
<1>方法一:
一对括号表示是数组,数组元素用“空格”符号分割开。
<2>方法二:
一对括号表示是数组,数组元素用“空格”符号分割开。
<3>方法三:动态定义数组变量,并使用命令的输出结果作为数组的内容(其中命令的输出结果有两种表示形式)
使用命令的结果作为数组的内容。
2.数组的打印
<1>数组中元素的打印
数组中单个元素的打印
数组中全部元素的打印
用${数组名[下标]} 下标是从0开始 下标是:*或者@ 得到整个数组内容
<2>数组中元素个数的打印
用${#数组名[@或*]} 可以得到数组长度
<3>数组中元素长度的打印
用${#数组名[下标]} 可以得到数组中元素的长度
3.数组的赋值
直接通过数组名[下标] 就可以对其进行引用赋值(覆盖原来的值),如果下标不存在,自动添加新一个数组元素
4.数组的删除
直接通过:unset 数组[下标] 可以清除相应的元素,不带下标,清除整个数据。
5.数组内容的截取(分片)和替换
<1>数组内容的截取(分片)
从下标为0的字符出发,显示两个字符。
直接通过 ${数组名[@或*]:起始位置:长度} 切片原先数组,返回是字符串,中间用“空格”分开,因此如果加上”()”,将得到切片数组,上面例子:c 就是一个新数据。
<2>数组内容的替换
调用方法是:${数组名[@或*]/查找字符/替换字符} 该操作不会改变原先数组内容,如果需要修改,可以看上面例子,重新定义数据。
6.数组中for和while循环的遍历
案例1:利用循环输出数组元素
方法一:利用for循环
方法二:利用while循环
案例2:利用循环打印下面这句话中字母个数小于6的单词
I am linux student welcome to student training class
方法一:利用for循环
方法二:利用while循环
三.随机数
1.常见产生随机数的方法
<1>方法一:通过系统环境变量($RANDOM)实现(产生的主要是数字)
RANDOM的随机数范围为0~32767,因此,加密性不是很好,可以通过在随机数后增加加密字符串(就是和密码生成有关的字符串)的方式解决,最后再一起执行md5sum操作并截取结果的后n位,这样一来,就无法根据随机范围0~32767猜出具体结果了。
示例:取出5-15位
<2>方法二:通过openssl产生随机数(产生的主要是字母)
openssl rand 用于产生指定长度个bytes的随机字符。
可以看见,这10个字节的随机数显示为乱码。
-base64 / -hex 对随机字符串进行base64编码或用hex格式显示
注意:这里的10是10个字节。
令数字与大小写字符相结合,并带上特殊字符,可以达到很长的位数,这样的随机数很安全。
2.md5sum命令
<1>背景
在网络传输、设备之间转存、复制大文件等时,可能会出现传输前后数据不一致的情况。这种情况在网络这种相对更不稳定的环境中,容易出现。那么校验文件的完整性,也是势在必行的。
md5sum命令用于生成和校验文件的md5值。它会逐位对文件的内容进行校验。是文件的内容,与文件名无关,也就是文件内容相同,其md5值相同。md5值是一个128位的二进制数据,转换成16进制则是32(128/4)位的进制值。
md5校验,有很小的概率不同的文件生成的md5可能相同。比md5更安全的校验算法还有SHA*系列的。
在网络传输时,我们校验源文件获得其md5sum,传输完毕后,校验其目标文件,并对比如果源文件和目标文件md5 一致的话,则表示文件传输无异常。否则说明文件在传输过程中未正确传输。
<2>md5sum命令的重要选项
- -b 以二进制模式读入文件内容
- -t 以文本模式读入文件内容
- -c 根据已生成的md5值,对现存文件进行校验
- --status 校验完成后,不生成错误或正确的提示信息,可以通过命令的返回值来判断。
<3>使用案例
测试文件
测试过程:
- (1)生成文件md5值:ma5sum filename
md5sum校验的是文件内容,与文件名无关
以文本模式或二进制模式读入文件并对其进行校验
-b 以二进制模式读入内容
-t 以文本模式读入文件内容进行校验
虽然是不同的读入模式,但是在进行求md5的时候,是一样的,因为是逐位校验的。
如下文本文件,无论通过哪种模式读取md5都一致。
- (2)md5值重定向
将生成md5值重定向到指定的文件,通常文件的扩展名我们会命为.md5
- (3)md5校验:md5sum –c .md5
-c选项来对文件md5进行校验。校验时,根据已生成的md5来进行校验。生成当前文件的md5,并和之前已经生成的md5进行对比,如果一致,则返回OK,否则返回错误信息。
修改文件后,文件md5变化
再次进行校验,会出现如下的错误信息。
--status,不显示校验信息,以命令返回值来判断
校验一致返回0,不一致返回1
3.随机数案例
<1>案例1:面试题:
使用for循环在/xin目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串"_xin.html"
说明:这里不使用第一种生成随机数的方法来裁剪10位小写字母的原因是,第一种方法产生的随机数的位数是不确定的,可能裁剪不出来10位随机数,而第二种方法可以改变后面接的字节数来使得其位数增多,裁剪出来10位小写字母的可能行比较大。
<2>案例2:
建立xin01-xin10十个用户,并给每个用户随机生成10位密码,将用户及其对应的密码存储在一个/xin/passwd文件中(存储格式为:"user:用户名 passwd:密码值")。
方法一:
方法二:(teacher)
值的注意的是:第2行,14-19行是为了实现下面的is ok的效果。
四.Linux6.5环境下nginx服务的搭建
1.Linux6.5系统如何对服务进行控制
Linux6版本的系统对服务的控制不同于Linux7版本
<1>设置服务开启/关闭/重启/查看状态
systemctl
- Linux7版本使用"systemctl start|stop|restart|status 服务名称"命令
/etc/init.d/
- 而Linux6版本使用脚本来对服务进行控制(脚本所在目录:/etc/init.d/):"/etc/init.d/服务名称 start|stop|restart|status"命令
<2>设置服务开机自启和开机不自启
systemctl
- Linux7版本使用"systemctl enable|disable 服务名称"命令
chkconfig
- 而Linux6版本使用
chkconfig 服务名称 on 设置某个服务开机启动(默认在2345四个模式下执行)
chkconfig 服务名称 off 设置某个服务开机不启动(默认在2345四个模式下执行)
2nginx服务介绍
Nginx是一款相当优秀的用于部署动态网站的轻量级服务程序,它最初是为俄罗斯门户站点而开发的,因其稳定性、功能丰富、占用内存少且并发能力强而备受 用户信赖。Nginx服务程序的稳定性源自于采用了分阶段的资源分配技术,降低了CPU与内存的占用率,所以使用Nginx程序部署的动态网站环境不仅十 分稳定、高效,而且消耗的系统资源也很少。更重要的事,Nginx还支持热部署技术,可以7X24小时不间断提供服务,还可以在不暂停服务的情况下直接对 Nginx服务程序进行升级。
3.Linux6.5环境下nginx服务的搭建的系统环境
- rhel6.5操作系统
- Nginx-1.14.0.tar.gz
- 服务器IP地址:172.25.83.183
- yum源:172.25.83.83
网络配置过程
yum源配置过程
4.Linux6.5环境下nginx服务的搭建过程
<1>将压缩包Nginx-1.14.0.tar.gz通过scp命令传到Linux6.5系统的虚拟机的家目录下,并将其解压到家目录下
值的注意的是,有时候安装的Linux6.5系统在安装时没有支持scp命令的安装包,此时,就需要安装相应的软件包(openssh-clients)来使得系统支持scp命令。
<2>修改配置文件
[root@localhost ~]# cd nginx-1.14.0
[root@localhost nginx-1.14.0]# vim src/core/nginx.h14 #define NGINX_VER "nginx/"NGINX_VERSION
改为
14 #define NGINX_VER "nginx/"
[root@localhost ~]# cd nginx-1.14.0
[root@localhost nginx-1.14.0]# vim auto/cc/gcc将172行注释
172 #CFLAGS="$CFLAGS -g"
<3>安装依赖包
[root@localhost ~]# yum install gcc -y
[root@localhost ~]# yum install pcre-devel -y
[root@localhost ~]# yum install openssl-devel -y
<4>配置编译安装(./configure)——需要在nginx-1.14.0目录下(有configure这个文件)执行此操作
首先介绍./configure,make和make install命令
基本信息
1、./configure 是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本。
2、make 是用来编译的,它从Makefile中读取指令,然后编译。
3、make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。
详细解释
1、configure命令
这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制,比如代码:./configure –prefix=/usr 意思是将该软件安装在 /usr 下面,执行文件就会安装在 /usr/bin (而不是默认的 /usr/local/bin),资源文件就会安装在 /usr/share(而不是默认的/usr/local/share)。同时一些软件的配置文件你可以通过指定 –sys-config= 参数进行设定。有一些软件还可以加上 –with、–enable、–without、–disable 等等参数对编译加以控制,你可以通过允许 ./configure –help 察看详细的说明帮助。
2、make
这一步就是编译,大多数的源代码包都经过这一步进行编译(当然有些perl或 python编写的软件需要调用perl或python来进行编译)。如果 在 make 过程中出现 error ,你就要记下错误代码(注意不仅仅是最后一行),然后你可以向开发者提交 bugreport(一般在 INSTALL 里有提交地址),或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。
可能遇到的错误:make *** 没有指明目标并且找不到 makefile。 停止。问题很明了,没有Makefile,怎么办,原来是要先./configure 一下,再make。
3、make insatll
这条命令来进行安装(当然有些软件需要先运行 make check 或 make test 来进行一些测试),这一步一般需要你有 root 权限(因为要向系统写入文件)。
[root@localhost nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --with-threads --with-file-aio --with-http_ssl_module --with-http_stub_status_module --user=nginx --group=nginx
没有报错,表示成功
<5>编译安装(make,make install)
[root@localhost nginx-1.14.0]#make && make install
<6>创建nginx用户
[root@localhost nginx-1.14.0]# useradd nginx
<7>建立软链接,便于系统管理
[root@localhost nginx-1.14.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ #让系统识别命令
软链接做好之后
nginx #启动nginx服务
killall -1 nginx #重启nginx服务
killall -3 nginx 或 killall nginx #关闭nginx服务
<8>启动nginx服务
(1)在没有进行第7步操作(建立软链接)之前:启动nginx服务的方法——进入(/usr/local/nginx/sbin),执行(./nginx)
其中/usr/local/nginx是之前执行(./configure命令指定的目录)
通过查看端口的方式,可以看到nginx服务已经开启(nginx服务的端口为80,与httpd服务的默认侦听端口一致,所以,不能同时开启httpd服务和nginx服务)
(2)在进行第7步操作(建立软链接)之后:启动nginx服务的方法——直接执行(nginx)命令
因为nginx服务已经开启,再次开启会报错,所以,必须先关掉nginx服务,然后再打开nginx服务
<9>编辑nginx服务的默认发布文件,关闭防火墙进行,测试
(1)编辑nginx服务的默认发布文件(/usr/local/nginx/html/index.html)
[root@localhost nginx-1.14.0]# cd /usr/local/nginx/html/
[root@localhost html]# ls
50x.html index.html
[root@localhost html]# vim index.html
(2)关闭防火墙,并将其设置为开机不自启——iptables(Linux6版本的防火墙只有iptables;Linux7版本的防火墙有firewalld和iptables)
[root@localhost html]# /etc/init.d/iptables stop #关闭iptables
[root@localhost html]# chkconfig iptables off #设置iptables开机不自启
值的注意的是:ip6tables可关可不关,对ip6tables的操作,同iptables。
(3)在浏览器中输入IP地址进行测试
五.Linux6.5环境下nginx服务启动脚本的编写
使用源码包安装的nginx没办法使用"/etc/init.d/nginx start|stop|restart|status"命令对nginx服务进行控制。所以写了以下脚本来实现使用命令"/etc/init.d/nginx start|stop|restart|status "对nginx服务的控制。
编写监控nginx服务的shell脚本,实现功能:输入"/etc/init.d/nginx start",就启动nginx服务;输入"/etc/init.d/nginx stop",就关闭nginx服务;输入"/etc/init.d/nginx restart",就重启nginx服务;输入"/etc/init.d/nginx status",就查看nginx服务的状态。
1.制作管理脚本
在/etc/init.d/目录下,编写名为nginx的脚本文件
第一种
第二种(teacher)
#!/bin/bash
. /etc/init.d/functions
function usage() {
echo $"usage:$0 {start|stop|restart}"
exit 1
}
function start() {
rsync --daemon
sleep 1
if [ `netstat -antlpe | grep rsync | wc -l` -ge 1 ];then
action "rsyncd is started." /bin/true
else
action "rsyncd is started." /bin/false
fi
}
function stop() {
killall rsync &> /dev/null
sleep 1
if [ `netstat -antlpe | grep rsync | wc -l` -eq 0 ];then
action "rsyncd is stoped." /bin/true
else
action "rsyncd is stoped." /bin/false
fi
}
function main() {
if [ $# -ne 1 ];then
usage $0
fi
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
usage $0
;;
esac
}
main $*
2.赋予nginx可执行权限
3.运行结果