2017-10-05 3 views
0

Fondamentalement, j'essaie de parcourir mes groupes de sécurité AWS pour trouver n'importe quel CIDR en utilisant 0.0.0.0/0.Comment puis-je itérer sur des blocs CIDR dans JQ?

Voici mon exemple 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" 
     } 
     ] 
} 

est la commande Ici, je suis en train de courir, mais je reçois une erreur:

$ 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") 

Toute pensée pour expliquer pourquoi ce qui se passe. Cette méthode semble fonctionner pour d'autres choses qui ne sont pas des adresses IP.

Répondre

0

Votre expression:

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

est juste un flux d'objets CidrIp, de sorte que ce n'est pas ce que vous voulez.

qui suit sélectionnera les SecurityGroups qui répondent au critère:

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

Que ce soit précisément ce que vous voulez ne sait pas puisque vous ne l'avez pas précisé que. S'il vous plaît voir http://stackoverflow.com/help/mcve

0

La raison pour laquelle vous voyez l'erreur

Cannot iterate over string ("0.0.0.0/0") 

est parce que vos données la première partie de votre filtre

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

génère une séquence d'objets

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

La partie map de votre filtre i terates sur les valeurs dans chacun de ces objets, en passant

"0.0.0.0/0" 

à l'expression select(any(.CidrIp == "0.0.0.0/0"))any essaie de parcourir toutes les valeurs dans la chaîne et échoue avec l'erreur que vous observez.

Si vous voulez voir une séquence de {"CidrIp":...} objets comme ci-dessus, vous pouvez éliminer le map et any:

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

Si vous préférez collecter ces objets dans un tableau, vous pouvez retirer le any et déplacer certains de l'itération dans le map par exemple

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

produisant

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

La construction explict du tableau de résultat est plus facile de voir si vous remplacez map par sa définition. Puisque map(f) est défini comme [ .[] | f ] le filtre ci-dessus est le même que celui-ci: