2017-10-05 47 views
0

基本上我试图遍历我的AWS安全组,找到使用0.0.0.0/0的任何CIDR。如何迭代JQ中的CIDR块?

这是我的例子JSON文件:

{ 
    "SecurityGroups": [ 
     { 
      "IpPermissionsEgress": [], 
      "Description": "AWS OpsWorks load balancer - do not change or delete", 
      "IpPermissions": [ 
       { 
        "PrefixListIds": [], 
        "FromPort": 22, 
        "IpRanges": [ 
         { 
          "CidrIp": "0.0.0.0/0" 
         } 
        ], 
        "ToPort": 22, 
        "IpProtocol": "tcp", 
        "UserIdGroupPairs": [], 
        "Ipv6Ranges": [] 
       }, 
       { 
        "PrefixListIds": [], 
        "FromPort": 80, 
        "IpRanges": [ 
         { 
          "CidrIp": "0.0.0.0/0" 
         } 
        ], 
        "ToPort": 80, 
        "IpProtocol": "tcp", 
        "UserIdGroupPairs": [], 
        "Ipv6Ranges": [] 
       }, 
       { 
        "PrefixListIds": [], 
        "FromPort": 443, 
        "IpRanges": [ 
         { 
          "CidrIp": "0.0.0.0/0" 
         } 
        ], 
        "ToPort": 443, 
        "IpProtocol": "tcp", 
        "UserIdGroupPairs": [], 
        "Ipv6Ranges": [] 
       } 
      ], 
      "GroupName": "AWS-OpsWorks-LB-Server", 
      "OwnerId": "056146032236", 
      "GroupId": "sg-7dd13739" 
     }, 
     { 
      "IpPermissionsEgress": [ 
       { 
        "IpProtocol": "-1", 
        "PrefixListIds": [], 
        "IpRanges": [ 
         { 
          "CidrIp": "0.0.0.0/0" 
         } 
        ], 
        "UserIdGroupPairs": [], 
        "Ipv6Ranges": [] 
       } 
      ], 
      "Description": "SG for bastion hosts", 
      "Tags": [ 
       { 
        "Value": "bastion-host-sg", 
        "Key": "Name" 
       } 
      ], 
      "IpPermissions": [ 
       { 
        "PrefixListIds": [], 
        "FromPort": 80, 
        "IpRanges": [ 
         { 
          "CidrIp": "0.0.0.0/0" 
         } 
        ], 
        "ToPort": 80, 
        "IpProtocol": "tcp", 
        "UserIdGroupPairs": [], 
        "Ipv6Ranges": [] 
       }, 
       { 
        "PrefixListIds": [], 
        "FromPort": 1991, 
        "IpRanges": [ 
         { 
          "CidrIp": "0.0.0.0/0" 
         } 
        ], 
        "ToPort": 1991, 
        "IpProtocol": "tcp", 
        "UserIdGroupPairs": [], 
        "Ipv6Ranges": [] 
       }, 
       { 
        "PrefixListIds": [], 
        "FromPort": 8080, 
        "IpRanges": [ 
         { 
          "CidrIp": "0.0.0.0/0" 
         } 
        ], 
        "ToPort": 8080, 
        "IpProtocol": "tcp", 
        "UserIdGroupPairs": [], 
        "Ipv6Ranges": [] 
       }, 
       { 
        "PrefixListIds": [], 
        "FromPort": 1194, 
        "IpRanges": [ 
         { 
          "CidrIp": "0.0.0.0/0" 
         } 
        ], 
        "ToPort": 1194, 
        "IpProtocol": "udp", 
        "UserIdGroupPairs": [], 
        "Ipv6Ranges": [] 
       }, 
       { 
        "PrefixListIds": [], 
        "FromPort": 22, 
        "IpRanges": [ 
         { 
          "CidrIp": "0.0.0.0/0" 
         } 
        ], 
        "ToPort": 22, 
        "IpProtocol": "tcp", 
        "UserIdGroupPairs": [], 
        "Ipv6Ranges": [ 
         { 
          "CidrIpv6": "::/0" 
         } 
        ] 
       }, 
       { 
        "PrefixListIds": [], 
        "FromPort": 30, 
        "IpRanges": [ 
         { 
          "CidrIp": "0.0.0.0/0" 
         } 
        ], 
        "ToPort": -1, 
        "IpProtocol": "icmp", 
        "UserIdGroupPairs": [], 
        "Ipv6Ranges": [] 
       }, 
       { 
        "PrefixListIds": [], 
        "FromPort": 1194, 
        "IpRanges": [ 
         { 
          "CidrIp": "0.0.0.0/0" 
         } 
        ], 
        "ToPort": 1194, 
        "IpProtocol": "tcp", 
        "UserIdGroupPairs": [], 
        "Ipv6Ranges": [] 
       }, 
       { 
        "PrefixListIds": [], 
        "FromPort": 53, 
        "IpRanges": [ 
         { 
          "CidrIp": "0.0.0.0/0" 
         } 
        ], 
        "ToPort": 53, 
        "IpProtocol": "udp", 
        "UserIdGroupPairs": [], 
        "Ipv6Ranges": [] 
       }, 
       { 
        "PrefixListIds": [], 
        "FromPort": 53, 
        "IpRanges": [ 
         { 
          "CidrIp": "0.0.0.0/0" 
         } 
        ], 
        "ToPort": 53, 
        "IpProtocol": "tcp", 
        "UserIdGroupPairs": [], 
        "Ipv6Ranges": [] 
       }, 
       { 
        "PrefixListIds": [], 
        "FromPort": 443, 
        "IpRanges": [ 
         { 
          "CidrIp": "0.0.0.0/0" 
         } 
        ], 
        "ToPort": 443, 
        "IpProtocol": "tcp", 
        "UserIdGroupPairs": [], 
        "Ipv6Ranges": [] 
       }, 
       { 
        "PrefixListIds": [], 
        "FromPort": 8, 
        "IpRanges": [ 
         { 
          "CidrIp": "0.0.0.0/0" 
         } 
        ], 
        "ToPort": -1, 
        "IpProtocol": "icmp", 
        "UserIdGroupPairs": [], 
        "Ipv6Ranges": [] 
       } 
      ], 
      "GroupName": "bastion-host-sg", 
      "VpcId": "vpc-effd0e8a", 
      "OwnerId": "056146032236", 
      "GroupId": "sg-0f60196a" 
     } 
     ] 
} 

这里是我试图运行命令,但得到一个错误:

$ cat sg-small.json | jq '.SecurityGroups[].IpPermissions[].IpRanges[] | map(select(any(.CidrIp == "0.0.0.0/0")))'  
jq: error (at <stdin>:227): Cannot iterate over string ("0.0.0.0/0") 

任何想法,为什么发生这种情况。该方法似乎适用于其他非IP地址的事物。

回答

0

你的表达:

.SecurityGroups[].IpPermissions[].IpRanges[] 

只是CidrIp对象的流,所以这不是你想要的。

下面将选择符合标准的SecurityGroups:

.SecurityGroups[] 
| select(any(.IpPermissions[].IpRanges[]; .CidrIp == "0.0.0.0/0")) 

这是否是你想要正是目前尚不清楚,因为你并没有指明。请参阅http://stackoverflow.com/help/mcve

0

的原因,你看到的错误

Cannot iterate over string ("0.0.0.0/0") 

是因为你的数据的过滤器的第一部分

.SecurityGroups[].IpPermissions[].IpRanges[] 

生成的对象序列

{ 
    "CidrIp": "0.0.0.0/0" 
} 
... 

您的筛选器的部分map terates了在这些对象的值,通过

"0.0.0.0/0" 

来表达select(any(.CidrIp == "0.0.0.0/0"))其中any试图迭代字符串中的所有值和失败,你观察到的错误。

如果你只想看到{"CidrIp":...}对象的序列上面可以消除mapany

.SecurityGroups[].IpPermissions[].IpRanges[] 
| select(.CidrIp == "0.0.0.0/0") 

如果你宁愿收集这些对象到一个数组,你可以删除any和移动一些例如,重复进入map

.SecurityGroups 
| map(.IpPermissions[].IpRanges[] | select(.CidrIp == "0.0.0.0/0")) 

生产

[ 
    { 
    "CidrIp": "0.0.0.0/0" 
    }, 
    .... 

结果数组的显式建筑更容易看到,如果你与它的定义替换map。由于map(f)被定义为[ .[] | f ]以上过滤器与此相同:

.SecurityGroups 
| [ .[] | .IpPermissions[].IpRanges[] | select(.CidrIp == "0.0.0.0/0") ]