Linux运维高薪必看 | shell编程15例(二)
在下方公众号回复“001”,即可获取氪肝整理的154页Linux学习笔记。
1、进度条,动态时针版本;定义一个显示进度的函数,屏幕快速显示| / ‐
#!/bin/bash # 进度条,动态时针版本 # 定义一个显示进度的函数,屏幕快速显示| / ‐ rotate_line(){
INTERVAL=0.5 #设置间隔时间 COUNT="0" #设置4个形状的编号,默认编号为 0(不代表任何图像) while : do COUNT=`expr $COUNT + 1` #执行循环,COUNT 每次循环加 1,(分别代表4种不同的形状) case $COUNT in #判断 COUNT 的值,值不一样显示的形状就不一样 "1") #值为 1 显示‐ echo -e '‐'"bc" sleep $INTERVAL ;;
"2") #值为 2 显示\,第一个是转义 echo -e '\'"bc" sleep $INTERVAL ;;
"3") #值为 3 显示| echo -e "|bc" sleep $INTERVAL ;;
"4") #值为 4 显示/ echo -e "/bc" sleep $INTERVAL ;;
*) #值为其他时,将 COUNT 重置为 0 COUNT="0";;
esac done }
rotate_line
2、9*9 乘法表
#!/bin/bash # 9*9 乘法表(编写 shell 脚本,打印 9*9 乘法表) for i in `seq 9` do for j in `seq $i` do echo -n "$j*$i=$[i*j] " done echo done
3、使用死循环实时显示 eth0 网卡发送的数据包流量
#!/bin/bash # 使用死循环实时显示 eth0 网卡发送的数据包流量 while : do echo '本地网卡 eth0 流量信息如下: ' ifconfig eth0 | grep "RX pack" | awk '{print $5}' ifconfig eth0 | grep "TX pack" | awk '{print $5}' sleep 1 done
4、使用 user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码本脚本执行,需要提前准备一个 user.txt 文件,该文件中包含有若干用户名信息
#!/bin/bash # 使用 user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码 # 本脚本执行,需要提前准备一个 user.txt 文件,该文件中包含有若干用户名信息 for i in `cat user.txt` do useradd $i echo "123456" | passwd ‐‐stdin $i done
5、编写批量修改扩展名脚本
#!/bin/bash # 编写批量修改扩展名脚本,如批量将 txt 文件修改为 doc 文件 # 执行脚本时,需要给脚本添加位置参数 # 脚本名 txt doc(可以将 txt 的扩展名修改为 doc) # 脚本名 doc jpg(可以将 doc 的扩展名修改为 jpg) for i in `ls *.$1` do mv $i ${i%.*}.$2 done
6、使用 expect 工具自动交互密码远程其他主机安装 httpd 软件
#!/bin/bash # 使用 expect 工具自动交互密码远程其他主机安装 httpd 软件 # 删除~/.ssh/known_hosts 后,ssh 远程任何主机都会询问是否确认要连接该主机 rm ‐rf ~/.ssh/known_hosts
expect <<EOF
spawn ssh 192.168.4.254
expect "yes/no" {send "yesr"} # 根据自己的实际情况将密码修改为真实的密码字串 expect "password" {send "密码r"}
expect "#" {send "yum ‐y install httpdr"}
expect "#" {send "exitr"}
EOF
7、一键部署 LNMP(源码安装版本)
#!/bin/bash # 一键部署 LNMP(源码安装版本) menu()
{
clear echo " ##############‐‐‐‐Menu‐‐‐‐##############" echo "# 1. Install Nginx" echo "# 2. Install MySQL" echo "# 3. Install PHP" echo "# 4. Exit Program" echo " ########################################" }
choice()
{
read -p "Please choice a menu[1‐9]:" select
}
install_nginx()
{
id nginx &>/dev/null
if [ $? -ne 0 ];then useradd -s /sbin/nologin nginx
fi if [ -f nginx‐1.8.0.tar.gz ];then tar -xf nginx‐1.8.0.tar.gz
cd nginx‐1.8.0
yum -y install gcc pcre‐devel openssl‐devel zlib‐devel make
./configure ‐‐prefix=/usr/local/nginx ‐‐with‐http_ssl_module
make
make install
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
cd ..
else echo "没有 Nginx 源码包" fi }
install_mysql()
{
yum -y install gcc gcc‐c++ cmake ncurses‐devel perl
id mysql &>/dev/null
if [ $? -ne 0 ];then useradd -s /sbin/nologin mysql
fi if [ -f mysql‐5.6.25.tar.gz ];then tar -xf mysql‐5.6.25.tar.gz
cd mysql‐5.6.25
cmake .
make
make install
/usr/local/mysql/scripts/mysql_install_db ‐‐user=mysql ‐‐datadir=/usr/local/mysql/data/
‐‐basedir=/usr/local/mysql/
chown -R root.mysql /usr/local/mysql
chown -R mysql /usr/local/mysql/data
/bin/cp -f /usr/local/mysql/support‐files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
/bin/cp -f /usr/local/mysql/support‐files/my‐default.cnf /etc/my.cnf
echo "/usr/local/mysql/lib/" >> /etc/ld.so.conf
ldconfig
echo 'PATH=$PATH:/usr/local/mysql/bin/' >> /etc/profile
export PATH
else echo "没有 mysql 源码包" exit fi }
install_php()
{ #安装 php 时没有指定启动哪些模块功能,如果的用户可以根据实际情况自行添加额外功能如‐‐with‐gd 等 yum -y install gcc libxml2‐devel if [ -f mhash‐0.9.9.9.tar.gz ];then tar -xf mhash‐0.9.9.9.tar.gz
cd mhash‐0.9.9.9
./configure
make
make install
cd .. if [ ! ‐f /usr/lib/libmhash.so ];then ln -s /usr/local/lib/libmhash.so /usr/lib/ fi ldconfig else echo "没有 mhash 源码包文件" exit fi if [ -f libmcrypt‐2.5.8.tar.gz ];then tar -xf libmcrypt‐2.5.8.tar.gz
cd libmcrypt‐2.5.8
./configure
make
make install
cd ..
if [ ! -f /usr/lib/libmcrypt.so ];then
ln -s /usr/local/lib/libmcrypt.so /usr/lib/
fi ldconfig else echo "没有 libmcrypt 源码包文件" exit fi if [ -f php‐5.4.24.tar.gz ];then tar -xf php‐5.4.24.tar.gz
cd php‐5.4.24
./configure ‐‐prefix=/usr/local/php5 ‐‐with‐mysql=/usr/local/mysql ‐‐enable‐fpm ‐‐
enable‐mbstring ‐‐with‐mcrypt ‐‐with‐mhash ‐‐with‐config‐file‐path=/usr/local/php5/etc ‐‐with‐
mysqli=/usr/local/mysql/bin/mysql_config
make && make install
/bin/cp -f php.ini‐production /usr/local/php5/etc/php.ini
/bin/cp -f /usr/local/php5/etc/php‐fpm.conf.default /usr/local/php5/etc/php‐fpm.conf
cd .. else echo "没有 php 源码包文件" exit fi
}
while : do menu
choice
case $select in 1)
install_nginx
;;
2)
install_mysql
;;
3)
install_php
;;
4)
exit ;;
*)
echo Sorry!
esac done
8、编写脚本快速克隆 KVM 虚拟机
#!/bin/bash # 编写脚本快速克隆 KVM 虚拟机 # 本脚本针对 RHEL7.2 或 Centos7.2 # 本脚本需要提前准备一个 qcow2 格式的虚拟机模板, # 名称为/var/lib/libvirt/images /.rh7_template 的虚拟机模板 # 该脚本使用 qemu‐img 命令快速创建快照虚拟机 # 脚本使用 sed 修改模板虚拟机的配置文件,将虚拟机名称、UUID、磁盘文件名、MAC 地址 # exit code: # 65 ‐> user input nothing # 66 ‐> user input is not a number # 67 ‐> user input out of range # 68 ‐> vm disk image exists
IMG_DIR=/var/lib/libvirt/images
BASEVM=rh7_template read -p "Enter VM number: " VMNUM if [ $VMNUM -le 9 ];then VMNUM=0$VMNUM fi if [ -z "${VMNUM}" ]; then echo "You must input a number." exit 65 elif [[ ${VMNUM} =~ [a‐z] ]; then echo "You must input a number." exit 66 elif [ ${VMNUM} -lt 1 -o ${VMNUM} -gt 99 ]; then echo "Input out of range" exit 67 fi
NEWVM=rh7_node${VMNUM} if [ -e $IMG_DIR/${NEWVM}.img ]; then echo "File exists." exit 68 fi echo -en "Creating Virtual Machine disk image......t" qemu‐img create -f qcow2 ‐b $IMG_DIR/.${BASEVM}.img $IMG_DIR/${NEWVM}.img &> /dev/null
echo -e "e[32;1m[OK]e[0m" #virsh dumpxml ${BASEVM} > /tmp/myvm.xml cat /var/lib/libvirt/images/.rhel7.xml > /tmp/myvm.xml
sed -i "/<name>${BASEVM}/s/${BASEVM}/${NEWVM}/" /tmp/myvm.xml
sed -i "/uuid/s/<uuid>.*</uuid>/<uuid>$(uuidgen)</uuid>/" /tmp/myvm.xml
sed -i "/${BASEVM}.img/s/${BASEVM}/${NEWVM}/" /tmp/myvm.xml
# 修改 MAC 地址,本例使用的是常量,每位使用该脚本的用户需要根据实际情况修改这些值 # 最好这里可以使用便利,这样更适合于批量操作,可以克隆更多虚拟机 sed -i "/mac /s/a1/0c/" /tmp/myvm.xml
echo -en "Defining new virtual machine......tt" virsh define /tmp/myvm.xml &> /dev/null echo -e "e[32;1m[OK]e[0m"
9、点名器脚本
#!/bin/bash # 编写一个点名器脚本 # 该脚本,需要提前准备一个 user.txt 文件 # 该文件中需要包含所有姓名的信息,一行一个姓名,脚本每次随机显示一个姓名 while : do #统计 user 文件中有多少用户 line=`cat user.txt |wc ‐l`
num=$[RANDOM%line+1]
sed -n "${num}p" user.txt
sleep 0.2
clear done
10、查看有多少远程的 IP 在连接本机
#!/bin/bash # 查看有多少远程的 IP 在连接本机(不管是通过 ssh 还是 web 还是 ftp 都统计) # 使用 netstat ‐atn 可以查看本机所有连接的状态,‐a 查看所有, # -t仅显示 tcp 连接的信息,‐n 数字格式显示 # Local Address(第四列是本机的 IP 和端口信息) # Foreign Address(第五列是远程主机的 IP 和端口信息) # 使用 awk 命令仅显示第 5 列数据,再显示第 1 列 IP 地址的信息 # sort 可以按数字大小排序,最后使用 uniq 将多余重复的删除,并统计重复的次数 netstat -atn | awk '{print $5}' | awk '{print $1}' | sort -nr | uniq -c
11、对 100 以内的所有正整数相加求和(1+2+3+4...+100)
#!/bin/bash # 对 100 以内的所有正整数相加求和(1+2+3+4...+100) #seq 100 可以快速自动生成 100 个整数 sum=0 for i in `seq 100` do sum=$[sum+i] done echo "总和是:$sum"
12、统计 13:30 到 14:30 所有访问 apache 服务器的请求有多少个
#!/bin/bash # 统计 13:30 到 14:30 所有访问 apache 服务器的请求有多少个 # awk 使用‐F 选项指定文件内容的分隔符是/或者: # 条件判断$7:$8 大于等于 13:30,并且要求,$7:$8 小于等于 14:30 # 最后使用 wc ‐l 统计这样的数据有多少行,即多少个 awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"' /var/log/httpd/access_log |wc -l
13、统计 13:30 到 14:30 所有访问本机 Aapche 服务器的远程 IP 地址是什么
#!/bin/bash # 统计 13:30 到 14:30 所有访问本机 Aapche 服务器的远程 IP 地址是什么 # awk 使用‐F 选项指定文件内容的分隔符是/或者: # 条件判断$7:$8 大于等于 13:30,并且要求,$7:$8 小于等于 14:30 # 日志文档内容里面,第 1 列是远程主机的 IP 地址,使用 awk 单独显示第 1 列即可 awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"{print $1}' /var/log/httpd/access_log
14、打印国际象棋棋盘
#!/bin/bash # 打印国际象棋棋盘 # 设置两个变量,i 和 j,一个代表行,一个代表列,国际象棋为 8*8 棋盘 # i=1 是代表准备打印第一行棋盘,第 1 行棋盘有灰色和蓝色间隔输出,总共为 8 列 # i=1,j=1 代表第 1 行的第 1 列;i=2,j=3 代表第 2 行的第 3 列 # 棋盘的规律是 i+j 如果是偶数,就打印蓝色色块,如果是奇数就打印灰色色块 # 使用 echo ‐ne 打印色块,并且打印完成色块后不自动换行,在同一行继续输出其他色块 for i in {1..8} do for j in {1..8}
do sum=$[i+j]
if [ $[sum%2] -eq 0 ];then echo -ne "�33[46m �33[0m" else echo -ne "�33[47m �33[0m" fi done echo done
15、统计每个远程 IP 访问了本机 apache 几次?
#!/bin/bash # 统计每个远程 IP 访问了本机 apache 几次? awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log