Sed 通过证书替换脚本变量
Sed to replace a script variable by certificate
我想用 public 和私有证书替换脚本模板中的变量。
例如,我使用以下命令生成了 harbor.crt
public 证书和 harbor.key
私钥:
sudo openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout /data/harbor.key -out /data/harbor.crt -subj "/CN=$LOCAL_IP" -addext "subjectAltName=IP:127.0.0.1,IP:$LOCAL_IP"
在模板脚本中,我想用上述文件替换以下变量:
CFG_HARBOR_CRT="CRT" # Harbor registry certificate
CFG_HARBOR_KEY="KEY" # Harbor registry key
为了替换这些值,我试过这样做:
HARBOR_CRT=`sudo cat /data/harbor.crt`
HARBOR_KEY=`sudo cat /data/harbor.key`
sudo sed -i "s/CFG_HARBOR_CRT\=\"[^\"]*\"/CFG_HARBOR_CRT\=\"$HARBOR_CRT\"/g" ./template-script.sh
sudo sed -i "s/CFG_HARBOR_KEY\=\"[^\"]*\"/CFG_HARBOR_KEY\=\"$HARBOR_KEY\"/g" ./template-script.sh
但是两个命令都失败了:sed: -e expression #1, char 70: unterminated
s' 命令`
有没有办法将 sed
命令与未转义的变量一起使用?
我怀疑这里缺少信息。为什么要使用 sed
?
对于简单的情况,只需将标记替换为文件读取即可。
CFG_HARBOR_CRT="$(</data/harbor.crt)"
CFG_HARBOR_KEY="$(</data/harbor.key)"
这可能意味着您需要 运行 提升权限的整个脚本,所以我理解您可能不想这样做的原因。
...do 您需要 root 才能读取这些文件吗?
如果是这样,并且如果您不希望整个脚本 运行 作为 root,也许这样:
$: sed 's,^CFG_HARBOR_CRT="CRT",CFG_HARBOR_CRT="$(sudo cat /data/harbor.crt)",
s,^CFG_HARBOR_KEY="KEY",CFG_HARBOR_KEY="$(sudo cat /data/harbor.key)",' tmpf
CFG_HARBOR_CRT="$(sudo cat /data/harbor.crt)" # Harbor registry certificate
CFG_HARBOR_KEY="$(sudo cat /data/harbor.key)" # Harbor registry key
将 /
切换为 ,
以减少倾斜牙签综合症。
将 `...` 切换为 $(...)
可提高灵活性、稳定性、可读性等
撤出评论以获得更好的知名度...
考虑运行通过base64
获取文件并将结果嵌入到脚本中,然后在另一端运行base64 -d
解密数据并存储在目标文件。
使用 base64
编码数据应该消除大部分(全部?)处理特殊字符的 sed
头痛 and/or 试图找到一个 sed
脚本分隔符不在数据中。
OP/Manitoba的回复评论:
成功了。我使用 HARBOR_CRT=$(sudo cat /data/harbor.crt | base64 -w 0)
将证书转换为 B64,并使用 echo $CFG_HARBOR_CRT | base64 --decode
进行解码。
我想用 public 和私有证书替换脚本模板中的变量。
例如,我使用以下命令生成了 harbor.crt
public 证书和 harbor.key
私钥:
sudo openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout /data/harbor.key -out /data/harbor.crt -subj "/CN=$LOCAL_IP" -addext "subjectAltName=IP:127.0.0.1,IP:$LOCAL_IP"
在模板脚本中,我想用上述文件替换以下变量:
CFG_HARBOR_CRT="CRT" # Harbor registry certificate
CFG_HARBOR_KEY="KEY" # Harbor registry key
为了替换这些值,我试过这样做:
HARBOR_CRT=`sudo cat /data/harbor.crt`
HARBOR_KEY=`sudo cat /data/harbor.key`
sudo sed -i "s/CFG_HARBOR_CRT\=\"[^\"]*\"/CFG_HARBOR_CRT\=\"$HARBOR_CRT\"/g" ./template-script.sh
sudo sed -i "s/CFG_HARBOR_KEY\=\"[^\"]*\"/CFG_HARBOR_KEY\=\"$HARBOR_KEY\"/g" ./template-script.sh
但是两个命令都失败了:sed: -e expression #1, char 70: unterminated
s' 命令`
有没有办法将 sed
命令与未转义的变量一起使用?
我怀疑这里缺少信息。为什么要使用 sed
?
对于简单的情况,只需将标记替换为文件读取即可。
CFG_HARBOR_CRT="$(</data/harbor.crt)"
CFG_HARBOR_KEY="$(</data/harbor.key)"
这可能意味着您需要 运行 提升权限的整个脚本,所以我理解您可能不想这样做的原因。
...do 您需要 root 才能读取这些文件吗?
如果是这样,并且如果您不希望整个脚本 运行 作为 root,也许这样:
$: sed 's,^CFG_HARBOR_CRT="CRT",CFG_HARBOR_CRT="$(sudo cat /data/harbor.crt)",
s,^CFG_HARBOR_KEY="KEY",CFG_HARBOR_KEY="$(sudo cat /data/harbor.key)",' tmpf
CFG_HARBOR_CRT="$(sudo cat /data/harbor.crt)" # Harbor registry certificate
CFG_HARBOR_KEY="$(sudo cat /data/harbor.key)" # Harbor registry key
将 /
切换为 ,
以减少倾斜牙签综合症。
将 `...` 切换为 $(...)
可提高灵活性、稳定性、可读性等
撤出评论以获得更好的知名度...
考虑运行通过base64
获取文件并将结果嵌入到脚本中,然后在另一端运行base64 -d
解密数据并存储在目标文件。
使用 base64
编码数据应该消除大部分(全部?)处理特殊字符的 sed
头痛 and/or 试图找到一个 sed
脚本分隔符不在数据中。
OP/Manitoba的回复评论:
成功了。我使用 HARBOR_CRT=$(sudo cat /data/harbor.crt | base64 -w 0)
将证书转换为 B64,并使用 echo $CFG_HARBOR_CRT | base64 --decode
进行解码。