shell
1、检查Mysql的健康状态
#!/bin/bash
pgrep -x mysqld &> /dev/null
if [ $? -ne 0 ]
then
echo “At time: `date` :MySQL is stop .”>> /日志路径
/etc/init.d/mysqld start
else
echo “MySQL server is running .”
fi
2、Nginx-日志切割
#!/bin/bash
# This script run at 00:00
# The Nginx logs path
year=`date +%Y`
month=`date +%m`
day=`date +%d`
logs_backup_path="/ceshi/shell/logs_backup/$year$month"
logs_path="/var/log/nginx"
logs_access="access"
logs_error="error"
pid_path="/run/nginx.pid"
nginx_pid="ps -ef | grep nginx | grep master |awk '{print $2}'"
[ -d $logs_backup_path ] || mkdir -p $logs_backup_path
date=`date +%Y%m%d`
mv ${logs_path}/${logs_access}.log ${logs_backup_path}/${logs_access}_${date}.log
mv ${logs_path}/${logs_error}.log ${logs_backup_path}/${logs_error}_${date}.log
#kill -USR1 $(cat /run/nginx.pid)
kill -USR1 $(cat /run/nginx.pid)
3、判断/tmp/run目录是否存在,如果不存在就建立,如果存在就删除目录里所有文件
#!/bin/bash
dir=/tmp/run
[ -f $dir ] && mv $dir $dir.bak
[ -d $dir ] && rm -rf $dir/* || mkdir $dir
4、 输入一个文件的绝对路径,判断路径是否存在,而且输出是文件还是目录,如果是字符连接,还得输出是有效的连接还是无效的连接
#!/bin/bash
read -p "Input a path:" path
if [ -L $path -a -e $path ];then
echo "this is effective link"
elif [ -L $path -a ! -e $path ];then
echo "this is not effective link"
elif [ -d $path ];then
echo "this is a director"
elif [ -f $path ];then
echo "this is file"
elif [ -e $path ];then
echo "this is a other type file"
else
echo "the file is not exist"
fi
##5、交互模式要求输入一个ip,然后脚本判断这个IP 对应的主机是否 能ping 通,输出结果类似于:
Server 10.1.1.20 is Down! 最后要求把结果邮件到本地管理员root@localhost和mail01@localhost
方法一:
#!/bin/bash
read -p "输入IP地址:" ip
ping -c 2 $ip > /dev/null 2>&1
if [ $? -eq 0 ];then
echo "Server $ip is OK. " |mail -s 'check server' root@localhost
else
echo "Server $ip is Down!" |mail -s 'check server' root@localhost
fi
方法二:
#!/bin/bash
read -p "Input your ip:" ip
ping -c 1 $ip &>/dev/null
[ $? -eq 0 ] && echo "server $ip is ok"|mail -s "check server" root@localhost || echo "server $ip is down" |mail -s "check server" root@localhost
方法三:
#!/bin/bash
tmpfile=`mktemp`
mailaddr="root@localhost mail@localhost"
read -p "输入IP地址:" ip
ping -c 2 $ip > /dev/null 2>&1
if [ $? -eq 0 ];then
echo "Server $ip is Up! " >> $tmpfile
else
echo "Server $ip is Down!" >> $tmpfile
fi
cat $tmpfile
mail -s "ping server" $mailaddr < $tmpfile
rm -rf $tmpfile
方法四:
#!/bin/bash
rootmail="root@localhost"
tmpfile=`mktemp`
read -p "Input a ip : " ip
ping -c 1 "$ip" &>/dev/null
retval=$?
if [ $retval -eq 0 ];then
echo "Server $ip is up" > $tmpfile
else
echo "Server $ip is down" > $tmpfile
fi
cat $tmpfile
mail -s "ping result" $rootmail < $tmpfile
rm -rf $tmpfile
6、自动搭建NFS服务
#!/bin/bash
#关闭防火墙和selinux
service iptables stop
chkconfig iptables off
setenforce 0 &>/dev/null
echo "########防火墙和selinux已经关闭########"
#测试网络,配置内网yum源
ping -c 1 192.168.1.10 &>/dev/null
if [ $? -eq 0 ];then
echo "########网络ok########"
else
echo "########请检查你的网络########"
exit
fi
wget -P /etc/yum.repos.d/ ftp://192.168.1.10/demo.repo &>/dev/null
#安装相关软件
yum -y install 'nfs*' rpcbind &> /dev/null && echo "########软件安装ok#######"
#发布共享目录并授权
read -p "Input your share dir:" dir
[ ! -d $dir ] && mkdir $dir -p
#授权
chmod 1777 $dir
read -p "Input your share host(192.168.0.0/24(ro)):" host
cat >> /etc/exports << end
$dir $host
end
#启动服务,开机自启动
service rpcbind restart &>/dev/null && echo "##########rpcbind服务启动成功#############"
service nfs restart &>/dev/null && echo "############nfs服务启动成功#############"
chkconfig rpcbind on
chkconfig nfs on
#测试验证
mkdir /u01 &>/dev/null
mount.nfs localhost:$dir /u01
[ $? -eq 0 ] && echo "nfs服务测试ok,可以正常使用!"
umount /u01
7、将/etc/passwd里的用户名分类,分为管理员用户,系统用户,普通用户
分析:
根据用户的uid来判断用户种类 2.用户的信息保存在/etc/passwd文件中,需要在该文件中获取UID 3.根据用户的uid去判断 管理员:root 0 统用户:1-499 ftp apache ... 65534 nfsnobody 普通用户:500-60000
#!/bin/bash
for i in `cat /etc/passwd|cut -d: -f1,3`
do
uid=`echo $i |cut -d: -f2`
name=`echo $i |cut -d: -f1`
[ $uid -eq 0 ] && echo $name >>/tmp/adminuser
[ $uid -gt 0 -a $uid -lt 500 -o $uid -eq 65534 ] && echo $name >>/tmp/systemuser
[ $uid -ge 500 -a $uid -ne 65534 ] && echo $name >>/tmp/normaluser
done
8、写一个倒计时脚本,要求显示离2018年10月1日(国庆节)的凌晨0点,还有多少天,多少时,多少分,多少秒。
分析
该脚本应该是一个死循环,除非当前系统时间等于10月1日的凌晨0点,要退出循环,并且打印国庆快乐 break
计算未来时间(10月1日的凌晨0点)和当前系统时间的时间差 时间单位相同并且以相同的时间为一个基准 需要定义2个变量: 现在时间和未来时间 date命令 -d %
#!/bin/bash
goal=`date +%s -d 20181001`
while true 或者until false
do
now=`date +%s`
if [ $[$goal-$now] -eq 0 ];then
break
fi
day=$[($goal-$now)/86400]
hour=$[($goal-$now)%86400/3600]
minute=$[($goal-$now)%3600/60]
second=$[($goal-$now)%60]
clear
echo "离2018年10月1日还有$day天:$hour时:$minute分:$second秒"
sleep 1
done
echo "国庆节快乐!!!"9、写一个脚本把一个目录内的所有空文件都删除,最后输出删除的文件的个数。
9、写一个脚本把一个目录内的所有空文件都删除,最后输出删除的文件的个数。
分析:
如何判断文件是空文件 -s 判断文件内容为非空;判断空文件则 ! -s eg:[ ! -s file ]
定义一个变量count=0来保存删除文件的个数,掌握四则运算 let count++ . 交互式定义变量让用户自己决定清理哪个目录 /data/logs/ 10个文件 循环次数由目录里的文件个数决定
#!/bin/bash
read -p "输入一个你要删除空文件的目录:" dir
count=0
for i in `find $dir -type f`
do
[ ! -s $i ] && rm -rf $i && let count++ ##-s表示非空
done
echo "删除的个数为:" $count
10、写一个自动检测磁盘使用率的脚本,当磁盘使用空间达到90%以上时,需要发送邮件给相关人员
方法一:
#!/bin/bash
#Name:check_space.sh
#Desc:check disk space
#Path:/root/Desktop/check_space.sh
#Usage:./check_space.sh or /root/Desktop/check_space.sh
#Update:2016.06.11
/bin/df -h > df.txt
use=`cat df.txt|awk '{print $5}'|grep -o '[0-9]\+'`
for i in $use
do
[ $i -ge 90 ] && echo notice disk space:`grep $i df.txt` |mail amy
done
rm -f df.txt
或者
....
use=`cat df.txt|awk '{if(NR>=2) print $5}'|sed -n 's/%//p'`
方法2:
#!/bin/bash
#自动检测磁盘使用率,达到90%以上发送邮件
#/shell05/use.sh
use=`df -h | awk -F'[ %]+' '/\/$/{print $5}'`
log=/tmp/use.log
if [ $use -ge 90 ];then
echo "当前磁盘使用率为$use%">$log
mail -s "磁盘监控报警" root@localhost <$log
fi
11、写一个脚本监控系统内存和交换分区使用情况
方法一:
#!/bin/bash
OIFS=$IFS 初始化默认分隔符
IFS="\n" 定义默认分隔符
file=`free -m|sed -nr '/Mem|Swap/p'|awk '{print $4,$2}'`
mem=`echo $file|head -1`
swap=`echo $file|tail -1`
echo $mem |awk '{if(($1/$2)*100<=50) print "物理内存空间需要留意,剩余"$1"M";else print "物理内存在正常范围"}'
echo $swap |awk '{if(($1/$2)*100<=50) print "交换空间需要留意,剩余"$1"M";else print "交换空间在正常范围"}'
方法二:
#!/bin/bash
#监控系统内存和交换分区使用情况
#/shell05/free.sh
#取当前时间
date >> /tmp/date.txt
#取物理内存free值
echo "Mem-free:`free -m | grep Mem | awk '{print $4}'`M" >> /tmp/mem-free.txt
#取缓冲区free值
echo "buffers/cache-free:`free -m | grep - | awk '{print $4}'`M" >> /tmp/buffers-free.txt
#取Swap区free值
echo "Swap-free:`free -m | grep Swap | awk '{print $4}'`M" >> /tmp/swap-free.txt
#将时间与相关数据重新写入新文件
paste /tmp/date.txt /tmp/mem-free.txt /tmp/buffers-free.txt /tmp/swap-free.txt > /tmp/free.txt
#发送监控邮件
mail -s "内存监控报告" root@localhost < /tmp/free.txt
12、输入一个IP地址,使用脚本判断其合法性:必须符合ip地址规范,第1、4位不能以0开头,不能大于255不能小于0
1. 必须符合ip地址规范,第1、额、4位不能以0开头,不能大于255不能小于0
#!/bin/bash
read -p "请输入IP地址:" IP
#判断所输入的ip地址格式(数字并且是以点分割的4段)
if [[ "$IP" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]];then
ip1=`echo $IP| cut -d. -f1`
ip2=`echo $IP| cut -d. -f2`
ip3=`echo $IP| cut -d. -f3`
ip4=`echo $IP| cut -d. -f4`
else
echo "IP wrong!!!" && exit
fi
#判断所输入的ip第1、4段都不能以0开头;第2、3段可以是0
if [[ "$ip1" =~ ^0 ]] || [[ "$ip4" =~ ^0 ]];then
echo "IP is wrong!" && exit
elif [[ "$ip2" =~ ^0. ]] || [[ "$ip3" =~ ^0. ]];then
echo "IP is wrong!!" && exit
fi
#判断所输入的ip的范围0~255之间
for i in $ip1 $ip2 $ip3 $ip4
do
if [ $i -lt 0 -o $i -ge 255 ];then
echo "ip is not ok" && exit
else
continue
fi
done
#以上条件都不满足则是符合规范的ip
echo "IP is ok!"
13、FTP服务
仅供参考:
#!/bin/bash
ipaddr=`ifconfig eth0|sed -n '2p'|sed -e 's/.*inet addr:\(.*\) Bcast.*/\1/g'`
iptail=`echo $ipaddr|cut -d'.' -f4`
ipremote=192.168.1.10
#修改主机名
hostname server$iptail.uplook.com
sed -i "/HOSTNAME/c\HOSTNAME=server$iptail.uplook.com" /etc/sysconfig/network
echo "$ipaddr server$iptail.itcast.cc" >>/etc/hosts
#关闭防火墙和selinux
service iptables stop
setenforce 0 >/dev/null 2>&1
sed -i '/SELINUX=/c\SELINUX=disabled' /etc/selinux/config
#配置yum源(一般是内网源)
#test network
ping -c 1 $ipremote > /dev/null 2>&1
if [ $? -ne 0 ];then
echo "你的网络不通,请先检查你的网络"
exit 1
else
echo "网络ok."
fi
cat > /etc/yum.repos.d/server.repo << end
[server]
name=server
baseurl=ftp://$ipremote
enabled=1
gpgcheck=0
end
#安装软件
read -p "请输入需要安装的软件,多个用空格隔开:" soft
yum -y install $soft &>/dev/null
#备份配置文件
conf=/etc/vsftpd/vsftpd.conf
\cp $conf $conf.default
#根据需求修改配置文件
sed -ir '/^#|^$/d' $conf
sed -i '/local_enable/c\local_enable=NO' $conf
sed -i '$a anon_upload_enable=YES' $conf
sed -i '$a anon_mkdir_write_enable=YES' $conf
sed -i '$a anon_other_write_enable=YES' $conf
sed -i '$a anon_max_rate=512000' $conf
#启动服务
service vsftpd restart &>/dev/null && echo"vsftpd服务启动成功"
#测试验证
chmod 777 /var/ftp/pub
cp /etc/hosts /var/ftp/pub
#测试下载
cd /tmp
lftp $ipaddr <<end
cd pub
get hosts
exit
end
if [ -f /tmp/hosts ];then
echo "匿名用户下载成功"
rm -f /tmp/hosts
else
echo "匿名用户下载失败"
fi
#测试上传、创建目录、删除目录等
cd /tmp
lftp $ipaddr << end
cd pub
mkdir test1
mkdir test2
put /etc/group
rmdir test2
exit
end
if [ -d /var/ftp/pub/test1 ];then
14、如何将跳板机山上的用户的公钥推送到局域网内可以ping通的所有主机上?
分析:
环境: 1、跳板机上有一个将要推送公钥的用户存在 例如:yunwei 2、检测当前局域网中哪些ip是能ping通哪些是不能ping通的 循环语句并发的去检查 3、在脚本中所有的交互动作都需要用到expect实现 yunwei用户sudo授权: visudo
Allow root to run any commands anywhere
root ALL=(ALL) ALL yunwei ALL=(root) NOPASSWD:ALL,!/sbin/shutdown,!/sbin/init,!/bin/rm -rf /
#!/bin/bash
#检查局域网中哪些ip是可以ping通,并保存到一个文件
ip1=10.1.1
for ((i=1;i<=10;i++))
do
{
ping -c1 $ip1.$i &>/dev/null
[ $? -eq 0 ] && echo "$ip1.$i" >> ip_up.txt
}&
done
wait
#yunwei用户生成一对秘钥(有交互)
[ ! -f ~/.ssh/id_rsa ] && ssh-keygen -P '' -f ~/.ssh/id_rsa
#将yunwe用户的公钥远程拷贝到指定的服务器 100 循环
##判断expect程序是否安装
{
rpm -q expect
[ $? -ne 0 ] && sudo yum -y install expect
while read ip2
do
/usr/bin/expect<<-EOF
spawn ssh-copy-id root@$ip2
expect {
"yes/no" {send "yes\r";exp_continue}
"password:" {send "123\r"}
}
expect eof
EOF
done<ip_up.txt
} &>/dev/null
#测试验证
remote_ip=`tail -1 ip_up.txt`
ssh root@$remote_ip hostname
[ $? -eq 0 ] && echo "公钥推送完毕...."
#!/bin/bash
#push publickey to aap-servers
#将局域网内可以ping通的主机ip保存到一个文件
> ip_up.txt
for i in {2..10}
do
{
ip=10.1.1.$i
ping -c1 $ip &>/dev/null
[ $? -eq 0 ] && echo $ip |tee -a ip_up.txt
}& //并行放到后台运行
done
wait //等待进程结束
#将yunwei用户目录下的公钥推送到可以ping的服务器上
#1. 判断yunwei用户下有没有公钥
[ ! -f ~/.ssh/id_rsa.pub ] && ssh-keygen -P "" -f ~/.ssh/id_rsa
#2.将id_rsa.pub公钥远程推送到指定服务器
#2.1 判断expect程序是否安装,没安装则安装它
{
rpm -q expect
[ $? -ne 0 ] && sudo yum -y install expect
for remote_ip in `cat ip_up.txt`
do
/usr/bin/expect <<-EOF
spawn ssh-copy-id root@$remote_ip
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "123\r" }
}
expect eof
EOF
done
} &>/dev/null
#测试验证
test_ip=`tail -1 ip_up.txt`
ssh root@$test_ip hostname
test $? -eq 0 && echo "公钥推送成功。"
优化后的脚本:
#!/bin/bash
[ ! -f ~/.ssh/id_rsa.pub ] && ssh-keygen -P "" -f ~/.ssh/id_rsa
rpm -q expect
[ $? -ne 0 ] && sudo yum