更新配置中的一行,如果不存在则添加它

时间:2019-10-31 16:52:19

标签: bash apache shell

我需要编写一个bash脚本来检查apache2配置文件,并更新2个设置(如果存在),或者将其添加(如果不存在)。

我的bash技巧并不出色,但是我知道我需要使用grep来尝试查找文件中的行。但是我不确定如何在文件中找到该行,然后在密钥存在的情况下仅更新值部分。

我需要更新的设置是

ServerTokens Prod
ServerSignature Off

/etc/apache2/conf-available/security.conf文件中。

有人能帮忙吗?

1 个答案:

答案 0 :(得分:0)

我刚刚有半个小时的空闲时间,以为我会尝试一下。我已经尝试在整个代码中添加注释,但是如果您不确定,可能要对特定位提出问题。

这依赖于sed的-i选项,我知道并非所有版本的Sed都附带该选项,因此这是一个限制,但应该可以解决。我已经在MacOS Mojave上写了它。

它处理错误的条目,跳过正确的条目,并允许您使用变量轻松地更新文件名和配置选项。还会显示最新状态。

#!/bin/bash -e

# The file on which to perform a "find and replace"
FILE="/etc/apache2/conf-available/security.conf"

# Use grep to find lines containing each required line
CHECK_SERVER_TOKENS=$(grep ^ServerTokens "$FILE")
CHECK_SERVER_SIGNATURE=$(grep ^ServerSignature "$FILE")

# Specify what the good config looks like.  This will be used in the find and replace.
TOKENCONFIG="ServerTokens Prod"
SIGNATURECONFIG="ServerSignature Off"

# If the grep above found no results, add the config in.
if [ -z "$CHECK_SERVER_TOKENS" ]; then
  echo "$TOKENCONFIG" >> "$FILE"
# If the grep above contains a result but it does not match desired config, replace it with desired config.
elif [ "$CHECK_SERVER_TOKENS" != "$TOKENCONFIG" ]; then
  # Use sed to "find and replace" wrong config, with desired config
  sed -i 's/'"$CHECK_SERVER_TOKENS"'/'"$TOKENCONFIG"'/g' "$FILE"
fi

# If the grep above found no results, add the config in
if [ -z "$CHECK_SERVER_SIGNATURE" ]; then
  echo "$SIGNATURECONFIG" >> "$FILE"
# If the grep above contains a result but it does not match desired config, replace it with desired config.
elif [ "$CHECK_SERVER_SIGNATURE" != "$SIGNATURECONFIG" ]; then
  # Use sed to "find and replace" wrong config, with desired config
  sed -i 's/'"$CHECK_SERVER_SIGNATURE"'/'"$SIGNATURECONFIG"'/g' "$FILE"
fi

service apache2 restart