Linux shell脚本用来测试公司带签名的接口

脚本用来测试公司带签名的接口,只要给出原始的url即可,脚本会自动对给定的url解码, 然后重新生成app_token 和签名: 贴出脚本前,先退出两个shell小脚本,分别对url encode和decode #/**...

脚本用来测试公司带签名的接口,只要给出原始的url即可,脚本会自动对给定的url解码,

然后重新生成app_token 和签名:


贴出脚本前,先退出两个shell小脚本,分别对url encode和decode

#/****  URL encode

function die () {

  echo >&2 "$@"

  exit 1

}

urlencode() {

    # urlencode <string>

    old_lang=$LANG

    LANG=C

    #LANG=zh_CN.utf8

    old_lc_collate=$LC_COLLATE

    LC_COLLATE=C

    #LC_COLLATE=zh_CN.utf8

    local length="${#1}"

    for (( i = 0; i < length; i++ )); do

        local c="${1:i:1}"

        case $c in

            [a-zA-Z0-9.~_-]) printf "$c" ;;

            *) printf '%%%02X' "'$c" ;;

        esac

    done

    LANG=$old_lang

    LC_COLLATE=$old_lc_collate

}

urlencode "$1"



#/******




###URL decode脚本

urldecode() {

    # urldecode <string>


    local url_encoded="${1//+/ }"

    printf '%b' "${url_encoded//%/\\x}"

}


urldecode "$1"



/**********************************测试带签名的接口脚本******************************************/


#!/bin/bash

#According to url specified url ,then re-gennerating the token and  signture of url

#only for app of taotao ling on testing evirnment

app_id='bcc1cf2e-b376-11e5-921c-fcaa1490ccaf'

private_key='690b98fcb37711e5921cfcaa1490ccaf717130d1b37711e5921cfcaa1490ccaf'

get_TokenAndSign_Url='http://t-appportal.meitianhui.com/openapi/app/login'


##开始之前先判断主要的工具是否安装,没有安装在安装或给与提示

  if test -z `rpm -qa|grep 'jq-'`;then

     echo "jq 工具没有安装,通过yum install -y jq-* 安装"

  exit 3

 fi


   if test -z `rpm -qa|grep '^curl-'`;then

     echo "curl 工具没有安装,通过yum install -y curl-* 安装"

    exit 4

  fi



url=$1



if [ $# -ne 1 ];then

          echo '输入测试URL,URL使用单引号括起来'

  exit 0

 fi


uri=`echo $url|awk -F '?' '{print $1}'`

params=`echo $url|awk -F '?' '{print $2}'`


###url 解码函数

urldecode() {

    # urldecode <string>

    local url_encoded="${1//+/ }"

    printf '%b' "${url_encoded//%/\\x}"

}


params=`urldecode "$params"`



res_code=`http --form POST $get_TokenAndSign_Url app_id=$app_id private_key=$private_key|jq .rsp_code|sed 's/"//g'`

          if [ $res_code != 'succ' ];then

          echo 'response error!'

            exit 1

        fi

app_token=`http --form POST $get_TokenAndSign_Url app_id=$app_id private_key=$private_key|jq .data.app_token|sed 's/"//g'`

security_code=`http --form POST $get_TokenAndSign_Url app_id=$app_id private_key=$private_key|jq .data.security_code|sed 's/"//g'`

#通过awk 把键值对分离出来,然后剔除app_token和sign的键值对,并对剩下的键值对排序,然后通过paste -d '&' -s

#指定分隔符重新连接一行,前面把app_token 剔除掉了,这里通过 awk 的END 功能,把app_token 值附件到最后,

#并参与排序,awk 中使用变量非常麻烦,awk 大括号里面不能使用单引号了,这里先使用双引号,然后单引号,

#最后在套一层双引号

#  sort_str=`echo $params|awk -F '&' '{for(i=1;i<NF;i++) if($i !~ /sign|app_token/)print $i} END {print "'app_token='""'"$app_token"'"}'|sort|paste -d '&' -s`

(上面通过awk分割,awk对{} 有特殊意义,对有大括号的传参会导致问题)


下面提供一种通用的分割方式:

sort_str=$(echo -e ${params//&/\\n}|grep -v sign|sort|paste -d '&' -s)

使用字符串替换方式${params//&/\\n}  使用\n 替换字段串中的&  然后通过echo -e 解析出换成,然后各个传参换行,然后通过sort 排序,最后再通过paste 使用& 拼接

#签名也可以使用|openssl md5 结果也是一样的,不过一定要去掉结尾的$(换行)符号

sign=`echo -n "$sort_str$security_code"|md5sum|awk '{print $1}'`


#new_params=`echo  $params|awk -F '&' '{for(i=1;i<NF;i++) if($i !~ /sign|app_token/)print $i}'|xargs|sed "s/'//g"`


#http --form POST  $new_params app_token=$app_token sign=$sign

curl -d "$sort_str&sign=$sign"  $uri

echo -e "\n"


  • 发表于 2017-11-08 18:59
  • 阅读 ( 67 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
石天
石天

437 篇文章

作家榜 »

  1. shitian 662 文章
  2. 石天 437 文章
  3. 每天惠23 33 文章
  4. 小A 29 文章