Bash Shell脚本在win10中工作,而不是在Linux上
我使用的是来自的akamai purge脚本,并进行了一点修改,因此文件本身中存在变量。这段代码成功地在win10上运行并清除了对象,但当我在linux上运行它时,它不会清除,它也会在控制台中显示相同的文本。我对shell脚本不太熟悉,知道怎么回事吗Bash Shell脚本在win10中工作,而不是在Linux上,bash,shell,Bash,Shell,我使用的是来自的akamai purge脚本,并进行了一点修改,因此文件本身中存在变量。这段代码成功地在win10上运行并清除了对象,但当我在linux上运行它时,它不会清除,它也会在控制台中显示相同的文本。我对shell脚本不太熟悉,知道怎么回事吗 ## Functions ------------------------------------------------------------------ function _get_property { [ "$#" -lt 2 ] &
## Functions ------------------------------------------------------------------
function _get_property {
[ "$#" -lt 2 ] && return 1
local RC=$1
local PROP=$2
local value=$(cat ${RC} | sed "/^\s*#/d;s/\s*#[^\"']*$//" | grep ${PROP} | tail -n 1 | cut -d '=' -f2- )
if [ -z "${value}" ]; then
return 1
else
echo ${value}
return 0
fi
}
function get_properties {
local file="${1}"
declare -A aka_props
aka_props[client_secret]=$( _get_property "${file}" client_secret )
[ -z "${aka_props[client_secret]}" ] && { >&2 echo "ERROR: Please, set variable client_secret in file ${file}!!!"; exit 1; }
aka_props[client_token]=$( _get_property "${file}" client_token )
[ -z "${aka_props[client_token]}" ] && { >&2 echo "ERROR: Please, set variable client_token in file ${file}!!!"; exit 1; }
aka_props[access_token]=$( _get_property "${file}" access_token )
[ -z "${aka_props[access_token]}" ] && { >&2 echo "ERROR: Please, set variable access_token in file ${file}!!!"; exit 1; }
aka_props[host]=$( _get_property "${file}" host )
[ -z "${aka_props[host]}" ] && { >&2 echo "ERROR: Please, set variable host in file ${file}!!!"; exit 1; }
aka_props[network]=$( _get_property "${file}" network )
[ -z "${aka_props[network]}" ] && aka_props[network]="staging"
aka_props[action]=$( _get_property "${file}" action )
[ -z "${aka_props[action]}" ] && aka_props[network]="invalidate"
aka_props[type]=$( _get_property "${file}" type )
[ -z "${aka_props[type]}" ] && aka_props[network]="type"
declare -p aka_props | cut -d '=' -f2-
return 0
}
declare -A AKA_PROPS
AKA_PROPS[client_secret]=<client_secret>
AKA_PROPS[client_token]=<client_token>
AKA_PROPS[access_token]=<access_token>
AKA_PROPS[host]=<host>
AKA_PROPS[network]="production"
AKA_PROPS[action]="delete"
AKA_PROPS[type]="url"
function mk_nonce {
local s=$1
if [ -z ${s} ]; then s=$( date -u +'%Y%m%dT%H:%M:%S%z' ); fi
echo -n "${s}" | md5sum | cut -d ' ' -f1 | sed 's/.\{4\}/&-/g' | sed 's/.$//'
}
function base64_hmac_sha256 {
[ "$#" -lt 2 ] && return 1
local key=$1
local value=$2
echo -ne "${value}"| openssl sha256 -binary -hmac "${key}" | openssl base64
}
function base64_sha256 {
[ "$#" -lt 1 ] && return 1
local value=$1
echo -ne "${value}" | openssl dgst -binary -sha256 | openssl base64
}
function mk_auth_header {
[ "$#" -lt 3 ] && return 1
local -n aka_props=$1
local timestamp=$2
local nonce=$3
echo -n "EG1-HMAC-SHA256 client_token=${AKA_PROPS[client_token]};access_token=${AKA_PROPS[access_token]};timestamp=${timestamp};nonce=${nonce};"
#echo -n "EG1-HMAC-SHA256 client_token=${aka_props[client_token]};access_token=${aka_props[access_token]};timestamp=${timestamp};nonce=${nonce};"
}
function sign_data {
[ "$#" -lt 2 ] && return 1
local key=$1
local -n data_to_sign=$2
#local data="${data_to_sign[method]}\t${data_to_sign[scheme]}\t${data_to_sign[host]}\t${data_to_sign[request_uri]}\t${data_to_sign[canonical_headers]}\t${data_to_sign[hash_content]}\t${data_to_sign[auth_header]}"
local data="${data_to_sign[method]}\t${data_to_sign[scheme]}\t${data_to_sign[host]}\t${data_to_sign[request_uri]}\t\t${data_to_sign[hash_content]}\t${data_to_sign[auth_header]}"
base64_hmac_sha256 "${key}" "${data}"
}
function mk_body {
local type="${1}"
local objects="${2}"
local domain="${3}"
local arr_objects
local objs
IFS=',' read -r -a arr_objects <<< "${objects}"
for i in ${!arr_objects[@]}
do
local tmp=$( echo ${arr_objects[i]} | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' -e 's,/,\\/,g' )
if [ "${type}" == "cpcode" ]; then
objs="${objs},${tmp}"
else
objs="${objs},\"${tmp}\""
fi
done
objs=$( echo "${objs}" | sed 's/^,//' )
if [ "${type}" == "url" ]; then
echo "{\"hostname\":\"${domain}\",\"objects\":[${objs}]}"
else
echo "{\"objects\":[${objs}]}"
fi
}
## Options --------------------------------------------------------------------
P_NAME=${0##*\/}
#CONF=./.akarc
#[ ! -f ${CONF} ] && CONF=./.akarc
#[ ! -f ${CONF} ] && { >&2 echo "ERROR: configuration file not found (~/.akarc or /etc/.akarc)"; exit 1; }
#declare -A AKA_PROPS=$( get_properties "${CONF}" );
usage() {
cat << EOF
usage: ${P_NAME} [OPTIONS] -o <obj1[,obj2,obj3,...]>
Purge the Akamai cache via CCU REST API v3.
REMARKS
Please create a config file in ~/.akarc or /etc/.akarc
PARAMETERS:
-o | --objects List of objects to purge (with comma separated values)
OPTIONS:
-t | --type Type of objects
Possible values: url, cpcode or tag
Default: ${AKA_PROPS[type]}
-d | --domain Domain site (es. your.domain.com).
To use with type=url
-a | --action The desired action to manage the cache
Possible values: invalidate or delete
Default: ${AKA_PROPS[action]}
-n | --network The network on which you want to invalidate or delete content
Possible values: staging or production
Default: ${AKA_PROPS[network]}
-h | --help Show this message
-v | --version Show version
CONFIG FILE:
In the config file the following values have to been declared:
client_secret = <your client secret>
client_token = <your client token>
access_token = <your access token>
host = <your akamai host>
There is the possibility to set the default values:
network = <staging | production>
action = <invalidate | delete>
type = <url | cpcode | tag>
If no values are declared the default ones are:
network = staging
action = invalidate
type = url
EOF
}
ARGS=$( getopt -o "d:t:o:a:n:hv" -l "domain:,type:,objects:,action:,network:,help,version" -n "$0" -- "$@" )
eval set -- "$ARGS"
VERSION=0.2
NETWORK=${AKA_PROPS[network]}
ACTION=${AKA_PROPS[action]}
TYPE=${AKA_PROPS[type]}
while true; do
case "$1" in
-d | --domain )
DOMAIN=${2}
shift 2
;;
-t | --type )
TYPE=${2}
shift 2
;;
-o | --objects )
OBJECTS=${2}
shift 2
;;
-a | --action )
ACTION=${2}
shift 2
;;
-n | --network )
NETWORK=${2}
shift 2
;;
-h | --help )
usage
exit 0
;;
-v | --version )
echo $0 version: $VERSION
exit 0
;;
-- )
shift
break
;;
* )
>&2 echo "Internal error!"
exit 1
;;
esac
done
## Main -----------------------------------------------------------------------
[ -z "${TYPE}" ] || [ -z "${OBJECTS}" ] && { usage; exit 1; }
[ "${TYPE}" == "url" ] && [ -z "${DOMAIN}" ] && { usage; exit 1; }
[ "${TYPE}" != "url" ] && [ ! -z "${DOMAIN}" ] && { echo "WARNING: type is different of url then -d,--domain will be ignored ..."; }
[ "${TYPE}" != "url" ] && [ "${TYPE}" != "cpcode" ] && [ "${TYPE}" != "tag" ] && { >&2 echo "ERROR: Possible value of OBJECT TYPE is url, cpcode or tag"; exit 1; }
[ "${NETWORK}" != "staging" ] && [ "${NETWORK}" != "production" ] && { >&2 echo "ERROR: Possible value of NETWORK is staging or production"; exit 1; }
[ "${ACTION}" != "invalidate" ] && [ "${ACTION}" != "delete" ] && { >&2 echo "ERROR: Possible value of ACTION is invalidate or delete"; exit 1; }
BODY=$( mk_body "${TYPE}" "${OBJECTS}" "${DOMAIN}" )
[ $(echo -ne "${BODY}" | wc -c ) -gt 131072 ] && { >&2 echo "ERROR: The body size is greater than 131072!!!" exit 1; }
TIMESTAMP=$( date -u +'%Y%m%dT%H:%M:%S%z' )
NONCE=$( mk_nonce ${TIMESTAMP} )
SIGN_KEY=$( base64_hmac_sha256 ${AKA_PROPS[client_secret]} ${TIMESTAMP} )
AUTH_HEADER=$( mk_auth_header AKA_PROPS ${TIMESTAMP} ${NONCE} )
declare -A DATA_TO_SIGN=( [method]="POST"
[scheme]="https"
[host]="${AKA_PROPS[host]}"
[request_uri]="/ccu/v3/${ACTION}/${TYPE}/${NETWORK}"
[hash_content]=$( base64_sha256 "${BODY}" )
[auth_header]=$( mk_auth_header AKA_PROPS ${TIMESTAMP} ${NONCE}) )
SIGNED_DATA=$( sign_data "${SIGN_KEY}" DATA_TO_SIGN )
SIGNED_AUTH_HEADER="Authorization: ${AUTH_HEADER}signature=${SIGNED_DATA}"
H_JSON="Content-Type: application/json"
echo curl -s -H \"Expect:\" \
-H \"User-Agent:${P_NAME}\" \
-H \"Accept:${H_JSON}\" \
-H \"${H_JSON}\" \
-H \"${SIGNED_AUTH_HEADER}\" \
-X POST -d \'${BODY}\' \"${DATA_TO_SIGN[scheme]}://${DATA_TO_SIGN[host]}${DATA_TO_SIGN[request_uri]}\" | bash -x | jq .
exit 0
##函数------------------------------------------------------------------
函数_get_属性{
[“$#”-lt 2]&返回1
本地零售价=$1
本地道具=2美元
局部值=$(cat${RC}sed/^\s*#/d;s/\s*#[^\']*$/“| grep${PROP}tail-n1 | cut-d'='-f2-)
如果[-z“${value}”];则
返回1
其他的
echo${value}
返回0
fi
}
函数get_属性{
本地文件=“${1}”
声明-aka_道具
aka_props[client_secret]=$(_get_属性“${file}”client_secret)
[-z“${aka_props[client_secret]}”]&&&&{>&2 echo”错误:请在文件${file}!!!”中设置变量client_secret;退出1;}
aka_props[client_token]=$(_get_属性“${file}”client_token)
[-z“${aka_-props[client_-token]}”]&&&&{>&2 echo”错误:请在文件${file}!!!”中设置变量client_-token;退出1;}
aka_props[access_token]=$(_get_属性“${file}”access_token)
[-z“${aka_-props[access_-token]}”]&&&&{>&2 echo”错误:请在文件${file}!!!”中设置变量access_-token;退出1;}
aka_props[host]=$(_get_属性“${file}”主机)
[-z“${aka_props[host]}”]&&&&{>&2 echo”错误:请在文件${file}!!!”中设置变量host;退出1;}
aka_props[network]=$(_get_属性“${file}”网络)
[-z“${aka_-props[network]}]”和&aka_-props[network]=“登台”
aka_props[action]=$(_get_属性“${file}”action)
[-z“${aka_-props[action]}”]&&aka_-props[network]=“invalidate”
aka_props[type]=$(_get_属性“${file}”类型)
[-z“${aka_-props[type]}”]&&aka_-props[network]=“type”
声明-p aka|u props | cut-d'='-f2-
返回0
}
声明-AKA_道具
又名道具[客户秘密]=
AKA_道具[客户_令牌]=
AKA_道具[访问_令牌]=
又名道具[主持人]=
AKA_道具[网络]=“制作”
AKA_道具[动作]=“删除”
AKA_PROPS[类型]=“url”
函数mk_nonce{
本地s=$1
如果[-z${s}];那么s=$(日期-u+'%Y%m%dT%H:%m:%s%z');fi
echo-n“${s}”md5sum | cut-d''-f1 | sed's/{4\}/&-/g'| sed's/$/'
}
函数base64_hmac_sha256{
[“$#”-lt 2]&返回1
本地密钥=$1
本地值=$2
echo-ne“${value}”| openssl sha256-binary-hmac“${key}”| openssl base64
}
函数base64_sha256{
[“$#”-lt 1]&返回1
本地值=$1
echo-ne“${value}”| openssl dgst-binary-sha256 | openssl base64
}
函数mk_auth_头{
[“$#”-lt 3]&返回1
本地-n aka_道具=$1
本地时间戳=$2
本地nonce=$3
echo-n“EG1-HMAC-SHA256客户端令牌=${AKA_-PROPS[client_-token]};访问令牌=${AKA_-PROPS[access_-token]};时间戳=${timestamp};nonce=${nonce};”
#echo-n“EG1-HMAC-SHA256客户端令牌=${aka_-props[client_-token]};访问令牌=${aka_-props[access_-token]};时间戳=${timestamp};nonce=${nonce};”
}
函数符号数据{
[“$#”-lt 2]&返回1
本地密钥=$1
本地-n数据到符号=$2
#本地数据=“${data\u to\u sign[method]}\t${data\u to\u sign[scheme]}\t${data\u to\u sign[request\u uri]}\t${data\u to\u sign[canonical\u headers]}\t${data\u to\u sign[hash\u content]}\t${data\u to\u sign[auth\u header]}”
本地数据=“${data\u to\u sign[method]}\t${data\u to\u sign[scheme]}\t${data\u to\u sign[request\u uri]}\t\t${data\u to\u sign[hash\u content]}\t${data\u to\u sign[auth\u header]}”
base64_hmac_sha256“${key}”“${data}”
}
函数mk_体{
本地类型=“${1}”
本地对象=“${2}”
本地域=“${3}”
局部arr_对象
局部对象
IFS=',“read-r-a arr_objects&2 echo”错误:对象类型的可能值为url、cpcode或标记;退出1;}
[“${NETWORK}”!=“staging”]&&&[“${NETWORK}”!=“production”]&&&&{>&2 echo”错误:网络的可能值是staging或production;退出1;}
[“${ACTION}”!=“invalidate”]&&&[“${ACTION}”!=“delete”]&&&&{>&2 echo”错误:操作的可能值为invalidate或delete;退出1;}
BODY=$(mk_BODY“${TYPE}”“${OBJECTS}”“${DOMAIN}”)
[$(echo-ne“${BODY}”wc-c)-gt 131072]&&&{>&2 echo“错误:BODY大小大于131072!!!”退出1;}
时间戳=$(日期-u+“%Y%m%dT%H:%m:%S%z”)
NONCE=$(mk_NONCE${TIMESTAMP})
SIGN_KEY=$(base64_hmac_sha256${AKA_PROPS[client_secret]}${TIMESTAMP})
AUTH_HEADER=$(mk_AUTH_HEADER又名_PROPS${TIMESTAMP}${NONCE})
declare-A DATA_TO_SIGN=([method]=“POST”
[方案]=“https”
[host]=“${AKA_PROPS[host]}”
[请求uri]=“ccu/v3/${ACTION}/${TYPE}/${NETWORK}”
[hash_content]=$(base64_sha256“${BODY}”)
[auth_header]=$(mk_auth_header又名_PROPS${TIMESTAMP}${NONCE}))
有符号的\u数据=$(有符号的\u数据“${sign\u KEY}”数据\u到\u符号)
SIGNED_AUTH_HEADER=“授权:${AUTH_HEADER}签名=${SIGNED_DATA}”
H_JSON=“内容类型:应用程序/JSON”
回声旋度-s-H \“期望值:\”\
-H \“用户代理:${P_NAME}\”\
-H \“接受:${H_JSON}\”\
-H\“${H_JSON}”\
-H \“${已签名的身份验证头}”\
-X POST-d\'${BODY}\“${DATA\u TO_SIGN[scheme]}://${DATA\u TO_SIGN[host]}${DATA\u TO_SIGN[request\u uri]}”bash-X | jq。
出口0
中的
AKA_道具[客户秘密]=
希望您正在用它的实际值替换
,就像在Linux中一样,
是用于重定向的
- 在文件顶部添加一个shebang(
)#!/bin/bash
- 然后运行
dos2unix脚本\u name
- 最后运行脚本
bash --version
GNU bash, version 4.3.42(1)-release (x86_64-suse-linux-gnu)
另一个好方法是在原始sc的第119行之后添加更改
bash --version
GNU bash, version 4.3.42(1)-release (x86_64-suse-linux-gnu)
#declare -A AKA_PROPS=$( get_properties "${CONF}" );
declare -A AKA_PROPS
AKA_PROPS[client_secret]=<client_secret>
AKA_PROPS[client_token]=<client_token>
AKA_PROPS[access_token]=<access_token>
AKA_PROPS[host]=<host>
AKA_PROPS[network]="production"
AKA_PROPS[action]="delete"
AKA_PROPS[type]="url"