cURL POST 중첩 JSON을 cURL GET에 전달

cURL POST 중첩 JSON을 cURL GET에 전달

쉘 스크립트 post.sh에 유효한 POST 요청이 있습니다.

curl -s --location --request POST \
     --header 'Content-Type: application/json'. \
     --data '{"password": "'$(echo $PW)'"}'. \
     https://api-sec.path/managed-vault/login/myuser

다음을 포함하는 json을 반환합니다."auth":{"client_token":"my.token"}

post.sh | jq .auth.client_token"my.token"을 반환합니다.

나는 이것을 독립적으로 작동하는 다른 GET 요청(get.sh)에 전달하고 싶습니다.

TOKEN=$(cat)

curl --location --request GET \
     --header 'X-Vault-Token: '$(echo $TOKEN)''
     https://api-sec.path/managed-secrets/myuser

TOKEN 수동 붙여넣기 작동 방식:get.sh sQ34my./toKeN//z

그러면 내 토큰이 잘못되었음을 나타내는 오류가 반환됩니다.

post.sh | jq .auth.client_token | get.sh

이 파이프 컬 출력을 수정하는 방법은 무엇입니까?

답변1

두 개의 별도 쉘 스크립트 post.shget.sh.

#!/bin/sh

# This is post.sh

curl -s --location --request POST \
     --header 'Content-Type: application/json' \
     --data "$( jo password="$PW" )" \
     'https://api-sec.path/managed-vault/login/myuser'

여기서는 이를 사용하여 joJSON 페이로드를 생성하고 비밀번호가 올바르게 인코딩되었는지 확인합니다. jq그것을 사용하려면 jo명령을 다음으로 바꾸 십시오.

jq --arg password "$PW" -n '{ password: $password }'

쉘 변수를 JSON 문서에 직접 삽입하지 마십시오 PW. 그렇게 하면 코드 삽입 취약점이 발생하고 비밀번호 문자열을 별도로 인코딩해야 합니다.

#!/bin/sh

# This is get.sh

token=$( ./post.sh | jq -r '.auth.client_token' )

curl --location --request GET \
     --header "X-Vault-Token: $token" \
     'https://api-sec.path/managed-secrets/myuser'

스크립트 get.sh는 호출하고 post.sh(현재 디렉터리에 있다고 가정) 응답에서 토큰을 구문 분석하여 token셸 변수에 할당합니다.

get.sh원하는 경우 표준 입력에서 토큰을 읽을 수 있습니다. 다음은 토큰이 한 줄로 전달된다고 가정합니다.

#!/bin/sh

# This is get.sh

if [ -t 0 ]; then
    printf 'Enter token: ' >&2
fi
IFS= read -r token

curl --location --request GET \
     --header "X-Vault-Token: $token" \
     'https://api-sec.path/managed-secrets/myuser'

스크립트의 표준 입력이 터미널에 직접 연결된 경우 스크립트는 토큰을 묻는 메시지를 표시합니다. 그렇지 않으면 메시지가 표시되지 않습니다.

get.sh이 변형을 다음과 같이 부를 수 있습니다 .

./post.sh | jq -r '.auth.client_token' | ./get.sh

코드에 몇 가지 문제가 있습니다.

  1. 첫 번째 스크립트에서는 $PW따옴표 없이 사용하세요. 이는 비밀번호가 공백, 탭 및 개행 문자에서 여러 단어로 분할됨을 의미합니다. 그런 다음 각 단어는 파일 이름 글로빙을 거칩니다. 공백과 파일 이름 와일드카드(예: 및 )가 포함된 비밀번호를 사용하면 문제가 *발생할 수 있습니다 . 변수 와 관련하여 두 번째 스크립트에서도 동일한 문제가 있습니다.[?TOKEN

  2. $(echo $variable)just 대신 in을 사용하는 것은 $variable안티 패턴이며 몇 가지 문제가 있습니다(따옴표가 없는 변수 확장 및 echo백슬래시 이스케이프가 포함된 경우 문자열 내용을 수정할 가능성).

  3. 앞서 언급했듯이, JSON 문서를 구성하는 방식은 비밀번호에 큰따옴표나 리터럴 탭과 같은 문자가 포함된 경우 문서 형식을 쉽게 깨뜨릴 수 있습니다. 비밀번호를 정확하게 인용해야 합니다. 위의 두 가지 방법을 모두 보여 드렸습니다(편리한 jo도구와 jq이미 사용하고 있는 유틸리티 사용).

  4. jq기본적으로 JSON으로 인코딩된 문자열이 출력됩니다. 토큰 가져오기를 호출하면 jq큰따옴표 세트가 포함된 JSON 문자열을 얻게 됩니다. ( ) 옵션 jq과 함께 사용하면 토큰을 디코딩된 문자열로 얻을 수 있습니다.-r--raw-output

관련 정보