아래와 같이 사용자 이름과 비밀번호 매개변수가 포함된 abc.yml 파일이 있습니다. 이러한 매개변수를 Linux 사용자의 env 변수에 저장했지만 응용 프로그램이 abc.yml 파일을 실행할 때 env 변수의 값이 인쇄되지 않습니다. 환경 변수만 인쇄합니다.
abc.yml:
type: MYSQL
host: localhost
port: 3307
username: '${user_mysql}'
password: '${pass_mysql}'
Linux 터미널 환경 변수 확인:
[arc@rnd-2 conn]$ echo ${user_mysql}
root
[arc@rnd-2 conn]$ echo ${pass_mysql}
notmypassword
abc.yml 파일 실행 시 로그:
Caused by: java.sql.SQLInvalidAuthorizationSpecException: (conn=375) Access denied for user '${user_mysql}'@'localhost' (using password: YES)
Current charset is UTF-8. If password has been set using other charset, consider using option 'passwordCharacterEncoding'
답변1
Java(?) 프로그램이 특정 모양을 볼 때 환경 변수를 찾는 방법을 알지 못하면 ${variable}
로컬에서 작동하지 않습니다.
그러나 YAML 파일을 구문 분석하고 변수 값을 바꾼 다음 프로그램에서 처리된 YAML 파일을 사용하도록 할 수 있습니다. 이 문제를 해결하는 데 도움이 되는 도구는 다음과 같습니다.envsubst
답변2
YAML 파일의 변수를 일치시키려는 대신 YAML 인식 도구를 사용하여 최상위 username
및 키 값을 설정할 수 있습니다. password
이것의 장점은 문서에 맞게 값을 인코딩할 수 있다는 것입니다.
아이디어는 YAML 문서를 읽는 소프트웨어와 함께 사용하기 전에 YAML 문서를 적절하게 수정(또는 수정된 복사본을 생성)하는 것입니다.
다음이 사용됩니다yq
Andrey Kislyuk이 제공하는 Python 기반 도구이는 잘 알려진 JSON 프로세서를 둘러싼 래퍼입니다 jq
.
비밀번호는 임의의 문자열을 지원함을 나타내기 위해 리터럴 탭으로 끝납니다. 또한 슬래시와 백슬래시(암호에서 볼 수 있는 문자)도 삽입했습니다.
user_mysql=ruut
pass_mysql='not\/my\/password '
yq -y \
--arg username "$user_mysql" \
--arg password "$pass_mysql" \
'. += $ARGS.named' abc.yml
이것이 작동하기 위해 입력에 키가 존재할 필요는 없지만, 존재하는 경우 해당 값은 명령줄에 전달된 인수에 의해 재정의됩니다.
질문의 입력 문서가 주어지면 다음이 출력됩니다.
type: MYSQL
host: localhost
port: 3307
username: ruut
password: "not\\/my\\/password\t"
"제자리에서" 변경하려면 해당 옵션 이나 옵션 yq
과 함께 사용하세요 .--in-place
-i
당신은 또한 이것을 할 수 있습니다yq
Mike Farah가 제공하는 Go 기반 도구:
user_mysql=ruut
pass_mysql='not\/my\/password '
export user_mysql pass_mysql
yq '.username = strenv(user_mysql) |
.password = strenv(pass_mysql)' abc.yml
이 경우 값을 설정하는 구문이 약간 다릅니다. 환경을 통해 변수를 전달하고 표현식 strenv()
내부의 값을 읽습니다 yq
. 이는 두 변수를 모두 내보내거나 yq
프로세스 환경에서 사용할 수 있도록 해야 함을 의미합니다.
옵션이 제공되면 yq
유틸리티는 "내부" 편집을 수행할 수도 있습니다 -i
.
문제의 문서의 출력을 제공합니다.
type: MYSQL
host: localhost
port: 3307
username: 'ruut'
password: "not\\/my\\/password\t"