【问题标题】:List public IP addresses of EC2 instances列出 EC2 实例的公网 IP 地址
【发布时间】:2014-09-16 07:39:20
【问题描述】:

我想使用 Bash 列出我的 EC2 实例的公共 IP 地址,并用分隔符(空格或换行符)分隔。

我尝试使用 aws ec2 describe-instances | jq 将输出通过管道传输到 jq,但似乎无法仅隔离 IP 地址。

这可以由aws 单独完成,为jq 指定参数,或完全由其他方式完成吗?

【问题讨论】:

  • 你试过了吗:curl --silent http://ipecho.net/plain
  • curl icanhazip.com,或curl ident.me
  • 这显示了我自己的 IP 地址.. 不是我的实例拥有的那些列表
  • 如果aws ec2 describe-instance 的输出包含您想要的信息,那么您必须显示该命令的一些示例输出以获得一般帮助,因为大多数人不会安装aws
  • 对于那些希望通过在实例上运行的脚本来获取IP的人,请参阅stackoverflow.com/a/46323720/117471

标签: bash amazon-web-services amazon-ec2 aws-cli jq


【解决方案1】:

直接来自aws cli

aws ec2 describe-instances \
  --query "Reservations[*].Instances[*].PublicIpAddress" \
  --output=text

【讨论】:

  • 太棒了。但这会输出三列:每一行都有 IP,两列只在某些行上有 IP。当我使用Reservations[*].Instances[*].PublicIpAddress[] 作为查询参数时,我得到了一个很好的制表符分隔列表。
  • 将您的PublicIpAddress 括在方括号中,以确保每行 1 个,如下所示:github.com/aws/aws-cli/issues/914#issuecomment-56210312。这对我有用--query 'Reservations[].Instances[].[PublicIpAddress]
  • 有没有办法使用安全组进行过滤?我试过: "aws ec2 describe-instances --filters Name=vpc-id,Values={vpcid} Name=InstanceId,Values={securityGroupID} --output=text" 。但我什么也得不到
  • 如果您希望实例的 KeyName 与公共 IP 地址一起使用,您可以通过 --query "Reservations[*].Instances[*].[KeyName, PublicIpAddress]" 获取它
【解决方案2】:
  • 过滤正在运行的实例(如果不需要,可以删除该部分)
  • 查询每个 PublicIPaddress 和 Name Tag,在未设置 Name 时处理
aws ec2 describe-instances \
  --filter "Name=instance-state-name,Values=running" \
  --query "Reservations[*].Instances[*].[PublicIpAddress, Tags[?Key=='Name'].Value|[0]]" \
  --output text

【讨论】:

    【解决方案3】:

    以下命令将列出所有正在运行的 EC2 实例的 IP 地址

    aws ec2 describe-instances | grep PublicIpAddress | grep -o -P "\d+\.\d+\.\d+\.\d+" | grep -v '^10\.'
    

    希望能回答您的问题...

    但这在没有关于访问的所有错误的情况下有效:

    wget -qO- http://instance-data/latest/meta-data/public-ipv4/|grep .
    

    【讨论】:

    • 我今天 10/23/15 刚刚尝试了相同的命令,它运行良好,没有任何问题。您看到的错误是什么?
    • Grep 在 OSX 上的工作方式有所不同,OSX 具有 grep 的 BSD 版本,而 GNU 则主要在其他标准 Linux 发行版上找到 stackoverflow.com/questions/19413494/…
    【解决方案4】:

    您可以使用instance metadata,以便从 ec2 实例运行以下命令:

    curl http://169.254.169.254/latest/meta-data/public-ipv4
    

    它会为您提供实例的公共 IP。如果你想要私有IP,你将运行

    curl http://169.254.169.254/latest/meta-data/local-ipv4
    

    【讨论】:

    • 这太棒了!但是,我建议使用wget -qO - 而不是curl(即使我使用curl 99.9% 或脚本中的时间。原因是如果服务器没有curl 将输出404 页面的内容一个公共 IP,而wget 没有。所以在 bash 中,很容易做到 public_ip="$(wget -qO - http://169.254.169.254/latest/meta-data/public-ipv4)" 并获得预期的结果。然后您可以使用 if [[ -n $public_ip ]]; then echo "Public IP: $public_ip"; fi 进行测试
    【解决方案5】:
    aws ec2 describe-instances --query "Reservations[].Instances[][PublicIpAddress]"
    

    参考: http://docs.aws.amazon.com/cli/latest/userguide/controlling-output.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      • 2018-01-02
      相关资源
      最近更新 更多