기술 승인 테스트를 자동화하기 위한 몇 가지 스크립트를 작성했습니다. 비밀번호를 일반 텍스트로 쓰는 것이 허용되지 않기 때문에 제가 사용하는 스크립트는 여러 변수와 연결되어 있으며 그 중 하나가 비밀번호입니다. 실행하기 전에 password.key=mycryptedpassword
파일에서 해당 행을 가져오고 비밀번호를 해독하여 스크립트에서 사용합니다. 그런 다음 키를 스크립트에서 사용하는 임시 파일의 비밀번호로 바꾸려고 했습니다. 여기서 문제가 발생합니다. 다음 코드를 사용합니다.
sed -i -e 's/$key/$decryptedPassword/g' json.tmp
일반적으로 잘 작동하지만 내가 만난 비밀번호 중 하나는 다음과 같습니다.cl&&TiT8
sed와 linux(저는 기본적으로 redhat에서 ksh 쉘을 사용하고 있습니다)에게 이러한 &&
. 혹시 이렇게 이상한 비밀번호를 사용하는 분들을 만날까봐 걱정되는데 어떻게 대처하면 될까요?
개요: 이것이 바로 제가 한 일입니다: sed -i -e 's/$key/$decryptedPassword/g' json.tmp
. 당시에는 $decryptedPassword = cl&&TiT8
이것이 작동하지 않았습니다.
답변1
sed에서 이 작업을 수행 하면 의 s/regexp/replacement/
문자 &
는 replacement
특별한 의미를 가지며 해당 문자가 나타나면 일치하는 string 으로 확장됩니다 regexp
. 따라서 다음을 사용하여 이스케이프해야 합니다 \
.
sed -i -e 's/$key/cl\&\&TiT8/g' json.tmp
/
또한 and '
및 \
and 도 이스케이프해야 합니다 $key
.$decryptedPassword
sed 명령을 교체하는 방법은 무엇입니까 $key
?$decryptedPassword
답변2
'$key'
나는 판단하지 않을$key
것이다"$key"
.
노력하다
d2=$(echo "$decryptedPassword" | sed -e 's.&.\\\&.g' )
sed -i -e "s/$key/$d2/g" json.tmp
- 제공되지 도 포함되지
$key
도 않음$decryptedPassword
/
교체 모드에서 사용해야 하므로 먼저 any - 를 이것으로 교체
\&
해야 합니다. 또한 및&
를 모두 이스케이프해야 한다는 점을 고려 하여 "\
&
\\\&
내부에"세드둘 다
's.&.\\&.g'
입니다's.&.\\\&.g'
.- with
's.&.\\&.g'
,\
이스케이프 자체, while&
대체&
(sed 대체에 의해) - with
's.&.\\\&.g'
,\
자체적으로 이스케이프하고 '\&'를 대체합니다(sed 대체 없음).