用于更新 ssl.conf 中 ssl 证书文件路径的 Bash 脚本

标签 bash apache shell ssl

我正在创建一个可重复使用的脚本,用于在服务器设置上自动设置新的 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/

相关文章:

bash - 将 ssh 输出保存到变量

linux - 从 "w"命令输出中提取正常运行时间值

php - Cron 执行的 Bash 脚本中的 PHP 脚本序列未运行

java - 使用 Apache POI HSLFSlide.draw 时默认的日语字体是什么?

linux - 我的计算引擎 VM 没有从我的存储库中获取更改

linux - 打印文件中不以散列开头的所有行,并按特定列过滤

linux - Bash 行使用文件路径中的通配符检查文件路径是否存在

php - 本地主机在更新到 Maverick/Yosemite OS 后不执行 php 文件

Ubuntu 服务器上的 Apache 2.4.6 : Client denied by server configuration (PHP FPM) [While loading PHP file]

bash - 计算一列中具有特定符号的行数(来自 grep 的结果)?