使用AWS PowerShell Get-EC2SecurityGroup获取安全组及IP详情的语法问题
问题原因
你现有的代码无法直接输出可读的IP信息,是因为IpRanges属性本身是一个对象集合,直接通过Select查询只会展示对象类型,不会展开其中的CidrIp字段(也就是你需要的关联IP段信息)。
优化后可用代码
foreach ($g in Get-EC2SecurityGroup ) { Write-Host "`n安全组ID: $($g.GroupId) | 安全组描述: $($g.Description)" Write-Host "------------------------入站规则明细------------------------" $g.IpPermissions | ForEach-Object { # 展开IpRanges里的每个CIDR段单独输出 foreach ($ipRange in $_.IpRanges) { [PSCustomObject]@{ 协议 = $_.IpProtocol 端口范围 = if ($_.ToPort -eq $_.FromPort) { $_.ToPort } else { "$($_.FromPort)-$($_.ToPort)" } 授权IP段 = $ipRange.CidrIp 规则描述 = $ipRange.Description } } } | Format-Table -AutoSize }
代码说明
- 自动区分单端口和端口范围,输出更易读
- 展开了IpRanges集合,直接展示每个授权的CIDR IP段,同时会输出IP段对应的规则描述(如果有配置的话)
- 按安全组分隔输出,结构更清晰
- 如果需要同时查询出站规则,补充
$g.IpPermissionsEgress的遍历逻辑即可
可选:导出结果到CSV文件
如果你需要把结果保存为本地文件方便后续查看,可以使用如下逻辑:
$allSgRules = @() foreach ($g in Get-EC2SecurityGroup ) { $g.IpPermissions | ForEach-Object { foreach ($ipRange in $_.IpRanges) { $allSgRules += [PSCustomObject]@{ 安全组ID = $g.GroupId 安全组描述 = $g.Description 协议 = $_.IpProtocol 端口范围 = if ($_.ToPort -eq $_.FromPort) { $_.ToPort } else { "$($_.FromPort)-$($_.ToPort)" } 授权IP段 = $ipRange.CidrIp 规则描述 = $ipRange.Description } } } } $allSgRules | Export-Csv -Path "./EC2安全组规则明细.csv" -Encoding UTF8 -NoTypeInformation
内容的提问来源于stack exchange,提问作者Kez
相关产品推荐
相关产品推荐

