【问题标题】:Efficient way to get your IP address in shell scripts在 shell 脚本中获取 IP 地址的有效方法
【发布时间】:2011-01-22 15:12:04
【问题描述】:

背景: 在 *nix 系统上,可以通过这种方式在 shell 脚本中获取机器的 IP 地址:

ifconfig | grep 'inet' | grep -v '127.0.0.1' | cut -d: -f2 | awk '{print $1}'

或者也可以这样:

ifconfig | grep 'inet' | grep -v '127.0.0.1' | awk '{print $2}' | sed 's/addr://'

问题: 是否有更直接、仍然可移植的方法来获取 IP 地址以在 shell 脚本中使用?

my apologies to *BSD and Solaris users as the above command may not work;我无法测试)

【问题讨论】:

  • 机器有多个网卡怎么办?
  • “IP 地址”是什么意思?如今,拥有两个或多个 IP 地址非常普遍,即使在工作站上也是如此......
  • 是的,我想过这个问题。但这取决于脚本需要做什么。对于我的个人需求,我通常将接口名称传递给ifconfig(即ifconfig eth0等)。我认为这会使问题过于具体。有什么建议可以让这个问题更有意义吗?谢谢!

标签: shell command-line scripting


【解决方案1】:

只需一个 awk 命令即可完成。无需使用太多管道。

$ ifconfig | awk -F':' '/inet addr/&&!/127.0.0.1/{split($2,_," ");print _[1]}'

【讨论】:

  • 你的提议很好。简单的测试表明,它平均也比我的基本建议更快。我现在想接受你的。由于_[1]$2,可移植性并没有更好。例如,我需要切换 *BSDs 下的索引(啊,这次可以测试一下)。老实说,我仍然想知道是否有一种工具可以一次性获取 IP,也许是传递参数(例如接口名称)。 ifconfig 确实是“配置网络接口参数”,而不是获取参数......也许汤姆介绍的 showip.c 的广泛传播版本会很棒。
  • 如果您想考虑可移植性,您可能想尝试使用来自各种编程工具(例如 Perl 或 Python)的套接字库。例如,在 Python 中,可以使用socket.gethostbyname(socket.gethostname()) 获取 IP 地址。当然这只是一个简单的例子。许多人使用这些库提出了与平台无关的列出接口地址的方法。所以你可能想试一试。
  • Ghostdob74 的最新评论给了我以下想法:ifconfig | grep -oP "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b" 它非常便携,因为它仅依赖于标准工具,并且不对解析行中 IP 地址的位置做任何假设.注意:正则表达式确实捕获了错误的 IP 地址,但考虑到 ifconfig 返回有效地址,这并不重要。
【解决方案2】:

您提供直接接口,从而减少一个 grep。

ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}'

【讨论】:

  • 感谢@coder 的建议。我想知道我们是否不能走得更远!毕竟 *nix 工具做了一些简单的事情并且做得很好。因此,可能有一种标准方法可以获取接口的 IP 地址。例如,hostname --ip-address(这不起作用)之类的东西会很棒。
  • ifconfig eth0 | grep inet | cut -d: -f2 | cut -d' ' -f1 - 这样你就可以摆脱重量级的 awk。当然不适用于 ppp0 等,但如果您有多个 NIC,您的解决方案也会得到多个答案。 (头-1先抢?)
【解决方案3】:

基于this可以使用以下命令

ip route get 8.8.8.8 | awk 'NR==1 {print $NF}'

【讨论】:

    【解决方案4】:

    查看Beej 的networking 指南,使用简单的C 程序获取套接字列表,使用getaddrinfo(...) 调用打印出IP 地址。这个简单的 C 程序可以在 shell 脚本的一部分中使用,只打印出stdout 可用的 IP 地址,如果你想保持可移植性作为@987654325 的输出,这将更容易然后依赖ifconfig @ 可以变化。

    希望这会有所帮助, 最好的祝福, 汤姆。

    【讨论】:

    • 感谢汤姆的指点;它确实有帮助。一个信息矿。 showip.c 解决了这个问题(删除了输出格式)。我想知道是否有办法依赖 shell 中的“标准”*nix 工具。对于上下文,我正在编写一些应该在 *nix 和 *BSD 上工作的脚本。它有效,但我的方式不是很优雅。使用showip.c,我需要将程序与脚本一起部署,我相信这可以避免。
    【解决方案5】:

    ifconfig | grep '广播\|Bcast' | awk -F ' ' {'打印 $2'} |头-n 1 | sed -e 's/addr://g'

    【讨论】:

      【解决方案6】:

      这可能会有所帮助。

       more /etc/hosts | grep `hostname` | awk '{print $1}'
      

      【讨论】:

      • 这将有助于至少指定您认为这项工作的条件(操作系统等)。 grep 对我来说太严格了(在两个操作系统上测试,没有成功)。
      • 我在 AIX 服务器上进行了测试。工作正常。
      • 它在 CentOS 和 Mac OS X 上不起作用。我对标准的了解不够,但我想知道 /etc/hosts 文件内容跨系统的规律性。
      【解决方案7】:
      # for bash/linux
      ipaddr(){
      if="${1:-eth0}"
      result=$(/sbin/ip -o -4 addr show dev "${if}" | sed 's/^.*inet // ; s/\/...*$//')
      printf %s "${result}"
      tty -s  && printf "\n"
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-25
        • 1970-01-01
        • 1970-01-01
        • 2022-12-16
        • 1970-01-01
        • 2014-07-12
        • 2023-04-06
        • 2011-10-11
        相关资源
        最近更新 更多