환경 변수의 예기치 않은 태그로 인해 cloud-init에서 구문 오류가 발생합니다.

환경 변수의 예기치 않은 태그로 인해 cloud-init에서 구문 오류가 발생합니다.

환경 변수에 예상치 못한 토큰이 포함되어 있을 때 오류가 발생하지 않도록 하려면 아래 코드에서 어떤 특정 구문을 변경해야 합니까?

암호:

특히 Azure의 RHEL 7 VM에서 실행되는 cloud-init 시작 스크립트는 환경 변수 값을 전달하는 다음 줄을 포함하여 짧은 일련의 특정 명령을 실행하는 동안 루트가 아닌 사용자로 실행되도록 전환해야 합니다 az login.

su - azureuser << EOF
echo "User from whoami is: "
whoami
echo "About to login to az.  "
az login --service-principal -u \"$AZ_CLIENT\" -p \"$AZ_PASS\" --tenant \"$AZ_TENANT\"
EOF

이는 구분 기호 사이에 포함된 명령이 루트가 아닌 지정된 사용자로 실행되도록 su - azureuser << EOF...EOF하기 위해 cloud-init 스크립트에서 사용됩니다 .EOF

실수:

$AZ_PASS발생한 오류는 변수를 채우는 임의의 비밀번호의 일부인 대괄호 표기로 인해 발생한 것으로 보입니다 . 보안상의 이유로 아래 비밀번호를 가짜 비밀번호로 변경했지만 (오류를 설명하기 위해 아래 기호를 유지했습니다.

azure-arm: User from whoami is:
azure-arm: azureuser
azure-arm: About to login to az.
azure-arm: -bash: line 4: syntax error near unexpected token `('
azure-arm: -bash: line 4: `az login --service-principal -u \"client-id-long-string\" -p \"gy75k9([0y6se2v^\" --tenant \"long-tenant-id-string\"'

답변1

이 문서에서는 큰따옴표를 이스케이프 처리할 필요가 없습니다. 사용자가 수행하는 방식으로 쉘은 변수를 확장하고 실행된 쉘은 su이를 문자 그대로 받아들여 -p \"gy75k9([0y6se2v^\"따옴표를 백슬래시로 이스케이프하고 (따옴표 없이 그대로 둡니다.

\백슬래시가 없으면 비밀번호에 , $또는 백틱이 포함되지 않는 한 작동합니다 ". 또는 작은따옴표로 변경하여 비밀번호의 작은따옴표에만 신경쓰면 됩니다.

su - azureuser << EOF
...
az login --service-principal -u '$AZ_CLIENT' -p '$AZ_PASS' --tenant '$AZ_TENANT'
EOF

바라보다다른 스크립트의 내용으로 사용하기 위해 변수를 이스케이프하세요작은따옴표를 포함한 임의의 값 처리에 관한 것입니다.


su또는 변수를 확장하여 셸을 시작합니다. here-doc 구분 기호(또는 $here-doc의 모든 기호)를 인용 하고 su -p환경 변수를 사용하여 과거에 유지해야 합니다 su. 이번에는 내부 쉘이 변수를 확장할 수 있도록 큰따옴표가 필요합니다.

export AZ_CLIENT AZ_PASS AZ_TENANT
su -p - azureuser << 'EOF'
...
az login --service-principal -u "$AZ_CLIENT" -p "$AZ_PASS" --tenant "$AZ_TENANT"
EOF

관련 정보