这些都是脚本片段,适合快速组装成脚本来完成一项任务,注意,如果脚本在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
文中的网址大全是数据事先存在数据库中的,脚本只是取出来分析。


文章作者: Leo
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LeoLan的小站
Shell 脚本 shell
喜欢就支持一下吧