用于在ssl.conf

时间:2017-01-24 19:43:53

标签: bash apache shell ssl

我正在创建一个可重用的脚本,用于在服务器设置上自动设置新的SSL。我有一些不同的行需要更新文件路径。

ssl.conf文件中的默认值如下所示(One具有前导#标记):

SSLCertificateFile /etc/pki/tls/certs/localhost.crt

我需要在bash脚本中动态设置它,最终结果如下:

SSLCertificateFile /etc/pki/tls/certs/example.crt

到目前为止,我从这开始,但我不确定我在做什么。

~/update_ssl_conf.sh

代码:

#!/bin/bash
SSL_CONFIG_PATH="/etc/httpd/conf.d/ssl.conf"

SSL_DEFAULT_CERT_PATH="SSLCertificateFile /etc/pki/tls/certs/localhost.crt"
SSL_CERT_PATH="SSLCertificateFile /etc/pki/tls/certs/example.crt"
sed "s/.*\b$SSL_DEFAULT_CERT_PATH\b.*/$SSL_CERT_PATH/" $SSL_CONFIG_PATH

***更新区域,还需要sed命令来更新以#。

开头的行

ssl.conf文件中的默认值如下所示(具有前导#标记):

#SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt

我需要在bash脚本中动态设置它,最终结果如下:

 SSLCACertificateFile /etc/pki/tls/certs/example-ca-bundle.crt

到目前为止,我从这开始,但我不确定我在做什么。

~/update_ssl_conf.sh

代码:

#!/bin/bash
SSL_CONFIG_PATH="/etc/httpd/conf.d/ssl.conf"

SSL_DEFAULT_CA_CERT_PATH="#SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt" 
SSL_CA_CERT_PATH="SSLCACertificateFile /etc/pki/tls/certs/example-ca-bundle.crt"

我尝试了

的公认解决方案
sed -i "s|.*\b#$SSL_DEFAULT_CA_CERT_PATH\b.*|$SSL_CA_CERT_PATH|" SSL_CONFIG_PATH

sed -i "s|(?s).*(?<!\\w)$SSL_DEFAULT_CA_CERT_PATH(?!\\w).*|$SSL_CA_‌​CERT_PATH|" $SSL_CONFIG_PATH

两者都没有工作,因为正则表达式不正确。

1 个答案:

答案 0 :(得分:1)

问题在于斜杠。您的变量包含它们,最终命令将有多个正斜杠,这会影响sed s / 语法的原始<search>/<replace/语法。只需将sed字词分隔符从/更改为|(或任何其他字符,例如@~)即可将其修改。

sed -i "s|.*\b$SSL_DEFAULT_CERT_PATH\b.*|$SSL_CERT_PATH|" file

应解决您的问题,并使用-i标记进行就地替换,然后执行-i.bak<filename>.bak

格式保存文件备份

GNU sedman页面显示

  

/字符可以由任何给定s命令中的任何其他单个字符统一替换。   /字符(或其他任何字符代替它)只有在前面带有\字符时才会出现在regexp或replacement中。