如何使用PowerShell替换Cisco配置中secret字段后的密文值
PowerShell实现Cisco配置文件secret密文批量替换方案
核心逻辑是通过正则正向匹配,准确定位所有secret关键字后的密文片段,保留原有配置结构的同时完成密文替换,不会破坏Cisco配置语法。
实现说明
- 匹配规则采用正向零宽断言正则,仅选中密文内容,不会改动
secret关键字、加密级别标识(如示例中的5代表MD5加密)、前后其他配置字段 - 默认支持自动备份原配置文件,避免替换失误导致配置损坏
- 适配所有Cisco标准配置格式,既可以匹配
enable secret行的密文,也可以匹配username配置行中嵌套的secret密文 - 写回文件采用ASCII编码,符合Cisco设备配置导入的编码要求,避免乱码
单文件处理代码
# --------------- 按需修改以下参数 --------------- $configPath = "D:\network_configs\core_switch.cfg" # 待处理配置文件的本地路径 # 替换后的合规密文,必须用单引号包裹,避免$被PowerShell识别为变量前缀 $replacementCipher = '$1$compliant$ciphervaluexxxxxx' $enableBackup = $true # 处理前是否自动备份原文件 # ----------------------------------------------- # 备份原文件 if ($enableBackup) { Copy-Item -Path $configPath -Destination "$configPath.bak" -Force } # 读取配置并执行替换 $rawConfig = Get-Content -Path $configPath -Raw # 正则说明:匹配所有"secret 空格 加密级别数字 空格"之后的连续非空字符串(即密文) $updatedConfig = $rawConfig -replace '(?<=secret\s+\d+\s+)\S+', $replacementCipher # 写回更新后的配置 Set-Content -Path $configPath -Value $updatedConfig -Encoding ASCII
替换效果验证
针对提供的配置片段,替换后输出结果如下:
enable secret 5 $1$compliant$ciphervaluexxxxxx ! username juanchis privilege 15 secret 5 $1$compliant$ciphervaluexxxxxx
批量处理目录下所有配置文件
如果需要批量处理整个文件夹下的Cisco配置文件,使用以下遍历逻辑即可:
# --------------- 按需修改以下参数 --------------- $configFolder = "D:\network_configs\all_devices\" $replacementCipher = '$1$compliant$ciphervaluexxxxxx' $enableBackup = $true # ----------------------------------------------- Get-ChildItem -Path $configFolder -Filter "*.cfg" -File | ForEach-Object { if ($enableBackup) { Copy-Item -Path $_.FullName -Destination "$($_.FullName).bak" -Force } $rawConfig = Get-Content -Path $_.FullName -Raw $updatedConfig = $rawConfig -replace '(?<=secret\s+\d+\s+)\S+', $replacementCipher Set-Content -Path $_.FullName -Value $updatedConfig -Encoding ASCII }
注意:如果配置中存在非数字加密类型的secret(比如部分IOS版本的secret 9类型加密、或者明文secret),可以调整正则为(?<=secret\s+\S+\s+)\S+适配所有加密类型场景
内容的提问来源于stack exchange,提问作者spwlite
相关产品推荐
相关产品推荐

