【问题标题】:Sed to replace a script variable by certificatesed 用证书替换脚本变量
【发布时间】:2021-12-11 20:43:15
【问题描述】:

我想用公共和私有证书替换脚本模板中的变量。

例如,我使用以下命令生成了一个harbor.crt 公共证书和一个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 命令与未转义的变量一起使用?

【问题讨论】:

  • 我认为您需要退后一步,描述您想要实现的什么,而不是如何。首先,将 PEM 编码证书中的一些 base64 数据粘贴到 shell 脚本中是没有意义的;数据不是有效的脚本。如果要将整个文件读入 shell 变量,只需正确引用它,例如MY_CERT_DATA="$(< /file/with/pem_cert.crt)"。如果要将证书数据内联到脚本中,可以使用awk,正常打印不相关的脚本行并粘贴多行变量值:MY_CERT_DATA='-----BEGIN CERTIFICATE----- ... <lines with base64> ...'
  • 您的公共证书和私钥是多行字符串。您希望如何将它们插入到您的模板中?开始双引号之后和结束双引号之前的新行?其他?
  • 我需要将证书写入 shell 脚本,因为它将被共享到另一台服务器。服务器 #1 在服务器 #2 上生成连接到 #1 所需的各种令牌和证书。
  • 如果目标是将这些文件推送到另一台主机......为什么不看看sftp/scp 解决方案?或者,如果您想将这些文件“嵌入”到脚本中,并将所述脚本(sftp/scp?)复制到另一台主机,请考虑通过base64 运行文件并将base64 数据嵌入到脚本中,然后在另一端运行base64 -d 以解密数据并存储在目标文件中;使用base64 数据应该消除大多数(全部?)sed 处理特殊字符和/或试图找到不在数据中的sed 脚本分隔符的麻烦
  • 谢谢@markp-fuso。那成功了。我使用HARBOR_CRT=$(sudo cat /data/harbor.crt | base64 -w 0) 将证书转换为B64 并使用echo $CFG_HARBOR_CRT | base64 --decode 进行解码。您可以发布我会接受的答案:)

标签: bash sed


【解决方案1】:

我怀疑这里缺少信息。为什么要使用sed

对于简单的情况,只需将标记替换为文件读取。

CFG_HARBOR_CRT="$(</data/harbor.crt)"
CFG_HARBOR_KEY="$(</data/harbor.key)"

这可能意味着您需要使用提升的 priv 运行整个脚本,所以我理解您可能不想这样做的原因。

...是否您需要 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

/ 切换为, 以减少倾斜牙签综合症。

将 `...` 切换为 $(...) 提高了灵活性、稳定性、可读性等。

【讨论】:

    【解决方案2】:

    退出 cmets 以获得更好的能见度 ...

    考虑通过base64 运行文件并将结果嵌入到脚本中,然后在另一端运行base64 -d 以解密数据并存储在目标文件中。

    使用base64 编码的数据应该可以消除大部分(全部?)sed 处理特殊字符和/或试图找到不在数据中的sed 脚本分隔符的麻烦。


    OP/Manitoba 的回复评论:

    成功了。我使用HARBOR_CRT=$(sudo cat /data/harbor.crt | base64 -w 0) 将证书转换为B64 并使用echo $CFG_HARBOR_CRT | base64 --decode 进行解码。

    【讨论】:

      猜你喜欢
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 2021-11-20
      • 2017-12-20
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多