SSH登录机器后,如何用Bash提取网络设备配置文件中的主机名?
从网络设备配置文件提取主机名的Bash方法
既然你已经通过SSH登录到目标机器了,那咱们得根据不同网络设备的配置格式来针对性处理——毕竟不同厂商的配置文件里,主机名的定义方式差别还挺大的。下面我给你整理了通用方法和几种主流设备的具体操作:
通用模糊匹配(不确定配置格式时用)
如果不知道配置文件的具体格式,先做两步:
- 找到可能的配置文件位置:
# 搜索系统里带config的文件,缩小范围(忽略权限报错) find / -name "*config*" -type f 2>/dev/null - 用关键字匹配常见的主机名定义(比如
hostname、sysname),同时过滤掉注释行(假设注释以#或!开头):
如果要只提取主机名字段,用grep -E "(hostname|sysname)" /path/to/your/config/file | grep -v "^[#!]"awk或cut进一步处理:# 提取关键字后面的内容(适用于类似"hostname Router-01"的格式) grep -E "^hostname" /path/to/config | awk '{print $2}' # 或者用cut分割字符串 grep -E "^hostname" /path/to/config | cut -d' ' -f2
主流厂商设备的具体操作
1. Cisco IOS/IOS-XE 设备
Cisco配置里主机名通常是hostname <设备名>格式:
- 如果已经把
show running-config的输出存成了文件(比如run-config.txt):grep "^hostname" run-config.txt | awk '{print $2}' - 直接在设备SSH会话中提取:
show running-config | include ^hostname | awk '{print $2}'
2. Juniper Junos 设备
Junos的主机名定义是system host-name <设备名>(新版本)或sysname <设备名>(老版本):
- 从配置文件提取:
grep -E "(system host-name|sysname)" /config/juniper.conf | awk '{print $NF}' - 直接在设备中执行命令提取:
show configuration system host-name | awk '{print $NF}'
3. 华为/H3C 设备
这类设备的主机名定义是sysname <设备名>:
- 从配置文件提取:
grep "^sysname" /path/to/config | awk '{print $2}' - 直接在设备SSH会话中提取:
display current-configuration | include ^sysname | awk '{print $2}'
4. Linux/OpenWrt 类网络设备
- 大部分Linux系统的主机名直接存在
/etc/hostname里,直接查看即可:cat /etc/hostname - OpenWrt的配置在
/etc/config/system里,格式为option hostname '<设备名>',提取命令:grep "option hostname" /etc/config/system | cut -d"'" -f2
小技巧
如果不确定配置文件里的关键字,先快速浏览文件前几十行找线索:
head -50 /path/to/config/file
如果有多个匹配结果,用uniq去重:
grep -E "(hostname|sysname)" config.txt | awk '{print $NF}' | uniq
内容的提问来源于stack exchange,提问作者MoreScratch




