使用adb shell连接WiFi

35

我已经获得了连接到特定接入点所需的所有详细信息。 我必须只使用该接入点,因此我需要的是执行此操作的命令。


你想要实现什么? - Diego Torres Milano
1
我必须自动化一些仅适用于Wi-Fi的事情。我可以使用Monkey并单击设置->等等,但最后一个问题是如何选择网络ABC,因为可能有多个可用网络。因此,如果我能获得一个命令,我就可以立即使用SSID和密码完成操作 :) - Rohan
为了补充答案:https://dev59.com/vWkv5IYBdhLWcg3w40sY - EthraZa
我已经更新了wpa_supplicant.conf文件中的新SSID和密码,启用了wifi,但在Nexus 4上似乎无法正常工作,Lolipop版本。 Wifi打开但返回到我通过UI使用的原始SSID。 我还注意到我的更新文件被早期的SSID覆盖了。 我已将chown更改为system.wifi。 我在这里做错了什么吗? 我看到一些帖子谈论sqlite3。 我们需要在数据库中更改任何内容吗? - TusharG
wpa_cli的方式:https://dev59.com/amEh5IYBdhLWcg3wEwDv - domen
7个回答

30

虽然迟到了,但我想出了一种在没有root的设备上实现此功能的方法。

可能不太美观,但是它能够工作。

基本上,我的建议是创建一个应用程序,根据启动应用程序时给出的EXTRAS来加入访问点。然后使用am命令的-e <KEY> <VALUE>参数提供EXTRAS

我已经构建了一个这样做的应用程序,它可以在此处找到:https://github.com/steinwurf/adb-join-wifi

安装应用程序后,可以使用以下ADB命令加入wifi访问点:

adb shell am start -n com.steinwurf.adbjoinwifi/com.steinwurf.adbjoinwifi.MainActivity -e ssid [SSID] -e password_type [PASSWORD_TYPE] -e password [WIFI PASSWORD]

请参阅Github上的README获取更多信息。

希望对某些人有所帮助。


1
谢谢你的支持 - 这是个好主意! - jfrumar
@JulianFrumar 如何知道路由器的密码类型? - Suban Dhyako
@Suban Dhyako,你的路由器设置应该会告诉你它使用的密码/安全类型。此外,在Android的WiFi屏幕上,如果你点击一个网络,它会告诉你安全类型。现在大多数路由器都会设置为WPA2或WPA,似乎在adb命令中输入WPA将适用于WPA或WPA2。另外,作为作者的一条注释,这个方法非常有效,谢谢。但是在github上的多行命令格式对我不起作用,而单行命令则可以。 - gamingexpert13
@gamingexpert13 谢谢,很高兴听到它对你有用。多行可能只在Linux上有效 :) - jpihl
嘿,我在尝试使用你的应用程序,但当我运行命令时,它显示“此应用程序应与ADB一起使用”,我做错了什么? - dam1ne
嗨@dam1ne,就我所记得的,当您从启动器启动手机上的应用程序时,该消息会显示出来。此应用程序旨在从ADB启动。您是否按照自述文件中的说明进行操作:https://github.com/steinwurf/adb-join-wifi/blob/master/README.rst#usage - jpihl

27

你可以在wpa_supplicant.conf文件中自己添加一个网络条目(或在脚本中添加)。首先手动连接一次,然后执行以下操作:

adb pull /data/misc/wifi/wpa_supplicant.conf

并将网络输入集成到您的脚本中以进行自动化。 示例简单脚本:

#!/bin/bash
#

# Get this information by connecting manually once, and do
#   adb pull /data/misc/wifi/wpa_supplicant.conf
ADB_PULL="adb pull /data/misc/wifi/wpa_supplicant.conf"
WIRELESS_CTRL_INTERFACE=wlan0
WIRELESS_SSID=Gondolin
WIRELESS_KEY_MGMT="WPA-EAP IEEE8021X"
WIRELESS_EAP=PEAP
WIRELESS_USER=Turgon
WIRELESS_PASSWORD=IdrilCelebrindal

adb start-server
adb wait-for-device
echo "adb connection....[CONNECTED]"
adb root
adb wait-for-device
adb remount
adb wait-for-device

pushd /tmp
rm wpa_supplicant.conf 2>/dev/null # Remove any old one
adbpull_status=`$ADB_PULL 2>&1`
echo -e "\nAttempting: $ADB_PULL"
if [ `echo $adbpull_status | grep -wc "does not exist"` -gt 0 ]; then
    echo "  wpa_supplicant.conf does not exist yet on your device yet."
    echo "This means you have not used your wireless yet."
    echo ""
    echo "Taking our best shot at creating this file with default config.."

    echo "ctrl_interface=$WIRELESS_CTRL_INTERFACE" >> wpa_supplicant.conf
    echo "update_config=1" >> wpa_supplicant.conf
    echo "device_type=0-00000000-0" >> wpa_supplicant.conf
else
    echo $adbpull_status
    echo "  wpa_supplicant.conf exists!"
fi

echo ""
echo "Add network entry for wpa_supplicant.conf.."
echo "" >> wpa_supplicant.conf
echo "network={" >> wpa_supplicant.conf
echo "  ssid=\"$WIRELESS_SSID\"" >> wpa_supplicant.conf
echo "  key_mgmt=$WIRELESS_KEY_MGMT" >> wpa_supplicant.conf
echo "  eap=$WIRELESS_EAP" >> wpa_supplicant.conf
echo "  identity=\"$WIRELESS_USER\"" >> wpa_supplicant.conf
echo "  password=\"$WIRELESS_PASSWORD\"" >> wpa_supplicant.conf
echo "  priority=1" >> wpa_supplicant.conf
echo "}" >> wpa_supplicant.conf
echo "Pushing wpa_supplicant.conf.."
adb push wpa_supplicant.conf /data/misc/wifi/wpa_supplicant.conf
popd #/tmp

adb shell chown system.wifi /data/misc/wifi/wpa_supplicant.conf
adb shell chmod 660 /data/misc/wifi/wpa_supplicant.conf

echo ""
echo "Finished!"
adb shell am start -a android.intent.action.MAIN -n com.android.settings/.Settings
echo "Please toggle wifi off/on now.. (ifconfig not sufficient, monkey this)"

3
在Ubuntu系统中,可以使用命令wpa_passphrase ssid passphrase,将输出内容复制到Android设备上。这在我的三星平板电脑上运行良好。 - wojciii
5
可以,适用于已经取得 root 权限的设备。但真的帮助我解锁了我的设备。非常感谢你提供这些有用的方法。我使用了 svc wifi disablesvc wifi enable 命令,而不是在设置中切换。 - ony
经过4个小时的密集搜索,寻找如何连接WiFi的解决方案,但绝对没有任何作用,这个解决方案就像魔法咒语一样神奇!此外,还添加了svc重启的编辑建议,就像@ony建议的那样。 - Deko

11

您可以使用以下命令adb shell cmd -w wifi connect-network(带有这些参数)

-  connect-network  open|owe|wpa2|wpa3 [] [-m] [-d] [-b ] [-r auto|none|persistent|non_persistent]
    使用提供的参数连接到网络并将其添加到已保存的网络列表中。
    open|owe|wpa2|wpa3 - 网络的安全类型。
     - 网络的SSID
        -对于没有密码的网络,请使用“open”或“owe”
           - 'open' - 开放式网络(最常见)
           - 'owe' - 增强型开放式网络
        - 对于具有密码的网络,请使用“wpa2”或“wpa3”
           - 'wpa2' - WPA-2 PSK网络(最常见)
    -m - 标记网络计量。
           - 'wpa3' - WPA-3 PSK网络
    -d - 标记禁用网络自动加入。
    -h - 标记隐藏网络。
    -p - 标记网络为私人(不共享)。
    -b  - 设置特定的BSSID。
    -r auto|none|persistent|non_persistent - MAC随机化方案,用于该网络。

要连接到wpa2验证且密码为“qwertyuiop”的WiFi网络“Home”,请使用以下命令:

adb shell cmd -w wifi connect-network Home wpa2 qwertyuiop

连接到一个名为“Public”的开放式WiFi网络,请使用以下方法

adb shell cmd -w wifi connect-network Public open

在我的手机上,常用的命令是 adb shell cmd wifi,不需要加上 -w - lambda
我的设备中没有“-h”参数。为什么会这样? - 赵小甲
我的Wi-Fi名称中有空格和一个感叹号。'Fr!tzBox 3423' 我该如何传递它?它会提示连接网络的无效参数:java.lang.IllegalArgumentException: Unknown network type 3423 - ir2pid
解决在SSID中使用空格的方法是使用 \。命令将变为 adb shell cmd wifi connect-network 'FRITZ!Box\ 3423' wpa2 password123 - ir2pid
一个特别的优点是,这不需要设备的PIN码,只需要ADB(之前必须授予访问权限)。 - undefined

11

作为额外的内容: 你可以在设备上以root权限通过svc启用wifi

svc wifi enable

并通过禁用进行

svc wifi disable

这需要设备被root,但出于安全原因,我们不应建议用户对设备进行root。 - Humble_PrOgRaMeR
@RajA.P.:感谢您的反馈。除了@jpihl的方法之外,似乎所有的方法都需要设备已经root,只是没有明确说明而已。如果您给他们投了反对票:您是不是把它们全部都投了反对票? - serv-inc
我尝试了上述命令,它告诉我设备已被root,而我正在使用我的企业设备,我不想冒险。 - Humble_PrOgRaMeR
@RajA.P.:在这种情况下,jpihl上面的答案可能会起作用(正如您所看到的,此答案有点老)。 - serv-inc
能否使用此功能取决于设备。我可以在我的S21 FE上使用此功能,但不允许使用“cmd wifi connect-network”。 - DariusL

2
作为另一个补充:尽管我的设备已经root,但在尝试执行adb pull时,我遇到了“remote object '/data/misc/wifi/wpa_supplicant.conf' does not exist”错误。这是因为adb本身不以ROOT模式运行。要解决这个问题,你可以执行类似以下的命令:
adb shell "su -c 'cp -R /data/misc/wifi/wpa_supplicant.conf /data/misc/wpa_supplicant.conf'"
adb shell "su -c 'chmod -R 777 /data/misc/wpa_supplicant.conf'"
adb pull /data/misc/wpa_supplicant.conf
adb shell "su -c 'rm /data/misc/wpa_supplicant.conf'"

2

虽然有点晚了,但我希望这篇文章能对那些遇到此问题的人有所帮助。

如果您正在尝试使用adb pull方法,但收到“远程对象不存在”的消息,请尝试以下操作:

在同一个命令提示框中,

  • 输入adb root以以root身份重新启动adb。 点击回车。
  • 现在输入adb shell,点击回车。确保提示显示为root@[device]:
  • 在#提示符下键入cd /data/misc/wifi,点击回车。
  • 最后输入cat wpa_supplicant.conf,点击回车。

这将会将您的手机之前连接的WiFi数据转储到您的PC屏幕上。

这些命令在我的未root设备上运行时遇到“远程对象不存在”问题后也可以正常工作。


C:\Program Files (x86)\Minimal ADB and Fastboot>adb shell........................................................ shell@android:/ $ cd /data/misc/wifi.............................................‌​....................‌​....................‌​........... /system/bin/sh: cd: /data/misc/wifi: 权限被拒绝 (Permission denied)......................................................‌​............. 2|shell@android:/ $ cat wpa_supplicant.conf.........................................‌​....................‌​.................. - user2340356
/system/bin/sh: cat: wpa_supplicant.conf: 没有那个文件或目录。 1|shell@android:/ $ cd /data/misc/wifi /system/bin/sh: cd: /data/misc/wifi: 权限被拒绝。 - user2340356
这是我运行这些命令时得到的结果:(。我有一台三星Galaxy相机,Android版本为4.1.2。也许存在安全漏洞,我可以利用它来检索WiFi密码? - user2340356
仅适用于已Root的设备 :) - Rohan

2
我通过以下方法解决了这个问题:adb pull /data/misc/wifi/wpa_supplicant.conf ~/Desktop,然后编辑文件,添加网络模块,我的整个配置文件如下:
##### wpa_supplicant configuration file template #####
update_config=1
ctrl_interface=DIR=/data/system/wpa_supplicant GROUP=wifi
eapol_version=1
ap_scan=1
fast_reauth=1
network={
    ssid="your ssid"
    psk="your pswd"
    key_mgmt=WPA-PSK
    priority=241
}

然后删除原文件,将其推送到/data/misc/wifi文件夹中,重新启动设备。请注意,不同的设备在网络线上方具有不同的内容,请勿修改该部分。


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