VPN 인증서를 하나의 파일로 결합하고 싶습니다. 다음은 템플릿 파일입니다.
# some unrelated stuff
ca ca.crt
# other unrelated stuff
나는 그 줄을 다음과 같이 바꾸고 싶다 ca ca.crt
:
<ca>
# ca.crt contents
</ca>
나는 다음 스크립트를 시도했습니다.
cat client-template.ovpn |
sed -e 's/ca ca.crt/<ca>\n<\/ca>/' |
sed -e '/<ca>/r ca.crt'
이 스크립트는 제대로 작동하지만 두 개의 다른 파일을 and와 함께 붙여 넣어야 하는데 and 명령을 함께 결합 ca.crt
하는 명령이 있는지 궁금합니다 .s
r
나는 이것을 사용하고 있지만 sed
다른 Unix 도구에 대한 답변은 환영합니다.
답변1
굿 올드와 함께 ed
:
ed -s client-template.ovpn <<\IN
/ca ca.crt/s//<ca>\
<\/ca>/
- r ca.crt
/cert client.crt/s//<cert>\
<\/cert>/
- r client.crt
/key client.key/s//<key>\
<\/key>/
- r client.key
,p
q
IN
이렇게 하면 한 줄이 변경됩니다.
tag tag.extension
도착하다
<tag>
</tag>
그런 다음 ( ) 끝 표시 줄 앞(즉, 교체 후 현재 줄)의 내용을 작성합니다 r
. 실제로 변경 사항을 템플릿 파일에 쓰는 것으로 대체됩니다(또는 변경 사항을 다른 파일에 저장하기 위해). 패턴을 찾을 수 없으면 오류가 발생하므로 주의하세요.tag.extension
-
,p
w
w somefile
ed
이것을 다음과 결합할 수 있습니다(비슷하지만 패턴 공간에서는 작동하지 않습니다. - 이와는 다릅니다) sed
.r
a
a
r
s
sed '
/ca ca.crt/{
s//<ca>/
r ca.crt
a\
</ca>
}
/cert client.crt/{
s//<cert>/
r client.crt
a\
</cert>
}
/key client.key/{
s//<key>/
r client.key
a\
</key>
}
' client-template.ovpn
답변2
sed
CA 파일 이름에 작은따옴표 문자가 포함되어 있지 않다고 가정하고 GNU를 사용하면 다음과 같이 할 수 있습니다.
sed "s|^ca \(.*\)|echo '<ca>'; cat '\1'; echo '</ca>'|e"
답변3
이 문제에 대해서는 sed를 사용하지 않고 이 스레드에서 언급한 방법을 사용합니다.https://serverfault.com/questions/287688/templated-with-linux-in-a-shell-script
아이디어는 bash 자체를 템플릿 언어로 사용하여 템플릿에 파일을 포함하는 등의 작업을 쉽게 수행할 수 있다는 것입니다.
따라서 템플릿은 파일을 생성하기 위해 실행하는 bash 스크립트가 됩니다. 이것을 문제에 적용하면 다음과 같습니다.
make-client.sh:
#!/bin/bash
cat <<-EOF
# some unrelated stuff
<ca>
$(cat ca.crt)
</ca>
<other>
$(cat other.file)
</other>
# other unrelated stuff
EOF
명령줄에서의 사용법:
$ make-client.sh > client.ovpn
답변4
귀하의 질문을 올바르게 이해했다면 r
다음과 같은 D
조합을 사용하는 것이 가능할 것 같습니다.
sed '/^ca ca.crt/ {
r new-content-file
D
}' client-template.ovpn