개행 문자로 sed

개행 문자로 sed

비밀번호를 암호화하고 "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')

$varNUL 바이트, 개행, 확장 및 기타 여러 문제가 발생할 수 있습니다 . 가능한 해결책 중 하나는 값을 base64 인코딩으로 저장하는 것입니다.

P=$( echo 'mysuperpassword3' | 
          openssl enc -aes-256-cbc -pbkdf2 -base64 -pass pass:'secret')

이렇게 하면 많은 문제를 피할 수 있지만 여전히 변수 확장을 인용해야 합니다.

sed -i 's/PASSWORD=.*/PASSWORD='"${P}"'/' "${PFILE}"

관련 정보