在安卓系统中获取网关IP地址

30

如何获得网关IP详细信息, 使用Wifimanager是一种选项,但是如果没有WiFi,当通过USB网络共享连接Android设备时如何找到网关、DNS和其他详细信息。


你可以尝试使用Muhammad Zeeshan提供的链接中提供的解决方案,或者你可以使用以下方法实现HTTP跟踪...[HTTP Trace](http://developer.android.com/reference/org/apache/http/client/methods/HttpTrace.html#HttpTrace%28java.net.URI%29) - Anoop Chandrika HarisudhanNair
1
你也可以使用RoutetoHost来获取到主机的路径,第一个IP地址将会是网关(如果没有使用代理)。 - Anoop Chandrika HarisudhanNair
请研究Connectivity Manager - Anoop Chandrika HarisudhanNair
实际上,网关、DNS和其他细节将由移动运营商提供,但对于移动用户来说是隐藏的。您可以查看APN设置以获取更多详细信息。 - Anoop Chandrika HarisudhanNair
9个回答

24

我正在使用安卓2.3.4上的CyanogenMod 7.2,然后只需打开终端模拟器并输入:

$ ip addr show
$ ip route show

对于Android 4.4 KitKat,我也使用了终端模拟器应用程序并输入了此处提供的命令。它有效。 - skstar
棒棒糖5.0.1。对我也有效。 - JoelAZ

17

在 Android 7 上可以工作:

 ip route get 8.8.8.8

输出结果将为: 通过网关 8.8.8.8 ...


1
谢谢!在大多数Linux系统上,netstat -rnip route show都可以工作,但在Android上只有ip route get会显示网关。 - tmm1
在我的情况下,ip route show 只输出广播地址,而 ip route get 可以正常工作。 - Yeung

16

我想把这个答案发布为近期Android版本(CM11/KitKat/4.4.4)用户的更新。我没有在TouchWiz或旧的Android版本上测试过,所以可能会有差异。

以下命令可以在所有常规位置运行(ADB、终端模拟器、shell脚本、Tasker)。

列出所有可用属性:

getprop

获取WiFi接口:

getprop wifi.interface

WiFi属性:

getprop dhcp.wlan0.dns1
getprop dhcp.wlan0.dns2
getprop dhcp.wlan0.dns3
getprop dhcp.wlan0.dns4
getprop dhcp.wlan0.domain
getprop dhcp.wlan0.gateway
getprop dhcp.wlan0.ipaddress
getprop dhcp.wlan0.mask
以上命令将输出信息,无论WiFi是否实际连接。
请使用以下任一命令检查是否打开了:
ifconfig wlan0

netcfg | awk '{if ($2=="UP" && $3 != "0.0.0.0/0") isup=1} END {if (! isup) exit 1}'

使用以下任一方法获取wlan0的IP地址(仅在其已连接时):

ifconfig wlan0 | awk '{print $3}'

netcfg | awk '/^wlan0/ {sub("(0\\.0\\.0\\.0)?/[0-9]*$", "", $3); print $3}'

为了全面准确地获取您的公网IP地址,您需要使用外部服务。要获取您的公网IP,请执行以下操作:

wget -qO- 'http://ipecho.net/plain'

获取你的公共主机名:

wget -qO- 'http://ifconfig.me/host'

或者直接通过你的IP地址获取你的公共主机名:

(nslookup "$(wget -qO- http://ipecho.net/plain)" | awk '/^Address 1: / { if ($NF != "0.0.0.0") {print $NF; exit}}; /name =/ {sub("\\.$", "", $NF); print $NF; exit}') 2>/dev/null

注意:上述的 awk 命令似乎过于复杂,只是因为它能够处理来自不同版本的 nslookup 的输出。Android 包含了一个最简版本的 nslookup 作为 busybox 的一部分,但也有一个独立的版本(通常包含在 dnsutils 中)。


Android 7.0没有getprop dhcp命令。 - Aero Wang

4

打开终端

$ adb -s UDID shell
$ ip addr | grep inet 
or
$ netcfg | grep inet

1
此帖子被自动标记为低质量,因为它只包含代码。您能否通过添加一些解释性文本来扩展它,以便说明它的工作原理/如何解决问题? - gung - Reinstate Monica
@gung 不是的。那只是自己分配的 IP 地址,而不是网关地址... - Aero Wang

2

DNS服务器是通过以下方式获取的

getprop net.dns1 

更新:从Android Nougat 7.x开始,ifconfig已经存在,而netcfg已经消失。因此,可以使用ifconfig来查找IP和网络掩码。


那跟网关地址有什么关系? - rakslice
3
如果没有Wifi,如何找到网关、DNS和其他细节?在原帖中没有其他回答提供这些细节。 - Kevin
为什么这个列表会列出我不想让设备使用的DNS服务器(IPv6),而且它似乎更喜欢使用这些DNS服务器,而不是应该使用的dhcp.wlan0.dns*条目? - Michael
1
@rakslice 不会。一些家用路由器的 DNS 和网关 IP 地址与路由器地址相同。 - Aero Wang

2

请尝试以下方法:

ConnectivityManager connectivityManager = ...;
LinkProperties linkProperties = connectivityManager.getLinkProperties(connectivityManager.GetActiveNetwork());
for (RouteInfo routeInfo: linkProperties.getRoutes()) {
    if (routeInfo.IsDefaultRoute() && routeInfo.hasGateway()) {
        return routeInfo.getGateway();
    }
}

调用需要API级别29 - whalemare
1
RouteInfo.hasGateway 调用是 API 级别 29,但 RouteInfo.getGateway 在 API 级别 21 仍然有用。另外需要注意的是,ConnectivityManager.GetActiveNetwork 已在 API 级别 29 中被弃用。 - Brent

1
这对我来说似乎很有效。在Touchwiz 5.1、LineageOS 7.1和CyanogenMod 11上进行了测试。
ip route list match 0 table all scope global

提供类似以下输出的结果:
default via 192.168.1.1 dev wlan0  table wlan0  proto static

0

3
您提到的解决方案使用了wifimanager,但在设备未连接到wifi时无法使用。当设备通过USB共享网络或GPRS连接时,该如何查找这些详细信息? - Himanshu

0

安装终端模拟器应用程序,然后从命令提示符中运行iproute以查看路由表。不需要root权限。我不知道如何获取DNS服务器。没有/etc/resolv.conf文件。您可以尝试nslookup www.google.com并查看它对您的服务器报告了什么,但在我的手机上,它报告了0.0.0.0,这并不太有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接