我正在创建一个可重用的脚本,用于在服务器设置上自动设置新的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
两者都没有工作,因为正则表达式不正确。
答案 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 sed
,man
页面显示
/字符可以由任何给定s命令中的任何其他单个字符统一替换。 /字符(或其他任何字符代替它)只有在前面带有\字符时才会出现在regexp或replacement中。