비밀번호를 암호화하고 "notset"이라는 단어를 암호화된 새 비밀번호로 바꾸려고 합니다. 문제는 openssl이 때때로 두 줄 이상을 포함하는 문자열을 생성한다는 것입니다. 예를 들면 다음과 같습니다.
Salted__▒ہ▒ >▒▒1▒▒▒E
ǣ▒▒▒▒"e=8▒lj▒{`(̣▒e
그래서 sed를 실행하면 실패합니다.
이것은 내가 사용하는 명령입니다:
sed -i 's/PASSWORD=.*/PASSWORD='${P}'/' ${PFILE}
내가 받은 오류는 다음과 같습니다.
sed: -e expression #1, char 49: unterminated `s' command
이 와이어 게이트가 있는 경우 전체 스트링을 교체하는 방법을 아는 사람이 있습니까? 나는 전에 이것을 사용해 보았습니다.
P=`echo ${P} | tr '\n' "\\n"`
그러나 이것은 도움이 되지 않습니다.
답변1
변수는 다음과 같습니다.아니요(대부분의 쉘에서) 임의의 바이너리 값을 포함합니다.
P
다음과 같은 가치를 창출함으로써:
P=$( echo 'mysuperpassword3' |
openssl enc -aes-256-cbc -pbkdf2 -pass pass:'secret')
$var
NUL 바이트, 개행, 확장 및 기타 여러 문제가 발생할 수 있습니다 . 가능한 해결책 중 하나는 값을 base64 인코딩으로 저장하는 것입니다.
P=$( echo 'mysuperpassword3' |
openssl enc -aes-256-cbc -pbkdf2 -base64 -pass pass:'secret')
이렇게 하면 많은 문제를 피할 수 있지만 여전히 변수 확장을 인용해야 합니다.
sed -i 's/PASSWORD=.*/PASSWORD='"${P}"'/' "${PFILE}"