如何在Bash中替换SSH配置指定Host对应的HostName IP
解决SSH配置中指定Host的HostName IP替换问题
方法1:使用sed命令(适合快速命令行操作)
直接匹配目标Host对应的配置区块,替换其中的HostName IP:
# Linux环境 sed -i '/^Host my_host_2$/,/^Host\|$/ s/\(HostName \)\([0-9.]\+\)/\14.3.2.1/' ~/.ssh/config # macOS环境(sed参数略有不同) sed -i '' '/^Host my_host_2$/,/^Host\|$/ s/\(HostName \)\([0-9.]\+\)/\14.3.2.1/' ~/.ssh/config
/^Host my_host_2$/,/^Host\|$/:锁定从Host my_host_2行开始,到下一个Host行或文件末尾的配置区块s/\(HostName \)\([0-9.]\+\)/\14.3.2.1/:在区块内匹配HostName后的IP段,替换为目标IP4.3.2.1-i:直接修改原文件(macOS需加空参数-i ''避免生成备份文件)
方法2:使用awk脚本(逻辑更清晰,适合复杂配置)
通过跟踪当前Host名称,精准替换目标条目:
awk -v target_host="my_host_2" -v new_ip="4.3.2.1" ' /^Host / { current_host = substr($0, 6) } /^HostName / { if (current_host == target_host) { print "HostName " new_ip next } } 1' ~/.ssh/config > temp_config && mv temp_config ~/.ssh/config
- 用
-v定义变量target_host(要修改的Host名)和new_ip(目标IP) - 遇到
Host开头的行,提取并记录当前Host名称 - 遇到
HostName开头的行,判断当前Host是否为目标Host,是则输出新配置,否则保留原行 - 最后的
1表示输出所有未匹配处理的行 - 通过临时文件中转,避免直接修改原文件导致的配置损坏
方法3:GUI编辑器多行正则替换(比如VS Code)
开启编辑器的多行模式和点匹配换行选项后,使用以下正则:
- 查找:
(Host my_host_2\n.*?HostName )\d+\.\d+\.\d+\.\d+ - 替换:
$14.3.2.1
内容的提问来源于stack exchange,提问作者brcebn
相关产品推荐
相关产品推荐

