【问题标题】:How do I append lines in a bash script using sed command?如何使用 sed 命令在 bash 脚本中附加行?
【发布时间】:2016-07-13 10:24:44
【问题描述】:

我的基础架构的问题是 SMTP 服务器 IP 地址是动态的。我使用 Vyatta 防火墙,我正在尝试编写一个脚本,该脚本将每 60 分钟检查一次 SMTP IP,如果 SMTP IP 发生更改,它应该会自动更新防火墙规则(配置)..

#!/bin/bash

SMTP=$(nslookup smtp.sendgrid.net | awk -F': ' 'NR==6 { print $2 }')
SMTP_IP=x.x.x.x

if [ $SMTP != $SMTP_IP ]
then
???
else
echo "GREEN"
fi

我的防火墙规则如下所示:

    rule 979 {
        destination {
            address "Current SMTP IP"
        }
        outbound-interface bond1
        source {
            address 10.x.x.x
        }
        translation {
            address 200.x.x.x
        }
    }

我希望我的脚本根据之前的规则更新防火墙规则。示例:

.
.
.    
rule 978 {
    destination {
        address "NEW SMTP IP"
    }
    outbound-interface bond1
    source {
        address 10.x.x.x
    }
    translation {
        address 200.x.x.x
    }
}

我是一名网络专家,在脚本方面有一些基本知识。有人可以帮助我使用 bash 脚本解决这个问题吗???

【问题讨论】:

  • 到目前为止我没有尝试任何东西..尝试使用 sed 命令但我没有得到想要的结果..

标签: linux bash sed


【解决方案1】:

如果我理解您的问题,您想在“目标”一词下的“地址”行的规则中用一个 IP 地址替换另一个 IP 地址。像这样的:

#! /usr/bin/awk -f

/destination/ { N = NR + 1 }

NR == N && /address/ && index($0, OLD_IP) {
    pos = index($0, OLD_IP)
    print substr($0, 1, pos), NEW_IP
    next
}
{ print }

我们查找带有“destination”的行,并记录下一个行号。在下一行,我们查找“地址”,并查看旧 IP 地址是否出现在那里。如果是,我们使用新的 IP 地址打印修改后的规则。否则只需打印。

调用为

$ awk -v OLD_IP=x.x.x.x -v NEW_IP=${SMTP} -f rules.awk firewall_rules

它应该可以解决问题。

【讨论】:

  • 替换部分工作(新 IP 前有 2 个空格).. 并且规则编号没有改变(从 979 到 978).. 感谢并感谢您的帮助!
猜你喜欢
  • 2017-11-04
  • 2022-12-16
  • 2013-12-07
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多