쉘 스크립트 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.sh
와 get.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'
여기서는 이를 사용하여 jo
JSON 페이로드를 생성하고 비밀번호가 올바르게 인코딩되었는지 확인합니다. 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
코드에 몇 가지 문제가 있습니다.
첫 번째 스크립트에서는
$PW
따옴표 없이 사용하세요. 이는 비밀번호가 공백, 탭 및 개행 문자에서 여러 단어로 분할됨을 의미합니다. 그런 다음 각 단어는 파일 이름 글로빙을 거칩니다. 공백과 파일 이름 와일드카드(예: 및 )가 포함된 비밀번호를 사용하면 문제가*
발생할 수 있습니다 . 변수 와 관련하여 두 번째 스크립트에서도 동일한 문제가 있습니다.[
?
TOKEN
$(echo $variable)
just 대신 in을 사용하는 것은$variable
안티 패턴이며 몇 가지 문제가 있습니다(따옴표가 없는 변수 확장 및echo
백슬래시 이스케이프가 포함된 경우 문자열 내용을 수정할 가능성).앞서 언급했듯이, JSON 문서를 구성하는 방식은 비밀번호에 큰따옴표나 리터럴 탭과 같은 문자가 포함된 경우 문서 형식을 쉽게 깨뜨릴 수 있습니다. 비밀번호를 정확하게 인용해야 합니다. 위의 두 가지 방법을 모두 보여 드렸습니다(편리한
jo
도구와jq
이미 사용하고 있는 유틸리티 사용).jq
기본적으로 JSON으로 인코딩된 문자열이 출력됩니다. 토큰 가져오기를 호출하면jq
큰따옴표 세트가 포함된 JSON 문자열을 얻게 됩니다. ( ) 옵션jq
과 함께 사용하면 토큰을 디코딩된 문자열로 얻을 수 있습니다.-r
--raw-output