使用systemd-networkd时如何正确获取DHCP分配的网络参数?
使用systemd-networkd时如何正确获取DHCP分配的网络参数?
我完全理解你的困扰——用惯了NetworkManager的nmcli,突然换成systemd-networkd,想拿DHCP分配的参数还真有点摸不着头脑,而且那个lease文件明明白白写着“别解析”,谁也不想给自己留个系统更新后脚本失效的坑对吧?
给你两个官方推荐的可靠方法,完全不需要碰那个不安全的lease文件:
方法一:用networkctl提取完整DHCP信息
networkctl是systemd自带的网络状态查询工具,专门和systemd-networkd配合工作,输出格式稳定,是官方认可的标准方式。
- 先确定你的网络接口名(比如eth0、ens33这类),可以用下面的命令快速获取已连接的接口:
networkctl list | grep "connected" | awk '{print $2}'
- 针对目标接口,提取DHCP分配的主机名:
networkctl status eth0 | grep "DHCP Hostname" | awk '{print $3}'
- 提取DHCP分配的DNS域名:
networkctl status eth0 | grep "DNS Domain" | awk '{print $3}'
如果需要更结构化的输出(方便脚本批量处理),还可以加上--json参数,配合jq解析:
networkctl status eth0 --json=short | jq '.links[0].dhcp.hostname' networkctl status eth0 --json=short | jq '.links[0].dhcp.domain'
这种JSON格式的输出稳定性更高,脚本处理起来也更不容易出错。
方法二:用systemd-resolve获取DNS相关参数
如果只需要DNS域名这类DNS配置信息,systemd-resolve也是个好选择,它和systemd-networkd深度集成,能直接拿到DHCP推送的DNS设置:
systemd-resolve --status eth0 | grep "Domain" | awk '{print $2}'
另外关于你提到的hostnamectl:它返回的是系统的静态主机名或者当前运行时主机名,确实不一定对应DHCP分配的那个值。而networkctl输出里的“DHCP Hostname”才是DHCP服务器分配给你的主机名参数,这个是准确的。
总之,优先用官方提供的networkctl或者systemd-resolve,完全不用去碰那个标注了私有数据的lease文件,这样不管systemd怎么更新,你的脚本都能稳定工作。
备注:内容来源于stack exchange,提问作者Ale
相关产品推荐
相关产品推荐

