You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

原生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密钥的提示,脚本里肯定不想碰到这个。有两种办法:

  1. 临时禁用密钥检查(适合测试环境)
    在ssh命令里加-o StrictHostKeyChecking=no参数,比如:

    ssh -o StrictHostKeyChecking=no uname@networkdevice.company.local "show version"
    

    这样就不会弹出确认提示,直接连接。

  2. 预先导入主机密钥(生产环境推荐)
    ssh-keyscan命令把设备的密钥提前写入本地的known_hosts文件,一劳永逸:

    ssh-keyscan networkdevice.company.local >> $env:USERPROFILE\.ssh\known_hosts
    

    之后再用ssh连接就不会有确认提示了,安全性也更高。

二、无密码执行命令(非交互式核心)

要彻底摆脱交互,密钥认证是最佳方案,比密码认证靠谱多了:

  1. 生成SSH密钥对
    打开PowerShell执行这条命令,一路回车默认配置就行:

    ssh-keygen -t rsa
    

    生成的密钥对会存在C:\Users\<你的用户名>\.ssh目录下,id_rsa是私钥,id_rsa.pub是公钥。

  2. 把公钥上传到网络设备
    不同设备的操作略有不同,比如:

    • Cisco IOS:进入用户配置模式,用ip ssh pubkey-chain命令添加公钥内容
    • Juniper Junos:在用户配置里添加ssh authorized-key字段
      具体操作可以查对应设备的文档,配置好之后,你用这个用户连接就不用输密码了。

三、脚本里批量执行命令的示例

给你写个简单的批量执行脚本参考,比如批量获取设备的接口状态:

# 定义要操作的设备列表
$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

火山引擎 最新活动