Bash Shell脚本在win10中工作,而不是在Linux上

Bash Shell脚本在win10中工作,而不是在Linux上,bash,shell,Bash,Shell,我使用的是来自的akamai purge脚本,并进行了一点修改,因此文件本身中存在变量。这段代码成功地在win10上运行并清除了对象,但当我在linux上运行它时,它不会清除,它也会在控制台中显示相同的文本。我对shell脚本不太熟悉,知道怎么回事吗 ## Functions ------------------------------------------------------------------ function _get_property { [ "$#" -lt 2 ] &

我使用的是来自的akamai purge脚本,并进行了一点修改,因此文件本身中存在变量。这段代码成功地在win10上运行并清除了对象,但当我在linux上运行它时,它不会清除,它也会在控制台中显示相同的文本。我对shell脚本不太熟悉,知道怎么回事吗

## 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 4.0或更高版本可以使用${AKA_PROPS[network]}之类的关联数组,因此首先要做的是对照Window$上的版本检查Linux上的bash版本

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"