1、每周 5 使用 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
#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),两个空白行(两个回车,相当于将整个磁盘分一个区)
#注意: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
19、Shell 脚本对信号的处理,执行脚本后,按键盘 Ctrl+C 无法终止的脚本
#!/bin/bash
#Author:丁丁历险(Jacob)
#使用 trap 命令可以拦截用户通过键盘或 kill 命令发送过来的信号
#使用 kill -l 可以查看 Linux 系统中所有的信号列表,其中 2 代表 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