05—Shell 脚本实战(精华版)

1、每周 使用 tar 命令备份/var/log 下的所有日志文件

 

#vi /root/logbak.sh

#编写备份脚本,备份后的文件名包含日期标签,防止后面的备份将前面的备份数据覆盖

#注意 date 命令需要使用反引号括起来,反引号在键盘<tab>键上面

 

tar -czf log-`date +%Y%m%d`.tar.gz /var/log

 

# crontab -e #编写计划任务,执行备份脚本

00 03 * * 5 /root/logbak.sh

 

扫描二维码关注公众号,回复: 4362480 查看本文章

#0    12   *   *   *   

#分  时   日   月  周  |==============命令行=======================|

 

代表意义 分钟 小时 日期 月份 命令

数字范围 0~59 0~23 1~31 1~12 0~7  *

 

2、实时监控本机内存和硬盘剩余空间,剩余内存小于 500M、根分区剩余空间小于 1000M 时,发送报警邮件给root 管理员

 

#!/bin/bash

#Author:XXX

#提取根分区剩余空间

disk_size=$(df / |awk '/\//{print $4}')

#提取内存剩余空间

mem_size=$(free |awk '/Mem/{print $4}')

while :

do

#注意内存和磁盘提取的空间大小都是以 Kb 为单位,test语法中-a表示逻辑与

if [ $disk_size -le 512000 -a $mem_size -le 1024000 ];then

mail -s Warning root <<EOF

Insufficient resources,资源不足

EOF

fi

Done

 

3、脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,猜小了或猜大了,直至用户猜对脚本结束。

 

#!/bin/bash

#RANDOM 为系统自带的系统变量,值为 0-32767 的随机数

#使用取余算法将随机数变为 1-100 的随机数

num=$[RANDOM%100+1]

#使用 read 提示用户猜数字

#使用 if 判断用户猜数字的大小关系:-eq(等于),-ne(不等于),-gt(大于),-ge(大于等于),-lt(小于),-le(小于等于)

while :

do

read -p "计算机生成了一个 1-100 的随机数,你猜: " cai

if [ $cai -eq $num ];then

echo "恭喜,猜对了"

exit

elif [ $cai -gt $num ];then

echo "Oops,猜大了"

else

echo "Oops,猜小了"

fi

done

 

4编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户不输入账户名,则提示必须输入账户名并退出脚本;如果用户不输入密码,则统一使用默认的 123456 作为默认密码。

 

#!/bin/bash

read -p "请输入用户名: " user

#使用-z 可以判断一个变量是否为空,如果为空,提示用户必须输入账户名,并退出脚本,退出码为 2

#没有输入用户名脚本退出后,使用$?查看的返回码为 2

if [ -z $user ];then

echo "您不需输入账户名"

exit 2

fi

#使用 stty -echo 关闭 shell 的回显功能

#使用 stty echo 打开 shell 的回显功能

stty -echo

read -p "请输入密码: " pass

stty echo

pass=${pass:-123456}

#上面这句不太理解,明明pass=123456即可,知道的伙伴请留言帮我解惑,谢谢!!     

useradd "$user"

echo "$pass" | passwd --stdin "$user"

 

#上述stty的功能可以通过read -s 功能实现

 

5、编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(for 版本)

#!/bin/bash

for i in {1..254}

do

ping -c2 -i0.3 -W1 192.168.4.$i &>/dev/null

if [ $? eq 0 ];then

echo "192.168.4.$i is up"

else

echo "192.168.4.$i is down"

fi

done

#关于ping命令的用法参考:https://blog.csdn.net/xianjie0318/article/details/65444028

 

6、编写脚本,显示进度条。

 

参照:https://www.cnblogs.com/tianyapiaozi/archive/2011/06/11/2513899.html比较详细

 

7、使用死循环实时显示 eth0 网卡发送的数据包流量(熟悉管道符和awk的用法)

 

#!/bin/bash

while :

do

echo '本地网卡 eth0 流量信息如下: '

ifconfig eth0 | grep "RX pack" | awk '{print $5}'

ifconfig eth0 | grep "TX pack" | awk '{print $5}'

sleep 1

done

 

8、使用 user.txt 文件中的人员名单,在计算机中自动创建对应的账户并配置初始密码123456(批量创建用户并配置初始密码)

 

#!/bin/bash

#本脚本执行,需要提前准备一个 user.txt 文件,该文件中包含有若干用户名信息,也可以通过脚本for循环创建一个有规律用户名文件,实现批量创建。

for i in `cat user.txt`

do

useradd $i

echo "123456" | passwd --stdin $i

Done

 

9、编写批量修改扩展名脚本,如批量将 txt 文件修改为 doc 文件。

 

#!/bin/bash

#执行脚本时,需要给脚本添加位置参数

#脚本名 txt doc(可以将 txt 的扩展名修改为 doc

#脚本名 doc jpg(可以将 doc 的扩展名修改为 jpg

for i in "ls *.$1"

do

mv $i ${i%.*}.$2

done

 

10、一键部署 LNMP(源码安装版本) //包的版本根据实际情况而定

 

#!/bin/bash

#Author:丁丁历险(Jacob)

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   //这里根据实际情况添加需要的模块如:--with-gd

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

 

#事实上,前人已经把这个东西做的相当成熟,请参考:https://lnmp.org/

 

11、统计 13:30 到 14:30 所有访问 apache 服务器的请求有多少个

 

#!/bin/bash

#Author:丁丁历险(Jacob)

#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

 

12、自动对磁盘分区、格式化、挂载

 

#!/bin/bash

#Author:丁丁历险(Jacob)

#对虚拟机的 vdb 磁盘进行分区格式化,使用<<将需要的分区指令导入给程序 fdisk

#n(新建分区),p(创建主分区),1(分区编号为 1),两个空白行(两个回车,相当于将整个磁盘分一个区)

#注意:后面的两个回车(空白行)是必须的!

fdisk /dev/vdb << EOF

n

p

1

wq

EOF

#格式化刚刚创建好的分区

mkfs.xfs /dev/vdb1

#创建挂载点目录

if [ -e /data ]; then

exit

fi

mkdir /data

#自动挂载刚刚创建的分区,并设置开机自动挂载该分区

echo '/dev/vdb1 /data xfs defaults 1 2' >> /etc/fstab

mount -a

 

13、自动优化 Linux 内核参数

#参数含义,参考:https://www.cnblogs.com/luchuangao/p/8275760.html

#!/bin/bash

#Author:丁丁历险(Jacob)

#脚本针对 RHEL7

cat >> /usr/lib/sysctl.d/00-system.conf <<EOF

fs.file-max=65535

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_synack_retries = 5

net.ipv4.tcp_syn_retries = 5

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_fin_timeout = 30

#net.ipv4.tcp_keepalive_time = 120

net.ipv4.ip_local_port_range = 1024 65535

kernel.shmall = 2097152

kernel.shmmax = 2147483648

kernel.shmmni = 4096

kernel.sem = 5010 641280 5010 128

net.core.wmem_default=262144

net.core.wmem_max=262144

net.core.rmem_default=4194304

net.core.rmem_max=4194304

net.ipv4.tcp_fin_timeout = 10

net.ipv4.tcp_keepalive_time = 30

net.ipv4.tcp_window_scaling = 0

net.ipv4.tcp_sack = 0

EOF

sysctl p

 

14、切割 Nginx 日志文件(常用)

#mkdir /data/scripts

#vim /data/scripts/nginx_log.sh

 

#!/bin/bash

logs_path="/usr/local/nginx/logs/"

mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log

kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`    //注意反引号

 

# chmod +x /data/scripts/nginx_log.sh

#crontab -e #脚本写完后,将脚本放入计划任务每天执行一次脚本

0 1 * * * /data/scripts/nginx_log.sh

 

15、备份 MySQL 的 shell 脚本(mysqldump 版本)

 

#!/bin/bash

#定义变量 user(数据库用户名),passwd(数据库密码),date(备份的时间标签)

#dbname(需要备份的数据库名称,根据实际需求需要修改该变量的值,默认备份 mysql 数据库)

user=root

passwd=123456

dbname=mysql

date=$(date +%Y%m%d)

#测试备份目录是否存在,不存在则自动创建该目录

[ ! -d /mysqlbackup ] && mkdir /mysqlbackup

#使用 mysqldump 命令备份数据库

mysqldump -u"$user" -p"$passwd" "$dbname" > /mysqlbackup/"$dbname"-${date}.sql

 

16、自动添加防火墙规则,开启某些服务或端口(适用于 RHEL7)

 

#!/bin/bash

#Author:丁丁历险(Jacob)

#设置变量定义需要添加到防火墙规则的服务和端口号

#使用 firewall-cmd --get-services 可以查看 firewall 支持哪些服务

service="nfs http ssh"

port="80 22 8080"

#循环将每个服务添加到防火墙规则中

for i in $service

do

echo "Adding $i service to firewall"

firewall-cmd --add-service=${i}

done

#循环将每个端口添加到防火墙规则中

for i in $port

do

echo "Adding $i Port to firewall"

firewall-cmd --add-port=${i}/tcp

done

#将以上设置的临时防火墙规则,转换为永久有效的规则(确保重启后有效)

firewall-cmd --runtime-to-permanent

 

17、设置 Python 支持自动命令补齐功能

 

#!/bin/bash

#Author:丁丁历险(Jacob)

#Summary:Enable tab complete for python

#Description:

#  Needs import readline and rlcompleter module

#  import readline

#  import rlcompleter

#  help(rlcompleter) display detail: readline.parse_and_bind('tab: complete')

#  man python display detail: PYTHONSTARTUP variable

if [ ! -f /usr/bin/tab.py ];then

cat >> /usr/bin/tab.py <<EOF

import readline

import rlcompleter

readline.parse_and_bind('tab: complete')

EOF

fi

sed -i '$a export PYTHONSTARTUP=/usr/bin/tab.py' /etc/profile

source /etc/profile

 

18显示本机 Linux 系统上所有开放的端口列表(实用)

 

#!/bin/bash

#Author:丁丁历险(Jacob)

#从端口列表中观测有没有没用的端口,有的话可以将该端口对应的服务关闭,防止意外的***可能性

ss -nutlp |awk '{print $1,$5}' |awk -F"[: ]" '{print "协议:"$1,"端口号:"$NF}' |grep "[0-9]" |uniq

 

 19Shell 脚本对信号的处理,执行脚本后,按键盘 Ctrl+C 无法终止的脚本

 

#!/bin/bash

#Author:丁丁历险(Jacob)

#使用 trap 命令可以拦截用户通过键盘或 kill 命令发送过来的信号

#使用 kill -l 可以查看 Linux 系统中所有的信号列表,其中 代表 Ctrl+C

#trap 当发现有用户 ctrl+C 希望终端脚本时,就执行 echo "暂停 10s";sleep 10 这两条命令

#另外用户使用命令:[ kill -2 脚本的 PID ] 也可以中断脚本和 Ctrl+C 一样的效果,都会被 trap 拦截

 

trap 'echo "暂停 10s";sleep 10' 2

while :

do

echo "go go go"

done

 

20、关闭 SELinux

 

#!/bin/bash

sed -i '/^SELINUX/s/=.*/=disabled/' /etc/selinux/config

setenforce 0

 

更多脚本,请自行下载。

https://pan.baidu.com/s/1xLRSWpl8oxluVEGrIxDDEg


猜你喜欢

转载自blog.51cto.com/6854290/2326013