服务器运维必备shell脚本
我抓不住风 2019-09-02 09:34:44 自动创建虚拟机
#!/bin/bash
read -p '请输入后端盘路径' BACK_DISK
cd /var/lib/libvirt/images/ #cd到虚拟机磁盘存放目录
qemu-img create -f qcow2 -b $BACK_DISK ${1}.img 20G #创建磁盘镜像;.node_base.qcow2(后端盘)
sed "s,node_base,$1," .node_base.xml > /etc/libvirt/qemu/${1}.xml #创建对应xml文件
virsh define /etc/libvirt/qemu/${1}.xml #定义xml文件
virsh start $1 #启动虚拟机
定期备份/var/log日志文件
#!/bin/bash
tar -zcf log-`date +%Y%m%d`.tar.gz /var/log
系统设定:crontab -e 00 03 * * 5 /root/脚本名
实时监控本机内存和硬盘空间,发送邮件进行警报
#!/bin/bash
while :
do
DISK_SIZE=$(df /|awk '/\//{print $4}') #调用本机可用磁盘空间
MEM_SIZE=$(free|awk '/Mem/{print $4}') #调用本机可用内存
if [ $DISK_SIZE -le 512000 -a $MEM_SIZE -le 1024000 ];then
mail -s '警报' root << EOF
资源不足,请及时充值.
EOF
fi
sleep 1
done
检测主机开机与关机状态
#!/bin/bash
for i in {1..254}
do
ping -c 2 -i 0.3 -W 1 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
实时显示eth0网卡发送与接收的数据包流量
#!/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
使用用户列表文件创建用户且初始密码为123456
#!/bin/bash
#$1为存放用户列表的文件
for i in `cat $1`
do
useradd $i
echo 123456 | passwd --stdin $i &> /dev/null
done
显示连接本机的远程ip
#!/bin/bash
netstat -atn | awk 'NR>2{print $5}' | awk '{print $1}' | sort -rn | uniq -c
统计一定时间段内所有访问Apache服务器的的请求个数
#!/bin/bash
awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"' /var/log/httpd/access_log |wc -l'
统计一定时间段内所有访问Apache服务器的客户端ip
#!/bin/bash
awk -F "[/:]" '$7":"$8>="13:30" && $7":"$8<="14:30"{print $1}' /var/log/httpd/access_log
统计每个远程ip访问了本机Apache几次
#!/bin/bash
awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log
切割Nginx日志文件
#!/bin/bash
logs_path="/usr/local/nginx/logs"
mv ${logs_path}access.log ${logs_path}access_$(date +%Y%m%d).log
lill -USER1 $(cat /usr/local/nginx/logs/nginx.pid)
linux命令行:crontab -e 0 1 * * * /data/scripts/脚本名
检测mysql数据库连接数量
#!/bin/bash
log_file="/var/log/mysql_count.log"
user=root
passwd=123456
while :
do
sleep 2
count=`mysqladmin -u"$user" -p"$passwd" status | awk '{print $4}'`
echo "`date +%Y%m%d` 并发连接数为:${count}." >> $log_file
done
非交互式生成SSH秘钥文件
#!/bin/bash
rm -rf ~/.ssh/id_rsa*
ssh-keygen -t RSA -N '' -f ~/.ssh/id_rsa
循环测试用户名与密码是否正确
#!/bin/bash
for i in {1..3}
do
read -p "请输入用户名" user
read -p "请输入密码" pass
if [ "$user" == 'tom' -a "$pass" == '123456' ];then
echo "登陆成功"
exit
else
echo "请重新输入用户名及密码"
fi
done
echo "登录失败"
列出本机可登陆用户的密码
#!/bin/bash
user=$(awk -F: '/bash$/{print $1}' /etc/passwd)
for i in $user
do
awk -F: -v x=$i '$1==x{print $1,$2}' /etc/shadow
done
统计linux进程相关数量信息
#!/bin/bash
running=0
sleeping=0
stoped=0
zombie=0
#在 proc 目录下所有以数字开始的都是当前计算机正在运行的进程的进程 PID
#每个 PID 编号的目录下记录有该进程相关的信息
for pid in `ls /proc/[1-9]*`
do
procs=$[procs+1]
stat=$(awk '{print $3}' $pid/stat)
#每个 pid 目录下都有一个 stat 文件,该文件的第 3 列是该进程的状态信息
case $stat in
R)
running=$[running+1];;
T)
stoped=$[stoped+1];;
S)
sleeping=$[sleeping+1];;
Z)
zombie=$[zombie+1];;
esac
done
echo "进程统计信息如下"
echo "总进程数量为:$procs"
echo "Running 进程数为:$running"
echo "Stoped 进程数为:$stoped"
echo "Sleeping 进程数为:$sleeping"
echo "Zombie 进程数为:$zombie"
使用脚本开启关闭虚拟机
#!/bin/bash
#脚本通过调用 virsh 命令实现对虚拟机的管理,如果没有该命令,需要安装 libvirt-client 软件包
#$1 是脚本的第 1 个参数,$2 是脚本的第 2 个参数
#第 1 个参数是你希望对虚拟机进行的操作指令,第 2 个参数是虚拟机名称
case $1 in
list)
virsh list --all;;
start)
virsh start $2;;
stop)
virsh destroy $2;;
enable)
virsh autostart $2;;
disable)
virsh autostart --disable $2;;
*)
echo "Usage:$0 list"
echo "Usage:$0 [start|stop|enable|disable] VM_name"
cat << EOF
list 显示虚拟机列表
start 启动虚拟机
stop 关闭虚拟机
enable 设置虚拟机为开机自启
disable 关闭虚拟机开机自启功能
EOF;;
esac
不登录虚拟机,修改其网卡ip地址
#!/bin/bash
#脚本在不登陆虚拟机的情况下,修改虚拟机的 IP 地址信息;在某些环境下,虚拟机没有 IP 或 IP 地址与真实主机不在一个网段;真实主机在没有 virt-manger 图形的情况下,远程连接虚拟机很麻烦.该脚本可以解决类似的问题.
read -p "请输入虚拟机名称:" name
if virsh domstate $name | grep -q running ;then
echo "修改虚拟机网卡数据,需要关闭虚拟机"
virsh destroy $name
fi
mountpoint="/media/virtimage"
[ ! -d $mountpoint ]&& mkdir $mountpoint
guestmount -d $name -i $mountpoint
read -p "请输入需要修改的网卡名称:" dev
read -p "请输入 IP 地址:" addr
#判断原本网卡配置文件中是否有 IP 地址,有,就修改该 IP,没有,就添加一个新的 IP 地址
if grep -q "IPADDR" $mountpoint/etc/sysconfig/network-scripts/ifcfg-$dev ;then
sed -i "/IPADDR/s/=.*/=$addr/" $mountpoint/etc/sysconfig/network-scripts/ifcfg-$dev
else
echo "IPADDR=$addr" >> $mountpoint/etc/sysconfig/network-scripts/ifcfg-$dev
fi
破解虚拟机密码
#!/bin/bash
read -p "请输入虚拟机名称:" name
if virsh domstate $name |grep -q running ;then
echo "破解,需要关闭虚拟机"
virsh destroy $name
fi
mountpoint="/media/virtimage"
[ ! -d $mountpoint ]&& mkdir $mountpoint
guestmount -d $name -i $mountpoint
#将 passwd 中密码占位符号 x 删除,该账户即可实现无密码登陆系统
sed -i "/^root/s/x//" $mountpoint/etc/passwd