WSL 通过 adb 连接宿主机下的安卓设备

CListery ARE YOU OK?

本教程将会教你如何在不修改 wsl 内核和不安装多余的插件的情况下通过 ssh 创建隧道再通过 adb 连接宿主机下的 android 设备

环境说明

  1. 宿主机: Windows 10 (19045.5608)
  2. wsl: Ubuntu 24.04.3 LTS

必备知识

首先学习一下 adb 的工作方式, adb 采用 客户端<->服务端<->设备 的架构

  • adb server: 服务端, 这是一个在 PC 上长期运行的后台进程, 当执行 adb 命令时都会先与该服务通信
  • adb daemon: 守护进程(adbd), 该进程是在 android 设备上运行的后台进程
  • adb client: 客户端, 这是我们在 PC 上执行 adb 命令时调用的程序, 每当执行一条该命令, 都是一个独立的客户端
  • 5037 端口: adb server 通信端口(这个端口是由 Android 开源项目在最初设计时人为指定的, 为了避免与其他常见服务冲突而规定的端口)

原理

通过 ssh 将 wsl 中的 5037 端口转发到宿主机的 0.0.0.0:5037 端口, 从而实现 wsl 中的 adb client 连接到 windows 的 adb server, 通过 ssh 转发后相当于直接将 wsl 的端口绑定到宿主机了, 宿主机连接了哪些设备, 相应的, wsl 中的 adb server 也连接了这些端口

必要环境

在 wsl 中执行以下命令

1
2
sudo apt install openssh-server
sudo service ssh restart

创建 SSH 转发隧道

在 windows 中执行以下命令

1
ssh -R 0.0.0.0:5037:127.0.0.1:5037 <wsl_user>@<wsl_ip> -f -N

命令分解

  • -R

    这是关键参数,表示远程端口转发(Reverse tunneling):

    • 本地机器:SSH 客户端所在的机器(执行命令的地方)
    • 远程机器:SSH 服务器所在的机器(username@wsl_ip)
  • 0.0.0.0:5037:127.0.0.1:5037

    这个格式是 [远程绑定地址]:[远程端口]:[本地地址]:[本地端口]

    • 0.0.0.0:5037(远程端):

      0.0.0.0:在远程机器上监听所有网络接口

      5037:在远程机器上打开的端口

    • 127.0.0.1:5037(本地端):

      127.0.0.1:本地回环地址(localhost)

      5037:本地机器上的 ADB Server 端口

  • <wsl_user>@<wsl_ip>

    ssh 连接的目标机器和用户

    • wsl_user: wsl 中的用户名
    • wsl_ip: wsl 的 IP 地址
  • -f

    后台运行

  • -N

    不执行远程命令,只建立隧道

数据流向图解

1
2
3
4
5
6
  远程机器 (WSL)                     本地机器 (Windows)
↓ ↓
0.0.0.0:5037 ←→ SSH隧道 ←→ 127.0.0.1:5037
(监听所有接口) (ADB Server)
↑ ↑
WSL中的ADB Client Windows中的ADB Server

可能遇到的问题

  • 创建隧道后,wsl 还是无法访问到设备:

    在 wsl 执行 adb kill-server 再重试 adb devices

  • 如何关闭该隧道

    选其一即可

    • 在 Windows 的任务管理器中找到名称为 ssh 的任务,终止
    • 在 CMD 中输入 taskkill /F /IM ssh.exe
    • 在 WSL 中输入 pkill sshd
  • 标题: WSL 通过 adb 连接宿主机下的安卓设备
  • 作者: CListery
  • 创建于 : 2025-10-16 17:22:57
  • 更新于 : 2025-12-05 11:01:11
  • 链接: http://clistery.github.io/2025/10/16/wsl/adb-connect-host-android-device/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论