shell_常规小脚本
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 -y install expect
for i in {130..140}
do
ip=192.168.44.$i
ping -c1 $ip
[ $? -ne 0 ] && continue
echo $ip >>ip_up.txt
/usr/bin/expect <<-EOF
spawn ssh-copy-id root@$ip
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "123456\r" }
}
expect eof
EOF
done
#测试验证
test_ip=`tail -1 ip_up.txt`
ssh root@$test_ip hostname
test $? -eq 0 && echo "公钥推送成功。"
15、写一个脚本,统计web服务的不同连接状态个数
#!/bin/bash
#count_http_80_state
#统计每个状态的个数
declare -A STATE
states=`ss -ant|grep 80|cut -d' ' -f1`
for i in $states
do
let STATE[$i]++
done
#通过遍历数组里的索引和元素打印出来
for j in ${!STATE[@]}
do
echo $j:${STATE[$j]}
done
16、写一个30秒同步一次时间,向服务器10.1.1.250的脚本,如果同步失败,则进行邮件报警,每次失败都报警;同步成功,也进行邮件通知,但是成功100次才通知一次?
ntp-server:10.1.1.250 web-cluster:10.1.1.1 10.1.1.2 10.1.1.3
分析
计划任务时间最小的是分钟,所以不能直接使用crontab完成,那么需要写脚本 脚本每隔30s同步,该脚本是死循环。并且sleep30来控制间隔。
#!/bin/bash
#定义相关变量
ntp-server=10.1.1.250
count=0
until false
do
ntpdate $ntp-server &>/dev/null
if [ $? -ne 0 ];then
echo "系统时间同步失败" |mail -s "check system date" root@localhost
else
let count++
if [ $count -eq 100 ];then
echo "系统时间同步成功100次"|mail -s "check system date" root@localhost && count=0
fi
fi
sleep 30
done
或者
#!/bin/bash
#ntpdate
count=0
ip=10.1.1.1
while true
do
rdate -s $ip &>/dev/null
if [ $? -ne 0 ];then
echo "时间同步失败,请检查..." |mail -s "check system times" root@MissHou.itcast.cc
else
let count++
[ $[$count%100] -eq 0 ] && echo "时间同成功" |mail -s "check system times" root@MissHou.itcast.cc && count=0
fi
sleep 30
done
17、自动搭建apache服务的脚本
要求如下: 1、用户输入web服务器的ip、域名以及数据根目录 2、如果用户不输入则一直提示输入,直到输入为止 3、当访问www.tesst.cc时可以访问到数据根目录里的首页文件“this is test page”
#!/bin/bash
#定义函数实现用户不输入则一直提示输入,直到输入为止
input_fun(){
input_var=''
while [ -z $input_var ]
do
read -p "$1" input_var
done
echo $input_var
}
#调用函数并且获取用户输入web服务器的IP、域名以及数据根目录
IP=`input_fun 请输入你的IP地址:`
name=`input_fun 请输入你的域名:`
dir=`input_fun 请输入你的数据根目录:`
#将ip与主机名输入到/etc/hosts文件里
cat >>
/etc/hosts <<-a
$ip $name
a
#创建数据根目录和首页文件
[ -f $dir ] && mv $dir $dir.bak
[ ! -d $dir ] && mkdir -p $dir
echo "this is $name test page" > $dir/index.httml
#yum安装apache
yum -y install httpd &>/dev/null
#发布虚拟主机
cat
/ettc/httpd/conf/httpd.coonf <<-a
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot $dir
ServerName $name
ErrorLog logs/dummy-host.example.com-error_log
CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>
a
#启动apache
service apache restart &>/dev/null
echo "apache启动成功"
#测试验证
curl http://$name
18、判断一个进程是否存在
#!/bin/bash
read -p "请输入需要判断的进程名(vsftpd):" pid
ps -ef|grep $pid|grep -v 'grep' &>/dev/null
或者
pgrep -l $pid &>/dev/null
[ $? -eq 0 ] && echo "该进程$pid存在" || echo "该进程不存在"
19、12、批量加5个新用户,以u1到u5命名,并统一加一个新组,组名为class,统一改密码为123
#!/bin/bash
#判断class组是否存在
cut -d: -f1 /etc/group|grep -w class &>/dev/null
[ $? -ne 0 ] && groupadd class
#循环增加用户,循环次数5次,for循环,给用户设定密码
for ((i=1;i<=5;i++))
do
useradd u$i -G class
echo 123|passwd --stdin u$i
done
#!/bin/bash
grep -w class /etc/group &>/dev/null
test $? -ne 0 && groupadd class
或者
groupadd class &>/dev/null
for ((i=1;i<=5;i++))
do
useradd -G class u$i && echo 123|passwd --stdin u$i
Done
20、批量新建5个用户stu1-stu5,要求这几个用户的家目录都在rhome:提示需要判断该目录是否存在。
#!/bin/bash
#判断/rhome目录是否存在
[ -f /rhome ] && mv /rhome /rhome.bak
[ ! -d /rhome ] && mkdir /rhome
或者
[ -d /rhome ] || mkdir /rhome
#批量创建用户
for i in {1..5}
do
useradd stu$i -d /rhome/stu$i
echo 123|passwd --stdin stu$i
Done
21、批量创建5个用户,每个用户的密码为一个随机数。
思路:
循环5次创建用户
产生一个密码文件来保存用户的随机密码
从密码文件中取出随机密码赋值给用户
#!/bin/bash
#crate user and set passwd
#产生一个保存用户名和密码的文件
echo user0{1..3}:itcast$[$RANDOM%9000+1000]#@~|tr ' ' '\n'>> user_pass.file
#循环创建5个用户
for ((i=1;i<=5;i++))
do
user=`head -$i user_pass.file|tail -1|cut -d: -f1`
pass=`head -$i user_pass.file|tail -1|cut -d: -f2`
useradd $user
echo $pass|passwd --stdin $user
done
或者
for i in `cat user_pass.file`
do
user=`echo $i|cut -d: -f1`
pass=`echo $i|cut -d: -f2`
useradd $user
echo $pass|passwd --stdin $user
done
#!/bin/bash
#crate user and set passwd
#产生一个保存用户名和密码的文件
echo user0{1..3}:itcast$[$RANDOM%9000+1000]#@~|tr ' ' '\n'|tr ':' ' ' >> user_pass.file
#循环创建5个用户
while read user pass
do
useradd $user
echo $pass|passwd --stdin $user
done < user_pass.file
22、Apache的log的清理
apache日志每天进行轮转:
vim /usr/local/apache2/conf/extar/httpd-vhosts.conf ... ErrorLog "| /usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/error_log-%Y%m%d 86400" CustomLog "| /usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_log-%Y%m%d 86400" common ...
说明:
rotatelogs程序是apache自带的一个日志切割工具。 -l参数表示使用本地系统时间为标准切割,而不是GMT时区时间。
/usr/local/apache2/logs/access_log-%Y%m%d 86400 用来指定日志文件的位置和名称,其中86400用来指定分割时间默认单位为s,也就是24小时;
log-server上搭建rsync: [root@log-server ~]# cat /etc/rsyncd.conf [web1] path = /web1/logs uid = root gid = root read only = false
[web2] path = /web2/logs uid = root gid = root read only = false
echo rsync --daemon >> /etc/rc.local
web服务器上定义清理脚本
#!/bin/bash
#clean log
clean_log(){
remote_log_server=10.1.1.2
server=$1
log_dir=/usr/local/apache2/logs
log_tmp_dir=/tmp/log
host=`ifconfig eth0|sed -n '2p'|awk -F'[ :]+' '{print $4}'`
[ ! -d $log_tmp_dir ] && mkdir -p $log_tmp_dir
cd $log_dir
find ./ -daystart -mtime +3 -exec tar -uf $log_tmp_dir/`echo $host`_$(date +%F).tar {} \;
find ./ -daystart -mtime +3 -delete
cd $log_tmp_dir
rsync -a ./ $remote_log_server::$server && find ./ -daystart -mtime +1 -delete
}
jumper-server:
#!/bin/bash
#jumper-server
#菜单打印
trap '' 1 2 3
menu1(){
cat <<-END
请选择对web1的操作类型:
1. clean_apache_log
2. reload_apache_service
3. test_apache_service
4. remote login
END
}
menu2(){
cat <<-END
欢迎使用Jumper-server,请选择你要操作的主机:
1. DB1-Master
2. DB2-Slave
3. Web1
4. Web2
5. exit
END
}
push_pubkey(){
ip=$1
# 判断公钥文件是否存在,没有则生成公钥
[ ! -f ~/.ssh/id_rsa.pub ] && ssh-keygen -P "" -f ~/.ssh/id_rsa &>/dev/null
# 安装expect程序,与交互式程序对话(自动应答)
sudo rpm -q expect &>/dev/null
test $? -ne 0 && sudo yum -y install expect
#将跳板机上yunwei用户的公钥推送的指定服务器上
/usr/bin/expect<<-EOF
spawn ssh-copy-id -i root@$ip
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "111111\r" }
}
expect eof
EOF
}
while true
do
menu2
#让用户选择相应的操作
read -p "请输入你要操作的主机:" host
case $host in
1)
ssh root@10.1.1.2
;;
2)
ssh root@10.1.1.3
;;
3)
clear
menu1
read -p "请输入你的操作类型:" types
case $types in
1)
ssh root@10.1.1.1 clean_log web1
test $? -eq 0 && echo "日志清理完毕..."
;;
2)
service apache reload
;;
3)
wget http://10.1.1.1 &>/dev/null
test $? -eq 0 && echo "该web服务运行正常..." || echo "该web服务无法访问,请检查..."
;;
4)
ssh root@10.1.1.1
;;
"")
:
;;
esac
;;
5)
exit
;;
*)
clear
echo "输入错误,请重新输入..."
;;
esac
done
23、使用xtrabackup工具对mysql数据库进行增量备份
#!/bin/bash
# Name: xtra_back_mysql.sh
# Desc:该脚本使用xtrabackup工具对mysql数据库进行增量备份,根据自己需求可以自行修改
# Path:课堂笔记目录里
# Usage:./xtra_back_mysql.sh
# Author:MissHou
# Update:2018-08-05
# 备份策略:周3、周5、周日全备,周1,周2,周4,周6增备
#变量定义
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
conf_file=/usr/local/mysql/my.cnf
xtra_full_dir=/mydb3307/back_full
xtra_increment_dir=/mydb3307/back_increment
xtr_full_log=/mydb3307/log/full_$(date +%F).log
xtr_increment_log=/mydb3307/log/increment_$(date +%F).log
#全量备份
full_back()
{
#备份
/usr/bin/innobackupex --user=admin --password=123 $xtra_full_dir &> $xtr_full_log
full_name=$(ls -d $xtra_full_dir/$(date +%F)_*)
echo $full_name > $xtra_full_dir/full.txt
#应用日志
echo "++++++++++++++++++++++++我是分割符++++++++++++++++++++++++++" >> $xtr_full_log
/usr/bin/innobackupex --apply-log --redo-only $full_name &>> $xtr_full_log
}
full_back && find $xtra_full_dir -daystart -type d -mtime +1 -exec rm -rf {} \; 2>/dev/null
24、显示系统使用的以下信息:主机名、IP地址、子网掩码、网关、DNS服务器IP地址信息
#!/bin/bash
IP=`ifconfig eth0 | head -2 | tail -1 | awk '{print $2}' | awk -F":" '{print $2}'`
ZW=` ifconfig eth0 | head -2 | tail -1 | awk '{print $3}' | awk -F":" '{print $2}'`
GW=`route -n | tail -1 | awk '{print $2}'`
HN=`hostname`
DNS=`head -1 /etc/resolv.conf | awk '{print $2}'`
echo '此机IP地址是' $IP
echo '此机子网掩码是' $ZW
echo '此机网关是' $GW
echo '此机主机名是' $HN
echo '此机DNS是' $DNS
25、数据库定时备份
要求
每周日半夜23点半,对数据库服务器上的webdb库做完整备份每备份文件保存到系统的/mysqlbak目录里用系统日期做备份文件名 webdb-YYYY-mm-dd.sql每次完整备份后都生成新的binlog日志把当前所有的binlog日志备份到/mysqlbinlog目录下
#mkdir /mysqlbak
#mkdir /mysqlbinlog
#service mysqld start
cd /shell
#vi webdb.sh
#!/bin/bash
day=`date +%F`
mysqldump -hlocalhost -uroot -p123 webdb > /mysqlbak/webdb-${day}.sql
mysql -hlocalhost -uroot -p -e "flush logs"
tar zcf /mysqlbinlog.tar.gz /var/lib/mysql/mysqld-bin.0*
#chmod +x webdb.sh
#crontab -e
30 23 * * 7 /shell/webdb.sh
26、检查任意一个服务的运行状态
方法1:使用read写脚本
#!/bin/bash
read -p "请输入你的服务名:" service
if [ $service != 'crond' -a $service != 'httpd' -a $service != 'sshd' -a $service != 'mysqld' -a $service != 'vsftpd' ];then
echo "只能够检查'vsftpd,httpd,crond,mysqld,sshd"
exit 5
fi
service $service status &> /dev/null
if [ $? -eq 0 ];thhen
echo "服务在线"
else
service $service start
fi
或
方法2:使用位置变量来写脚本
if [ -z $1 ];then
echo "You mast specify a servername!"
echo "Usage: `basename$0` servername"
exit 2
fi
if [ $1 == "crond" ] || [ $1 == "mysql" ] || [ $1 == "sshd" ] || [ $1 == "httpd" ] || [ $1 == "vsftpd" ];then
service $1 status &> /dev/null
if [ $? -eq 0 ];then
echo "$1 is running"
else
service $1 start
fi
else
echo "Usage:`basename $0` server name"
echo "But only check for vsftpd httpd sshd crond mysqld" && exit2
fi
27、检查mysql主从从结构中从数据库服务器的状态
要求
1)本机的数据库服务是否正在运行
2)能否与主数据库服务器正常通信
3)能否使用授权用户连接数据库服务器
4)本机的slave_IO进程是否处于YES状态 本机的slave_SQL进程是否处于YES状态
#!/bin/bash
netstat -tulnp | grep :3306 > /dev/nullif [ $? -eq 0 ];
thenecho "服务正在运行" elseservice mysqld startfiping -c 3 192.168.1.100 &> /dev/nullif [ $? -eq 0 ];
thenecho "网络连接正常" elseecho "网络连接失败"fimysql -h192.168.1.100 -uroot -p123456 &> /dev/nullif [ $? -eq 0 ];
thenecho "数据库连接成功" elseecho "数据库连接失败"fiIO= mysql -uroot -p123 -e "show slave status\G" | grep Slave_IO_Running | awk '{print $2}' > /dev/nullSQL= mysql -uroot -p123 -e "show slave status\G" | grep Slave_SQL_Running | awk '{print $2}' /dev/nullif [ IO==Yes ] && [ SQL==Yes ];
thenecho “IO and SQL 连接成功”elseecho "IO线程和SQL线程连接失败"fi
28、监控CPU利用率
#!/bin/bash
DATE=$(date +%F" "%H:%M)
IP=$(ifconfig etn0 | awk -F '[ :]+' '/inet /addr/{print $4}') #只支持Centos6
MAIL="example@mail.com"
if ! which vmstat & > /dev/null; then
echo "vmstat command no fond, Please install proces package."
exit 1
fi
US=$(vmstat | awk 'NR==3{print $13}')
SY=$(vmstat | awk 'NR==3{print $14}')
IDLE=$(vmstet |awk 'NR==3{print $15}')
WAIT=$(vmstat | awk 'NR==3{print $16}')
USE=$(($US+$SY))
if [ $USE -ge 50 ]; then
echo "
Date:$DATE
Host:$IP
Prblem: CPU utilization $USE" | mail -s "CPU Monitor" $MAIL
fi
29,写一个脚本,将跳板机上yunwei用户的公钥推送到局域网内可以ping通的所有机器上
#!/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 "公钥推送成功。"
30,统计web服务的不同连接状态个数
#!/bin/bash
#count_http_80_state
#统计每个状态的个数
declare -A state
states=`ss -ant|grep 80|cut -d' ' -f1`
for i in $states
do
let state[$i]++
done
#通过遍历数组里的索引和元素打印出来
for j in ${!state[@]}
do
echo $j:${state[$j]}
done
31,自动搭建apache的脚本
要求:
1、用户输入web服务器的IP、域名以及数据根目录
2、如果用户不输入则一直提示输入,直到输入为止
3、当访问www.test.cc时可以访问到数据根目录里的首页文件“this is test page”
代码:
#!/bin/bash
#定义函数实现用户不输入则一直提示输入,直到输入为止
input_fun(){
input_var='' 用户自己要输入的内容(ip、域名、数据根目录)
while [ -z $input_var ]
do
read -p "$1" input_var
done
echo $input_var
}
#调用函数并且获取用户输入web服务器的IP、域名以及数据根目录
IP=`input_fun 请输入你的IP地址:`
name=`input_fun 请输入你的域名:`
dir=`input_fun 请输入你的数据根目录:`
#将ip与主机名输入到hosts文件里
cat>>/etc/hosts<<EOF
$IP $name
EOF
#创建数据根目录和首页文件
[ -f $dir ] && mv $dir $dir.bak
[ ! -d $dir ] && mkdir -p $dir
echo "this is $name test page" > $dir/index.html
#yum安装apache
yum -y install httpd &>/dev/null
#发布虚拟主机
cat>>/etc/httpd/conf/httpd.conf<<-EOF
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot $dir
ServerName $name
ErrorLog logs/dummy-host.example.com-error_log
CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>
EOF
#启动
service httpd restart &>/dev/null
echo "====apache启动成功====":
#测试验证
curl http://$name
32、apache的日志只保留3天以内的
任务背景
web服务器集群中总共有9台机器,上面部署的是Apache服务。由于业务不断增长,每天每台机器上都会产生大量的访问日志,现需要将每台web服务器上的apache访问日志保留最近3天的,3天以前的日志转储到一台专门的日志服务器上,已做后续分析。如何实现每台服务器上只保留3天以内的日志?
具体要求
每台web服务器的日志对应日志服务器相应的目录里。如:web1——>web1.log(在日志服务器上)
每台web服务器上保留最近3天的访问日志,3天以前的日志每天凌晨5:03分转储到日志服务器
如果脚本转储失败,运维人员需要通过跳板机的菜单选择手动清理日志
33、数据库备份脚本,需求:保存15天,假定我们知道数据库root的密码,要备份的库为discuz本地备份的目录为/bak/mysql
1、备份数据库
mysqldump -uroot -p密码 discuz >/bak/mysql/test.${DATE}.sql
2、只保留15天备份
①在终端命令行创建要备份的脚本 vi delsqlbut15day.sh
脚本内容:
#!/bin/bash
cd /bak/mysql
#保存的天数减1,目前保存15天
oldDate=$(date -d "14 day ago" "+%y%m%d")
#匹配.sql结尾文件
for i in `find . -maxdepth 1 -type f|grep \.sql$`;do
#echo $oldDate (测试输出$i)
#从倒数开始第4个字符匹配6位
if [[ "${i:0-10:6}" < "$oldDate" ]];
then
rm -rf $i &
#echo $i (测试输出$i)
fi
done
②给脚本执行权限
chmod 744 delsqlbut15day.sh
③执行脚本
bash delsqlbut15day.sh & 或者 sh delsqlbut15day.sh & 或者 ./delsqlbut15day.sh &
shell_常规小脚本的更多相关文章
- db2巡检小脚本
写了下db2巡检的一个小脚本,只能做常规检查,减少日常工作量,脚本内容如下: #!/bash/bin echo "物理CPU个数为:"cat /proc/cpuinfo| grep ...
- 第一个Mac shell 小脚本
大多数程序员都喜欢偷懒的,我也不例外.相信好多Android开发的coder 在网络http请求方面,会浪费很多时间在接口调试这里..有时候,自己写了一个小测试,行还好,不行的话,还要跟写后台的哥们一 ...
- 写了一个常规性生成merge 的小脚本
现在使用数据库来写存储过程,动不动参数就会用到xml ,当然罗,优势也很明显,参数相对固定,而且灵活,如果要修改或者什么的,中间接口层也不需要做变化,只需要修改封装的存储过程以及程序传参就ok了. 随 ...
- 周末娱乐一下--------恶搞windows小脚本
下面这是个循环DOS命令,使用了C中的goto语句 echo命令式输出命令 set命令是设置命令 var是变量,初始为0 :continue是一个用于goto的标示. %var%输出变量名,%var% ...
- 用Python实现一个爬取XX大学电费通知的小脚本
内容简要 1分析网站 2简单爬取 3进阶自定义爬取 4保存进数据库 学校基础设施太差,宿舍电量过低提醒虽然贴在楼下,但是作为低头一族,经常忘记看提醒导致宿舍酣战时突然黑屏,为了避免这种尴尬的场景以及强 ...
- 分享一个刷网页PV的python小脚本
下面分享一个小脚本,用来刷网页PV. [root@huanqiu ~]# cat www.py #!/usr/bin/python# coding: UTF-8import webbrowser as ...
- 自动FTP的小脚本
自动FTP的小脚本 使用以下脚本,可以实现自动FTP,将你需要的文件传送到需要的地方,或者将需要的文件从某个地方抓取下来. cd /PATH_YOU_WANT_TO_UPLOAD(DOWNLOAD) ...
- pyhton 查找一个数的所有因子 以及 判断一个数是否是质数 两个小脚本
最近看到一个网站, 欧拉计划.挺好玩,都是一些算法题.这是本站:http://projecteuler.net/problems 这个是中文站:http://pe.spiritzhang.com/ 下 ...
- Unity 屏幕适配小脚本
屏幕适配是可以通过代码实现的,相信给你时间就一定能写出来. 我们公司貌似没有分辨率适配框架通常对应小屏幕的苹果4要额外设置下等等就完了! 屏幕适配框架实现思路: 通过代码获取当前的分辨率 –> ...
随机推荐
- bugku-Web 求getshell
求getshell 上传一个png文件发现提示My name is margin,give me a image file not a php 然后也尝试上传php文件,但是依然不行,这里显然对文件类 ...
- promise核心技术 1 实例对象/函数对象
一个程序员要在看到代码的语法同时判断数据类型 知道语法是基础 基础才能延伸功能 //一行代码 a()[0]() // a() 首先推断出a是一个函数 //a()[0] 判断a函数的返回值是一个数组 ...
- 读取cookie、写进cookie方法
整理 读取cookie.写进cookie方法. //设置cookies中的值 function setCookie(name, value) { var Days = 30; var exp = ne ...
- NOI2019退役记
Day0 时光荏苒,日月如梭.人生中第二次也是最后一次全国赛开始了. 坐6h高铁+1h大巴来到gzez,热死.室友是A类的Gloid和C类的仓鼠,我寝室是为数不多(或许只有1个)的凑齐了ABC三种类别 ...
- MySQL 插入 中文数据乱码解决
问题描述: 1.在命令行中进行插入,没有问题.但是显示存在部分乱码 2.在JDBC中插入成功.中文是直接以“??”形式显示. 通过Navicat客户端查看 与在网页中看到的一一致,说明读取没有问题,问 ...
- hdu1312题解
这道题从名称来看看不出什么. 所以我们先读一下题干 There is a rectangular room, covered with square tiles. Each tile is color ...
- Python之路,Day1 - Python基础1 介绍、基本语法、流程控制
本节内容 1.python介绍 2.发展史 3.python 2.x or python 3.x ? 4.python 安装 5.第一个程序 Hello World 程序 6.变量 7.用户输入 8. ...
- 当我们进行综合和I/O布局后会发生什么QwQ
基于的平台是Vivado 2018.2 本文主要以一个简单的半加器加器(组合逻辑为例)学习vivado的综合,I/O配置的一些内容. 本人小白,记一些自己的理解. 任务: 分析Log文件. 布局I/O ...
- 深入JVM(一)JVM指令手册
本文按照如下思维导图组织 1. 栈和局部变量操作 1.1 将常量压入栈的指令 aconst_null 将null对象引用压入栈iconst_m1 将int类型常量-1压入栈iconst_0 将int类 ...
- [LC] 863. All Nodes Distance K in Binary Tree
We are given a binary tree (with root node root), a target node, and an integer value K. Return a li ...