Shell脚本(shell script)就是将要执行的命令按顺序保存到一个文本文件,并给该文件可执行权限,方便一次性执行的一个程序文件。主要是方便管理员进行设置或管理,可结合各种shell控制语句以完成更复杂的操作。常用于重复性操作、批量事物处理、自动化运维、服务运行状态监控、定时任务执行等。
1、Shell 分隔符
“;”:无论前面命令是否执行成功,都执行后面的命令
date;who
“&&”:前面命令执行成功,在执行后面的命令。
abc&&who # -bash: abc: command not found
who&&abc
“||": 前面命令执行失败, 再执行后面的命令
date||who # Fri Dec 1 18:35:05 CST 2023
abc||who
2、Shell 脚本编写
a. 脚本格式
- 创建shell脚本以.sh结尾
- 第一行指定shell解释器,以#!开头,后面跟shell解释器绝对路径
- 第二行写注释,注释以#开头,注释包括作者,时间以及脚本作用
- 最后编写shell命令
- 如果脚本比较复杂,请填写注释
b. nmap 命令
- 描述:linux下的网络扫描和嗅探工具
- 语法:nmap [选项] 目标ip/网段13
-sT:TCP连接扫描,不安全,慢
-sS:SYN扫描,使用最频繁,安全,快
-Pn:目标机禁用ping,绕过ping扫描
-sU:UDP扫描,慢,可得到有价值的服务器程序
-sA:检测哪些端口被屏蔽
-p:对指定端口扫描
-sP:主机存活性扫描,arp直连方式
-f:使用小数据包发送,避免被识别出
# 安装 nmap
yum install -y nmap
# 快速检测目标主机开放端口
nmap -sS 192.168.137.252
编写端口扫描脚本:vim nmap.sh
#!/bin/bash
#by Mr.Zhang
#nmap script
#2023-12-01
echo "########################$ip#####################" >> /root/nmap.log
echo $(date "+%x%X") >> /root/nmap.log
nmap -sS 192.168.137.252 >> /root/nmap.log
# 赋予执行权限
chmod u+x nmap.sh
# 执行脚本
./nmap.sh
# 查看日志文件
cat /root/nmap.log
优化脚本:vim nmap.sh
#!/bin/bash
#by Mr.Zhang
#nmap script
#2023-12-01
###########################################
ip="192.168.137.252"
datetime=$(date "+%x%X")
logfile=/root/nmap.log
###########################################
echo "#######$ip######" >> $logfile
echo $datetime >> $logfile
nmap -sS $ip >> $logfile
echo "scan successfully!!!"
echo "" >> $logfile
c. 脚本执行方式
- 命令解释器执行脚本:使用命令解释器执行脚本可以不给脚本x权限,使用bash或sh
- source或者“.”命令执行脚本,在当前shell环境执行脚本中命令,不开启子shell,不需要给脚本添加x权限
- 使用绝对路径和相对路径执行脚本需要给脚本添加x权限
d. 脚本测试
写完脚本后,建议在运行脚本之前先检查脚本中的语法,而不是查看它们的输出以确认它们是否正常工作:
-n 只读取shell脚本,但不实际执行
-x 进入跟踪方式,显示所执行的每一条命令
-v 一边执行脚本,一边将执行过的脚本命令打印到标准输出,如果有错误会给出错误提示。
# 模拟错误,删除nmap.sh脚本里一个双引号
# 检测nmap.sh是否有语法错误
sh -n nmap.sh
# 使用-x追踪
sh -x nmap.sh
e. tee 命令
- 描述:将标准输入在显示屏上输出并将其内容保存到文件中
- 语法:tee [选项] [文件]
-a, --append 内容追加到给定的文件而非覆盖
f. echo 命令
- 描述:带颜色显示内容
- 语法:echo [选项]
-e:激活转义字符,使用-e选项时,若字符串中出现以下字符,则特别加以处理
插入换行制表符:
- \n 换行且光标移至行首
- \t 插入tab
- \nnn 插入nnn(八进制)所代表的ASCII字符
颜色显示格式:
echo -e “\033[背景颜色;文字颜色m 文字内容\033[0m”
echo -e “\e[背景颜色;文字颜色m 文字内容\e[0m”
文字颜色 | 背景颜色 | 控制选项 |
"\033[30m 黑字 \033[0m" | \033[40;37m 黑底白字 \033[0m | 0m 关闭所有属性 |
"\033[31m 红字 \033[0m" | \033[41;37m 红底白字 \033[0m | 1m 设置高亮度,加粗 |
"\033[32m 绿字 \033[0m" | \033[42;37m 绿底白字 \033[0m | 4m 下划线 |
"\033[33m 黄字 \033[0m" | \033[43;37m 黄底白字 \033[0m | 5m 闪烁 |
"\033[34m 蓝字 \033[0m" | \033[44;37m 蓝底白字 \033[0m | 7m 反显 |
"\033[35m 紫字 \033[0m" | \033[45;37m 紫底白字 \033[0m | |
\033[36m 天蓝字 \033[0m | \033[46;37m 天蓝底白字 \033[0m | |
"\033[37m 白字 \033[0m" | \033[47;30m 白底黑字 \033[0m |
# 显示黑底绿色字
\033[47;30m 白底黑字 \033[0m
# 显示红底黑字
echo -e "\033[41;30m hello world\033[0m"
# 显示黑底蓝字加粗
echo -e "\e[40;36;1m apache server stop... \e[0m"
g. read 命令
- 描述:提示用户从键盘读入数据,赋给变量。从而实现简单的交互过程
- 语法:read [选项] [变量名1] [变量名2]
-p:用来设置提示信息
-t:设置等待时间,单位是秒,若在规定时间内未输入自动跳出
执行时将从标准输入设备(键盘)读入一行内容,并以空格作为分隔符,将读入的各字段挨个赋值给指定的变量,多余的内容赋值给最后一个变量。若指定的变量只有一个,则将整行内容赋值给此变量。
#!/bin/bash
#this is a test read script
read -t 10 -p "请输入您的姓名:" name
read -t 10 -p "请输入您的年龄:" age
read -t 10 -p "请输入您的电话:" phone
cat << EOF
***********************
姓名:$name
年龄:$age
电话:$phone
***********************
EOF
测试正常输入:
测试输入超时:
3、Apache 安装脚本
a. 初始脚本
#!/bin/bash
#apache auto install script
#2022-12-01
yum -y install apr apr-devel apr-util apr-util-devel pcre pcre-devel gcc gcc-c++ net-tools
tar -zxvf /root/httpd-2.4.54.tar.gz -C /usr/local/src/
cd /usr/local/src/httpd-2.4.54/
./configure --prefix=/usr/local/apache
make -j 2
make install
rm -rf /usr/local/src/httpd-2.4.54
/usr/local/apache/bin/apachectl start
netstat -antup | grep 80
# 关闭apache
/usr/local/apache/bin/apachectl stop
# 卸载apache
rm -rf /usr/local/apache/
b. 脚本优化
#!/bin/bash
#by Mr.zhang
#apache auto install script
packages="apr apr-devel apr-util apr-util-devel pcre pcre-devel gcc gcc-c++ net-tools"
apache_version="httpd-2.4.54"
src_dir="/usr/local/src/"
install_dir="/usr/local/apache"
cpu_count=2
ip=$(ifconfig ens33 | grep netmask | awk '{print $2}')
logfile="/root/apache_install.log"
echo "#############################" | tee -a $logfile
echo "#安装apache依赖包" | tee -a $logfile
yum -y install $packages &>> $logfile
echo -e "\e[32;1m install apache packages successful\e[0m"
echo "#安装 apache"
tar -zxvf /root/${apache_version}.tar.gz -C $src_dir &>> $logfile
cd $src_dir$apache_version
echo "开始预编译" | tee -a $logfile
./configure --prefix=$install_dir &>> $logfile
echo -e "\e[32;1m ./configure successful \e[0m"
echo "#开始编译" | tee -a $logfile
make -j $cpu_count &>> logfile
echo -e "\e[32;1m make successful \e[0m"
echo "#开始安装" | tee -a $logfile
make install &>> $logfile
echo -e "\e[32;1m make install successful \e[0m"
echo "#删除解压包" | tee -a $logfile
rm -rf src_dir/$apache_version
echo "#启动 apache" | tee -a $logfile
$install_dir/bin/apachectl start &>> $logfile
echo "#查看端口号" | tee -a $logfile
netstat -antup | grep 80 | tee -a $logfile
echo "#访问测试"
curl $ip | tee -a $logfile
echo -e "\e[32;1m apache start successful\e[0m" | tee -a $logfile