我正在寻找一个命令,允许我在 dhcpd.conf 文件中插入主机,而无需手动触摸该文件。
我正在使用:CentOS 版本 5.3。
该文件如下所示:
subnet 97.129.0.0 netmask 255.255.240.0 {
deny unknown-clients;
range 97.129.2.2 97.129.2.254;
group {
filename "3M-1M-OKS2016NOV.cm";
host client1 {
hardware ethernet 00:04:0d:0c:0f:0a;
}
host client2 {
hardware ethernet a0:be:cd:ea:1d:14;
}
###Block I wanto to insert
host client_i_want_to_insert {
hardware ethernet e3:ee:ed:ea:1d:e4;
}
###########
}}
答案1
为了回答您的特定字符串处理问题:
您可以使用
sed
插入行前文件中间的字符串,适合您的用例。因此,假设您的文件是:
子网 97.129.0.0 网络掩码 255.255.240.0 { 拒绝未知客户端;范围 97.129.2.2 97.129.2.254;组{ 文件名“3M-1M-OKS2016NOV.cm”;主机 client1 { 硬件以太网 00:04:0d:0c:0f:0a; } 主机 client2 { 硬件以太网 a0:be:cd:ea:1d:14; } #### }}
你可以做:
sed -i '/####/i\ \thost client_i_want_to_insert {\n\硬件以太网 e3:ee:ed:ea:1d:e4;\n\t}\n' /etc/dhcp/dhcpd.conf
然而,过去我也管理过几个 ISP 电缆调制解调器(我清楚地认识到该行filename "3M-1M-OKS2016NOV.cm";
是提供电缆调制解调器配置文件)。
我有几条建议要补充:
- Having a host definition spanning several lines is not practical. Over time the DHCP file will become unwieldy. For scripting it is
插入或删除线条都更加困难。我建议只在一行上执行此操作,如下所示:
host client2 { hardware ethernet a0:be:cd:ea:1d:14; }
- The names of hostnames also have to be unique. Either you increment them, or use your customer code *if* a numeric code.
- an alternative, when incrementing the host part, is putting a comment with the customer code *after* the host definition. As an
额外的好处是,如果您需要手动修复某些配置错误或进行一些快速干预,则处理文件会更容易。
host client2 { hardware ethernet a0:be:cd:ea:1d:14; } #_cus234XP_
因此,在删除客户时,当您处理单行文字时,您只需要一个grep -v
或sed
。
此外,ISC DHCP 还允许您include
创建文件。为了不必在配置文件的中间插入行,您可以执行以下操作:
subnet 97.129.0.0 netmask 255.255.240.0 {
deny unknown-clients;
range 97.129.2.2 97.129.2.254;
group {
filename "3M-1M-OKS2016NOV.cm";
include "customers";
}}
然后客户文件应该是这样的:
host client1 { hardware ethernet 00:04:0d:0c:0f:0a; } #_cus234XP_
host client2 { hardware ethernet a0:be:cd:ea:1d:14; } #_cus235XZ_
因此,您只需将新的 CM/customers 附加到文件末尾,而无需处理sed
/ awk
,至少在添加新客户时是这样。
此外,我建议考虑其他可能的解决方案来为 CM 调制解调器/客户实施 DHCP 配置。
过去,我编写用于处理 ISC DHCP 文本文件的配置软件已有几年时间。该过程有一些限制:
- Each time a new item is removed/inserted, the service has to be restarted;
- If by chance you duplicate an host, the service won't restart;
- Any kind of parsing has to be done in text mode, or done in ancillary/duplicate methods;
- If some auxiliary housekeeping is done by hand, it is prone to errors.
然后我发现docsis_server
这是一个在 MySQL for Linux 之上的“被黑客攻击的”ISC DHCP,专门为有线电视行业开发作为供应开源中间件。我最终在其上编写了我的配置软件/Web 前端。直接处理 MySQL 查询(而不是文本文件)来与 DHCP 服务交互是一个福音。
可悲的是,我认为该项目不再维护。https://github.com/bschirrmeister/docsis_server
如今,您还拥有 ISC 的 DHCP 的 Kea 项目,值得一看。在其之上开发供应方案似乎非常有趣。https://kea.isc.org
Kea 是一个开源软件系统,包括 DHCPv4、DHCPv6 服务器、动态 DNS 守护进程、REST API 接口、MySQL、PostgreSQL 和 Cassandra 数据库、RADIUS 和 NETCONF 接口以及相关实用程序。
最后,通常电缆调制解调器控制网络是 10.xxx 范围内的专用 IP 地址空间;这里没有必要为您正在使用的电缆调制解调器(例如 97.129.2.x)提供公共 IP 地址。
PS AFAIK,我所编写的配置解决方案docsis_server
已经投入生产 10 年了。
答案2
awk解决方案
awk '/}}/{$0="\thost client3 {\n\t\thardware ethernet a:b:c;\n\t}\n"$0}1' file