原生PowerShell实现SSH远程执行网络设备命令的方案咨询
原生PowerShell实现SSH远程执行网络设备命令的方案咨询
嘿,刚好我之前也碰到过类似的需求,现在就来给你唠唠原生PowerShell里怎么搞定这个事儿,不用再依赖PoshSSH模块啦!
首先要明确:从Windows 10 1809版本/Windows Server 2019开始,系统已经自带了OpenSSH客户端,这完全是原生组件,不需要额外安装第三方模块。如果你不确定自己的系统有没有装,可以先跑这个命令确认:
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Client*'
要是显示未安装,直接用这条命令装上就行:
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
接下来解决你提到的交互式问题(密钥确认、密码输入),分两种场景给你说:
一、自动跳过主机密钥确认
默认第一次连接新设备时,SSH会弹出确认RSA密钥的提示,脚本里肯定不想碰到这个。有两种办法:
临时禁用密钥检查(适合测试环境)
在ssh命令里加-o StrictHostKeyChecking=no参数,比如:ssh -o StrictHostKeyChecking=no uname@networkdevice.company.local "show version"这样就不会弹出确认提示,直接连接。
预先导入主机密钥(生产环境推荐)
用ssh-keyscan命令把设备的密钥提前写入本地的known_hosts文件,一劳永逸:ssh-keyscan networkdevice.company.local >> $env:USERPROFILE\.ssh\known_hosts之后再用ssh连接就不会有确认提示了,安全性也更高。
二、无密码执行命令(非交互式核心)
要彻底摆脱交互,密钥认证是最佳方案,比密码认证靠谱多了:
生成SSH密钥对
打开PowerShell执行这条命令,一路回车默认配置就行:ssh-keygen -t rsa生成的密钥对会存在
C:\Users\<你的用户名>\.ssh目录下,id_rsa是私钥,id_rsa.pub是公钥。把公钥上传到网络设备
不同设备的操作略有不同,比如:- Cisco IOS:进入用户配置模式,用
ip ssh pubkey-chain命令添加公钥内容 - Juniper Junos:在用户配置里添加
ssh authorized-key字段
具体操作可以查对应设备的文档,配置好之后,你用这个用户连接就不用输密码了。
- Cisco IOS:进入用户配置模式,用
三、脚本里批量执行命令的示例
给你写个简单的批量执行脚本参考,比如批量获取设备的接口状态:
# 定义要操作的设备列表 $deviceList = @( "router01.company.local", "switch01.company.local", "firewall01.company.local" ) $sshUsername = "admin" foreach ($device in $deviceList) { Write-Host "正在处理设备: $device" -ForegroundColor Cyan # 执行SSH命令并捕获输出 $commandOutput = ssh "$sshUsername@$device" "show ip interface brief" # 把输出保存到本地文件 $commandOutput | Out-File -Path ".\$device-interface-report.txt" -Encoding UTF8 Write-Host "设备 $device 处理完成`n" -ForegroundColor Green }
一些额外注意事项
- 确保目标网络设备已经开启SSH服务,并且允许你的主机IP连接
- 如果设备需要进入特权模式(比如Cisco的enable),可以把命令串联起来,比如
ssh admin@router "enable; show running-config",前提是你的用户已经有权限直接执行enable,或者设备配置了无需密码的enable - 要是必须用密码认证(比如设备不支持密钥),可以结合PowerShell的
Start-Process和输入重定向,但这种方式安全性较低,不推荐生产环境使用
备注:内容来源于stack exchange,提问作者Mario Jost




