我正在创建一个可重复使用的脚本,用于在服务器设置上自动设置新的 SSL。我有几个不同的行需要更新文件路径。
ssl.conf 文件中的默认值如下所示(一个有前导 # 标记):
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
***UPDATED AREA,还需要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
两者都不起作用,因为正则表达式不正确。
最佳答案
问题出在斜杠上。您的变量包含它们,最终命令将有多个正斜杠,这会影响您的原始 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
页面说
The / characters may be uniformly replaced by any other single character within any given s command. The / character (or whatever other character is used in its stead) can appear in the regexp or replacement only if it is preceded by a \ character.
关于用于更新 ssl.conf 中 ssl 证书文件路径的 Bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41837615/