如何在 Mac OSX 中获取默认网关

Posted

技术标签:

【中文标题】如何在 Mac OSX 中获取默认网关【英文标题】:How to get default gateway in Mac OSX 【发布时间】:2011-10-10 14:12:44 【问题描述】:

我需要检索 Mac 机器上的默认网关。我知道在 Linux 中 route -n 会给出一个输出,我可以很容易地从中检索到这些信息。但是,这在 Mac OSX(Snow Leopard) 中不起作用。

我也尝试过netstat -nr | grep 'default',但我希望得到像route -n 在Linux/Unix 中产生的更清晰的输出。 netstat -nr 列出了所有接口和它们的默认网关。

任何形式的建议或正确方向的提示将不胜感激。

【问题讨论】:

迁移到超级用户? 仅供参考,您可以 Option + 单击状态栏上的 WiFi 图标。这会显示其他信息,包括网关。 【参考方案1】:

你可以试试:

route -n get default

它与 GNU/Linux 的 route -n(甚至 ip route show)不同,但对于检查默认路由信息很有用。 此外,您可以检查包将采取的特定主机的路线。例如

route -n get www.yahoo.com

输出类似于:

   route to: 98.137.149.56
destination: default
       mask: 128.0.0.0
    gateway: 5.5.0.1
  interface: tun0
      flags: <UP,GATEWAY,DONE,STATIC,PRCLONING>
 recvpipe  sendpipe  ssthresh  rtt,msec    rttvar  hopcount      mtu     expire
       0         0         0         0         0         0      1500         0

恕我直言netstat -nr 是您所需要的。甚至 MacOSX 的网络实用程序 app(*) 也使用 netstat 的输出来显示路由信息。

我希望这会有所帮助:)

(*) 您可以使用open /Applications/Utilities/Network\ Utility.app 启动网络实用程序

【讨论】:

谢谢。当时代华纳的调制解调器决定它想要我的路由器曾经拥有的 IP 时,你在新房子里为我节省了几个小时,而 ifconfig 对网关撒了谎。【参考方案2】:

要获取关联的ip地址列表,可以使用netstat命令

netstat -rn 

这给出了一个长长的 IP 地址列表,并且不容易找到所需的字段。样例结果如下:

Routing tables
Internet:
Destination        Gateway            Flags        Refs      Use   Netif Expire
default            192.168.195.1      UGSc           17        0     en2
127                127.0.0.1          UCS             0        0     lo0
127.0.0.1          127.0.0.1          UH              1   254107     lo0
169.254            link#7             UCS             0        0     en2
192.168.195        link#7             UCS             3        0     en2
192.168.195.1      0:27:22:67:35:ee   UHLWIi         22      397     en2   1193
192.168.195.5      127.0.0.1          UHS             0        0     lo0

More result is truncated.......

网关的ip地址在第一行;一个在其第一列具有默认值。

要只显示选定的结果行,我们可以使用 grep 命令和 netstat

netstat -rn | grep 'default'

此命令过滤并显示那些具有默认值的结果行。在这种情况下,您可以看到如下结果:

default            192.168.195.1      UGSc           14        0     en2

如果您只想查找网关的 ip 地址而没有其他内容,您可以使用 awk 进一步过滤结果。 awk 命令匹配输入结果中的模式并显示输出。当您直接在某个程序或批处理作业中使用结果时,这会很有用。

netstat -rn | grep 'default' | awk 'print $2'

awk 命令告诉匹配并打印文本中结果的第二列。因此最终结果如下所示:

192.168.195.1

在这种情况下,netstat 显示所有结果,grep 只选择其中包含 'default' 的行,而 awk 进一步匹配模式以显示文本中的第二列。

您可以类似地使用 route -n get default 命令来获得所需的结果。完整的命令是

route -n get default | grep 'gateway' | awk 'print $2'

这些命令在 linux 以及 unix 系统和 MAC OS 中运行良好。

【讨论】:

【参考方案3】:

不需要 grep 实用程序。 awk 无所不能:

    netstat -rn | awk '/default/ print $2'
      192.168.128.1

请注意,如果您正在运行类似 Parallels(或 ***,或两者)之类的东西,您可能会看到两个或更多默认路由条目 - 如果您也使用上面的“grep”建议,情况也会如此。

    netstat -rn | awk '/default/ print $2'
      192.168.128.1
      link#12

    netstat -rn | awk '/default/ print $2'                             
      utun1
      192.168.128.1
      link#12

设置一个变量(_default)以供进一步使用(假设'default'只有一个条目).....

    _default=$( netstat -rn inet | awk '/default/ print $2' ) # I prefer $( ... ) over back-ticks

在多个默认路由的情况下使用:

    netstat -rn | awk '/default/ if ( index($6, "en") > 0 )print $2 '
      192.168.128.1

这些示例在 Mavericks Terminal.app 中进行了测试,仅适用于 OSX。例如,其他 *nix 版本经常使用 'eth' 进行以太网/无线连接,而不是 'en'。 这也仅使用 ksh 进行测试。其他 shell 可能需要稍微不同的语法。

【讨论】:

【参考方案4】:

我会按照这些思路使用一些东西......

 netstat -rn | grep "default" | awk 'print $2'

【讨论】:

我们如何在 Objective-C 编程中实现这一点。这个有什么框架吗【参考方案5】:

使用系统偏好设置:

第 1 步:点击 Apple 图标(位于屏幕左上方)并选择系统偏好设置。

第 2 步:点击网络。

第 3 步:选择您的网络连接,然后点击“高级”。

第 4 步:选择 TCP/IP 选项卡并找到路由器旁边列出的网关 IP 地址。

【讨论】:

以上是关于如何在 Mac OSX 中获取默认网关的主要内容,如果未能解决你的问题,请参考以下文章

Python通过snmp获取交换机VLAN号VLAN默认网关VLAN子网掩码和ARP表中的IP地址与MAC对应记录数据

检测路由器网关,上网的网卡 MAC地址,ip地址。网关MAC地址。

mac电脑怎么查自己电脑的ip地址、子网掩码和默认网关?

在给定目的地的情况下,如何在 LINUX 中获取默认网关?

Python通过snmp获取交换机VLAN号VLAN默认网关VLAN子网掩码和ARP表中的IP地址与MAC对应记录数据

Python:获取linux中本地接口/ IP地址的默认网关