我正在寻找一个命令行解决方案,将返回我的主(第一个)IP地址的本地主机,而不是127.0.0.1

该解决方案至少适用于Linux (Debian和RedHat)和OS X 10.7+

我知道在这两个平台上都可以使用ifconfig,但是它的输出在这些平台之间并不一致。


当前回答

如果你已经安装了npm和node: npm install -g ip && node -e "const ip = require('ip');console.log (ip.address())”

其他回答

如果你已经安装了npm和node: npm install -g ip && node -e "const ip = require('ip');console.log (ip.address())”

ifconfig | grep "inet addr:" | grep -v "127.0.0.1" | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'  | head -1

我提取我对这个答案的评论:

ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'

它基于@CollinAnderson的答案,但对我来说没用。

ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}'

解决方案

$ ip -o route get to 8.8.8.8 | sed -n 's/.*src \([0-9.]\+\).*/\1/p'
192.168.8.16

解释

查询网络信息的正确方法是使用ip:

-o单行输出 Route get获取到目的地的实际内核路由 8.8.8.8谷歌IP,但可以使用您想要到达的真实IP

例如IP输出:

8.8.8.8 via 192.168.8.254 dev enp0s25 src 192.168.8.16 uid 1000 \   cache

要提取src ip, sed是最轻的,最兼容regex支持:

-n默认不输出 's/pattern/replacement/p'只匹配模式和打印替换 . * src \([0 - 9] \ + \)。*匹配内核使用的src IP,达到8.8.8.8

例如,最终输出:

192.168.8.16

其他答案

我认为前面的答案对我来说都不够好,因为它们在最近的机器上不起作用(Gentoo 2018)。

我在前面的答案中发现的问题:

在命令输出中使用位置列; 使用已弃用的ifconfig,例如,不要列出多个ip; 使用awk来完成简单的任务,而sed可以更好地处理这些任务; IP route get 1不清楚,实际上是IP route get到1.0.0.0的别名 使用hostname命令,在所有设备中都没有-I选项,在我的情况下返回127.0.0.1。