You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写PoSH-SSH脚本批量检测服务器SSH默认密码安全风险

PoSH-SSH 批量SSH安全检测脚本修复方案

问题1:无法正确读取clients.txt的修复

你原脚本存在1个核心语法错误:New-SSHSession的目标主机参数名遗漏,你写的-$client属于无效参数,正确参数为-ComputerName $client,这是你读取内容后执行异常的核心原因。
除此之外读取失败的常见优化点:

  • 读取时过滤空白行和注释行,避免空值引发后续报错
  • 明确指定文本编码,避免不同编码格式导致读取乱码
  • 增加文件存在性校验,避免文件不存在的异常
    对应读取部分修正代码:
# 读取客户端列表,过滤空白行与注释行,指定编码为系统默认编码
if(Test-Path C:\clients.txt){
    $clients = Get-Content C:\clients.txt -Encoding Default | Where-Object { $_ -notmatch '^\s*$|^#' }
}else{
    Write-Error "客户端列表文件C:\clients.txt不存在"
    exit 1
}

问题2:SSH登录状态判断与分支逻辑实现

PoSH-SSH的New-SSHSession登录成功会返回会话对象,登录失败会抛出错误,我们可以通过try/catch捕获错误,结合返回值判断登录结果:

  • 增加-ErrorAction Stop参数,将登录失败的非终止错误转为可捕获的终止错误
  • 登录成功后执行风险通知逻辑,登录失败则记录异常信息
  • 每次测试结束后关闭SSH会话,避免连接残留

提前准备默认凭据

你原脚本中-Credential test需要提前构建凭据对象,测试环境可使用以下代码生成,避免明文硬编码密码:

# 交互式输入默认测试账号密码
$defaultCred = Get-Credential -Message "输入要测试的默认账号密码"

完整登录判断逻辑

# 初始化扫描结果列表
$scanResults = @()
# 批量遍历测试
foreach($client in $clients){
    $result = [PSCustomObject]@{
        主机地址 = $client
        登录状态 = "失败"
        异常信息 = ""
        风险等级 = "无"
    }
    try{
        # 尝试SSH登录,超时设置为10秒避免长时间等待
        $session = New-SSHSession -ComputerName $client -Credential $defaultCred -ConnectionTimeout 10000 -ErrorAction Stop
        if($session.Connected){
            $result.登录状态 = "成功"
            $result.风险等级 = "高风险"
            # --------------------------
            # 登录成功后触发通知逻辑
            # --------------------------
            # 控制台输出告警
            Write-Warning "发现风险主机:$client 存在默认账号可登录漏洞"
            # 邮件通知示例(需提前配置SMTP参数)
            <#
            $mailParams = @{
                From = "sec-alert@yourdomain.com"
                To = "admin@yourdomain.com"
                Subject = "SSH弱口令风险告警:主机$client存在默认账号登录漏洞"
                Body = "经检测,主机$client可使用测试默认账号成功登录,请立即整改"
                SmtpServer = "smtp.yourdomain.com"
                Port = 587
                UseSsl = $true
                Credential = (Get-Credential "输入发件邮箱凭据")
            }
            Send-MailMessage @mailParams
            #>
            # 测试完成后关闭会话
            Remove-SSHSession -Session $session | Out-Null
        }
    }catch{
        $result.异常信息 = $_.Exception.Message
    }
    $scanResults += $result
}
# 导出扫描结果到CSV
$scanResults | Export-Csv C:\ssh_scan_result.csv -NoTypeInformation -Encoding UTF8

其他注意事项

  • 此类安全检测需提前获得资产归属方授权,禁止未授权扫描非自有资产
  • 生产环境使用建议从安全凭据保管服务读取测试账号密码,不要硬编码敏感信息
  • 可根据需求调整超时时间、增加扫描间隔,避免触发目标服务器的风控拦截规则

内容的提问来源于stack exchange,提问作者zargus123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 14:06:04