这些都是脚本片段,适合快速组装成脚本来完成一项任务,注意,如果脚本在win下编辑过,一定要转换为Unix格式的换行符,因换行符的不同会导致脚本执行异常
脚本速查
https://blog.51cto.com/lizhenliang/1929044
常用高效命令
curl 请求的网页乱码问题
1.因编码问题导致乱码
在命令最后加上|iconv -f gb2312 -t utf-8
转换编码就行了(-f输入编码,-t输出编码)。
2.因使用gzip压缩导致乱码
在命令最后加上| gunzip
解压缩就行了。
参考:https://www.cnblogs.com/vijayfly/p/5691730.html
API接口测试
可以加:-s
静默模式;--connect-timeout 30
连接超时30秒;-m 30
等待超时30秒。
1.测试get请求
curl http://www.linuxidc.com/login.cgi?user=test001&password=123456
wget --post-data="user=user1&pass=pass1&submit=Login" http://domain.com/path/page_need_login.php
2.测试post请求
curl -d "user=nickwolfe&password=12345" http://www.linuxidc.com/login.cgi
3.xml格式post请求
curl -X POST -H 'content-type: application/xml' -d @/root/myxmlfile.txt http://172.19.219.xx:8081/csp/faq/actDiaUserInfo.action
4.json格式post请求
curl -X POST -H 'content-type: application/json' -d @/root/myjsonfile.txt http://192.168.129.xx/AntiRushServer/api/ActivityAntiRush
curl -H "Content-type: application/json" -X POST -d '{"phone":"13521389587","password":"test"}' http://domain/apis/users.json
5.webservice(SOAP)请求
curl -H 'Content-Type: text/xml;charset=UTF-8;SOAPAction:""' -d @/root/mysoapfile.xml http://172.18.173.xx:8085/csp-magent-client/madapterservices
参考:
http://blog.csdn.net/russ44/article/details/53308838
http://blog.csdn.net/cws1214/article/details/21440691
检查端口状态启动服务
#!/bin/bash
# 检查端口状态启动服务
phpfile="/www/wwwroot/xxxx"
check_port() {
echo "正在检测端口。。。"
netstat -tlpn | grep "\b$1\b"
}
if check_port 8888
then
echo "端口存在"
DATE_N=`date "+%Y-%m%d %H:%M:%S"`
echo "检测时间:${DATE_N}" >> /var/log/check_port.log #记录日志
exit 1
else
echo "端口不存在,正在启动!"
php $phpfile/server.php start -d
DATE_N=`date "+%Y-%m%d %H:%M:%S"`
echo "启动时间:${DATE_N}" >> /var/log/check_port.log #记录日志
fi
在脚本中sed命令权限问题
sed: couldn't open temporary file /etc/zabbix/zabbix_agentd.d/sedxvcHQu: Permission denied
这种情况是因为sed是先生成临时文件,再mv为目标文件。
所以可以用chown -R zabbix:zabbix /etc/zabbix/zabbix_agentd.d
即可解决。
eval 在sed和awk中引用变量
eval 执行原理是先扫描一遍命令,进行所有的替换,之后再次执行命令.
eval sed -i 's/$oldtime/$fromtime/'
eval "ps aux | awk '/$pid/'"
判断字符串、比较大小
if语句比较大小;常常配合expr一起使用,expr [数字]
可以把数字字符串转换为数值,再比较大小
if [ 1 -ne 1 ];then
...
fi
-eq 是等于
-ne 是不等于
-le 小于等于
-ge 大于等于
-lt 小于
-gt大于
字符串搜索
法一:$? 可以获取上一步grep的结果,管道的也算。
cat 123.txt|grep "sessionId" >/dev/null
# 这里$?获取上一步grep的执行结果,有指定字符串执行结果为0,没有执行结果为1
if [ $? -eq 0 ]; then
echo "找到了指定字符串"
else
echo "找不到指定的字符串"
fi
}
另外几种方法:https://www.cnblogs.com/AndyStudy/p/6064834.html
取得字符串或文件中的数字
grep -Eo '[0-9]+'
sed 's/[^0-9]//g'
awk -F'[^0-9]+' 'NF=NF' 1
判断系统类型、位数
判断系统类型并指定包管理器。
check_sys(){
local checkType=$1
local value=$2
local release=''
local systemPackage=''
if [[ -f /etc/redhat-release ]]; then
release="centos"
systemPackage="yum"
elif grep -Eqi "debian" /etc/issue; then
release="debian"
systemPackage="apt"
elif grep -Eqi "ubuntu" /etc/issue; then
release="ubuntu"
systemPackage="apt"
elif grep -Eqi "centos|red hat|redhat" /etc/issue; then
release="centos"
systemPackage="yum"
elif grep -Eqi "debian|raspbian" /proc/version; then
release="debian"
systemPackage="apt"
elif grep -Eqi "ubuntu" /proc/version; then
release="ubuntu"
systemPackage="apt"
elif grep -Eqi "centos|red hat|redhat" /proc/version; then
release="centos"
systemPackage="yum"
fi
if [[ "${checkType}" == "sysRelease" ]]; then
if [ "${value}" == "${release}" ]; then
return 0
else
return 1
fi
elif [[ "${checkType}" == "packageManager" ]]; then
if [ "${value}" == "${systemPackage}" ]; then
return 0
else
return 1
fi
fi
}
is_64bit(){
if [ `getconf WORD_BIT` = '32' ] && [ `getconf LONG_BIT` = '64' ] ; then
return 0
else
return 1
fi
}
遍历目录所以文件
#! /bin/bash
function read_dir(){
IFS=$(echo -en "\n\b") # 避免有空格的文件名处理不了
for file in `ls $1` #注意此处这是两个反引号,表示运行系统命令
do
if [ -d $1"/"$file ] #注意此处之间一定要加上空格,否则会报错
then
read_dir $1"/"$file
else
echo $1"/"$file #输出文件的相对路径
# 在此处写处理文件逻辑即可
if [ $? -ne 0 ]; then
echo $1"/"$file"\n" >> ./fail.txt
else
echo $1"/"$file" Upload Succeed"
fi
fi
done
}
#读取第一个参数;执行的时候注意不要以“/”结尾:./xxx.sh [目录名称]
read_dir $1
获取IP(内网、公网)
获取内网IP有时候不是很好用,如109开头的公网IP在判断规则^10
时会被匹配到。
get_ip(){
local IP=$( ip addr | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | egrep -v "^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\." | head -n 1 )
[ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipv4.icanhazip.com )
[ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipinfo.io/ip )
echo ${IP}
}
get_ipv6(){
local ipv6=$(wget -qO- -t1 -T2 ipv6.icanhazip.com)
[ -z ${ipv6} ] && return 1 || return 0
}
内核版本判断
version_gt(){
test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" != "$1"
}
check_kernel_version(){
local kernel_version=$(uname -r | cut -d- -f1)
if version_gt ${kernel_version} 3.7.0; then
return 0
else
return 1
fi
}
kvm自动拍摄快照
#!/bin/bash
export PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
# #######################
# Author: LeoLan
# Blog: www.leolan.top
# Data: 201707020
# ENV: Centos 7 KVM
# Script: KVM Auto Snapshot
# #######################
# 脚本加入crontab,每天23点执行一次,0 23 * * * /etc/libvirt/qemu/auto-snapshot.sh
#
###################### 用户设置部分 ###########################
# 填写需要拍摄快照的虚拟机名称,英文逗号隔开,virsh list --all可以查看。
vhost=Test_LVS,LNMP_Test02
###################### 用户设置结束 ###########################
numss=`echo $vhost | awk -F',' '{print NF}'`
for ((i=1;i<=$numss;i++)) do vhostname=`echo $vhost |awk -F "," {'print $'${i}''}`;
virsh snapshot-create-as $vhostname $(date +%Y%m%d)
echo "已创建"$vhostname"的最新快照"$(date +%Y%m%d)
echo "--------------------------------------------------------"
done
# 删除超过7天的快照
olddate=`date -d "$(date +%Y%m%d) -7 day" +%Y%m%d`
# 把字符串时间转换为数字
#oldnum=$(let olddate ${olddate})
oldnum=`expr $olddate`
for ((i=1;i<=$numss;i++)) do
vhostname=`echo $vhost |awk -F "," {'print $'${i}''}`
u=$(virsh snapshot-list ${vhostname} |grep -v "Name" |grep -v "^$"|awk {'print $1'}|wc -l)
for ((l=3;l<=$u;l++)) do
newdate=`virsh snapshot-list ${vhostname} |awk {'print $1'}|awk 'NR=='${l}''`
newnum=`expr $newdate`
if [ $newnum -le $oldnum ];
then
echo "删除"$vhostname"的快照"$newdate
virsh snapshot-delete $vhostname $newdate
echo "--------------------------------------------------------"
else
echo $vhostname "的旧快照" $newdate "还未过期"
echo "--------------------------------------------------------"
fi
done
done
下面是脚本的注释
#!/bin/bash
# 脚本加入crontab,每天23点执行一次,0 23 * * * /etc/libvirt/qemu/auto-snapshot.sh
#
###################### 用户设置部分 ###########################
# 填写需要拍摄快照的虚拟机名称,英文逗号隔开,virsh list --all可以查看。
vhost=Test_LVS,LNMP_Test02
###################### 用户设置结束 ###########################
# 统计虚拟机个数,以便下一步做循环
numss=`echo $vhost | awk -F',' '{print NF}'`
# 循环打印出虚拟机名称,赋值给vhostname,然后以当前时间拍摄快照。
for ((i=1;i<=$numss;i++)) do vhostname=`echo $vhost |awk -F "," {'print $'${i}''}`;
virsh snapshot-create-as $vhostname $(date +%Y%m%d)
echo "已创建"$vhostname"的最新快照"$(date +%Y%m%d)
echo "--------------------------------------------------------"
done
#systime=`expr $(date +%Y%m%d)`
#if [ $newnum -eq $systime ];
#then
# echo $vhostname"的最新快照"$(date +%Y%m%d) "已存在,跳过此快照"
# echo "--------------------------------------------------------"
# else
# virsh snapshot-create-as $vhostname $(date +%Y%m%d)
# echo "已创建"$vhostname"的最新快照"$(date +%Y%m%d)
# echo "--------------------------------------------------------"
#fi
# 列出快照
#for ((i=1;i<=$numss;i++)) do vhostname=`echo $vhost |awk -F "," {'print $'${i}''}`;
# virsh snapshot-list $vhostname
#done
# 删除超过7天的快照
# 计算七天以前的时间,快照是每天创建的,通过比较数字大小删除小于7天的时间的快照。
# date -d"7 days ago" +%Y-%m-%d (这句也可以获取七天前的时间,可以删掉-)
olddate=`date -d "$(date +%Y%m%d) -7 day" +%Y%m%d`
# 把字符串时间转换为数字
#oldnum=$(let olddate ${olddate}) 这种方法有时候不太好用
oldnum=`expr $olddate`
# 有多少个虚拟机就循环多少次
for ((i=1;i<=$numss;i++)) do
# 依次打印虚拟机的名称
vhostname=`echo $vhost |awk -F "," {'print $'${i}''}`
# 统计上一步打印的虚拟机有多少个快照赋值给u,下一步就循环检查,比较,删除。
u=$(virsh snapshot-list ${vhostname} |grep -v "Name" |grep -v "^$"|awk {'print $1'}|wc -l)
# 循环打印快照名,snapshot-list列出的项目最终打印出来第一行是Name(虽然整句运行时看不到这行,但单独运行newdate=...是可以看到的)。
# 第二行是-----分隔符,目前我没想到什么办法过滤掉,就设置l=3为起始值,就能跳过第一、二行。
for ((l=3;l<=$u;l++)) do
newdate=`virsh snapshot-list ${vhostname} |awk {'print $1'}|awk 'NR=='${l}''`
# 把字符串时间转换为数字(这里最好用新变量newnum,旧变量newdate是字符串形式,下面删除快照还需要用。覆盖变量需要再转换回来,所以使用新变量更方便)。
#newnum=$(let newdate ${newdate})
newnum=`expr $newdate`
# 比较两数字的大小(-le是小于或等于,自能用于数字比较;字符串比较只有是否匹配)
if [ $newnum -le $oldnum ];
then
echo "删除"$vhostname"的快照"$newdate
virsh snapshot-delete $vhostname $newdate
echo "--------------------------------------------------------"
else
echo $vhostname "的旧快照" $newdate "还未过期"
echo "--------------------------------------------------------"
fi
done
done
统计脚本、程序执行花费的时间
starttime=`date +'%Y-%m-%d %H:%M:%S'`
#要执行的程序
endtime=`date +'%Y-%m-%d %H:%M:%S'`
start_seconds=$(date --date="$starttime" +%s);
end_seconds=$(date --date="$endtime" +%s);
echo "本次运行时间: "$((end_seconds-start_seconds))"s"
连接MySQL,备份数据库
#!/bin/bash
#
#tidate="date +%Y%m%d"
MYUSER=root
MYPASS="123456"
MYIP="localhost"
MYPORT="3306"
mysqldump jiradb > jiradb_$(date +%Y%m%d).sql -u$MYUSER -p$MYPASS --host=$MYIP --port=$MYPORT
删除N天以前的旧文件
find /volume1/Data/192.168.10.92/ -type f -mtime +6 -exec rm -f {} \;
挂载SMB共享磁盘
mount -t cifs -o username=backup123,password=123456 //192.168.10.115/123 /mnt/123
局域网共享地址要为具体的目录地址,例://192.168.10.115/123 单写主机地址//192.168.10.115这样是不行的。
报错请看:Linux常用命令
tar方式备份系统
tar cvpzf /home/remote_backup/system_backup_$(date +%Y%m%d).tar.gz / --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys --exclude=/home --exclude=/root > /dev/null
crontab计划任务
minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
0 1 4 * * /root/backup_system.sh >/dev/null 2>&1
备份网站、文件到七牛云
qrsync 是一个根据七牛云存储API实现的简易命令行辅助上传同步工具,支持断点续上传,增量同步,它可将用户本地的某目录的文件同步到七牛云存储中,同步或上传几百GB甚至上TB的文件毫无鸭梨。
注意:被同步的文件名和路径必须是utf8编码,非utf8的文件名和路径将会同步失败
qrsync 命令行辅助同步工具下载地址:
Mac OS: http://devtools.qiniu.io/qiniu-devtools-darwin_amd64-current.tar.gz
Linux 64bits: http://devtools.qiniu.io/qiniu-devtools-linux_amd64-current.tar.gz
Linux 32bits: http://devtools.qiniu.io/qiniu-devtools-linux_386-current.tar.gz
Linux ARMv6: http://devtools.qiniu.io/qiniu-devtools-linux_arm-current.tar.gz
Windows 32bits: http://devtools.qiniu.io/qiniu-devtools-windows_386-current.zip
Windows 64bits: http://devtools.qiniu.io/qiniu-devtools-windows_amd64-current.zip
下载解压到你指定的文件夹,建立配置文件,两种文件格式,随便一种都行。
# qrsync.conf 配置文件格式
# 修改 /home/wwwbackup 、Your AK 、Your SK、bucket_name三个参数即可。
{"src":"[/home/wwwbackup]","dest":"qiniu:access_key=[Your AK]&secret_key=[Your SK]&bucket=[bucket_name]&threshold=512000","deletable":0,"debug_level":1}
# conf.json json格式
{
"src": "/home/wwwbackup",
"dest": "qiniu:
access_key=<AccessKey>
&secret_key=<SecretKey>
&bucket=<Bucket>
&key_prefix=<KeyPrefix>
&threshold=<Threshold>",
"deletable": 0,
"debug_level": 1
}
简单说明:
- src表示需要同步的本地目录,比如网站文件打包存放路径:/www/web_backup,或是你网站文件路径:/home/domain/zhangge.net/public_html
- 2个Key:access_key和secret_key,进入七牛账号设置界面可以获取到。
- bucket表示存放备份文件的七牛空间,建议新建一个。
- key_prefix 表示存放在七牛空间的上一级目录名称,比如key_prefix=backup/ 则表示备份文件将存放到目标空间下的backup文件夹中。参数留空则表示存放到改空间的根目录。
- threshold表示文件分块上传的块大小,单位为字节(Byte),可根据你本地的网络带宽来确定。
- deletable 是否同步删除七牛云上的文件,通常设置0,当本地文件删除时并不删除存储在七牛的对应文件。如果你想删除本地文件的同时也删除存储在存储在七牛的文件,则设置为1。
开始同步,可以写到计划任务中,实现定期备份
/root/Backup_sh/qiniuyun/qrsync /root/Backup_sh/qiniuyun/qrsync.conf
参考:
https://zhangge.net/4336.html
https://zhangge.net/4221.html
Shell+Curl网站健康状态检查脚本
参考:https://zhangge.net/4284.html
文中的网址大全是数据事先存在数据库中的,脚本只是取出来分析。
评论区