ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Gnirehtet 命令行 API 全面解析:Android 反向网络共享命令详解与 Escrcpy 集成实践

Gnirehtet 命令行 API 全面解析:Android 反向网络共享命令详解与 Escrcpy 集成实践 Gnirehtet 命令行 API 全面解析Android 反向网络共享命令详解与 Escrcpy 集成实践【免费下载链接】escrcpy Display and control your Android device graphically with scrcpy.项目地址: https://gitcode.com/GitHub_Trending/es/escrcpygnirehtet是一款通过 USB 为 Android 设备提供**反向网络共享reverse tethering**的命令行工具它借助adb隧道让设备直接使用电脑的网络连接上网无需 root、无需 Wi-Fi。本文以仓库中的 Gnirehtet API 文档 为主体系统讲解install、run、start、autorun、tunnel、relay等全部命令的语法、参数与实战示例并结合 Escrcpy 桌面端的源码实现说明这些命令在图形界面中是如何被调用与封装的帮助读者既能在终端中熟练使用也能理解其在项目中的集成原理。本文对应的中文版文档见 docs/zhHans/reference/gnirehtet/api.mdgnirehtet 项目整体介绍见 docs/en/reference/gnirehtet/index.md。一、背景gnirehtet 解决了什么问题反向网络共享的场景非常典型Android 设备没有 Wi-Fi、或希望绕过运营商网络此时可以通过 USB 数据线连接到电脑让设备复用电脑的互联网连接。gnirehtet 正是为此设计无需 root设备端和电脑端都不需要 root 权限跨平台支持 GNU/Linux、Windows 与 macOS基于 adb 隧道使用adb reverse建立设备到电脑的通信通道传输范围目前支持在 IPv4 上中继 TCP 与 UDP 流量尚不支持 IPv6。在 Escrcpy 中gnirehtet 作为反向网络共享Reverse Tethering功能被内置集成当设备无法联网例如使用 OTG 或有线连接时仍需要访问网络资源时可以直接在设备控制栏中一键开启。从 语言资源文件 可以看到其功能文案Gnirehtet provides reverse tethering for Android; Note: Initial connection requires authorization on the device.即首次连接时需要在设备端弹窗授权。二、命令总览gnirehtet 通过子命令的方式对外暴露能力全部命令如下表所示命令用途是否支持serial是否支持-d/-p/-rgnirehtet install在设备上安装客户端并退出✅❌gnirehtet uninstall从设备卸载客户端并退出✅❌gnirehtet reinstall先卸载再安装客户端✅❌gnirehtet run为单一设备一键启用反向网络共享✅✅gnirehtet autorun为所有当前及未来设备启用❌✅gnirehtet start在设备上启动客户端并退出✅✅gnirehtet autostart监听设备接入并自动启动客户端❌✅gnirehtet stop停止指定设备上的客户端✅❌gnirehtet restart停止当前客户端并重启✅✅gnirehtet tunnel设置adb reverse隧道✅仅-pgnirehtet relay在当前终端启动中继服务器❌仅-p通用参数说明serial目标设备的序列号。只有当adb devices输出多于一个设备时才必须提供-d DNS[,DNS2,...]指定设备使用的 DNS 服务器逗号分隔可多个-p PORT指定中继服务器监听的端口。从 index.md 的手动执行示例adb reverse localabstract:gnirehtet tcp:31416可以看出默认端口为 31416-r ROUTE[,ROUTE2,...]仅对指定路由启用反向共享CIDR 格式逗号分隔可多个。若需查看更详细的高级选项直接不带参数执行gnirehtet即可。三、客户端安装与卸载install / uninstall / reinstall3.1 install — 安装客户端在指定的 Android 设备上安装 gnirehtet 客户端一个 APK并退出。若连接了多个设备必须提供serial参数。# 单设备直接安装 gnirehtet install # 多设备时指定序列号 gnirehtet install 1234567890ABCDEF3.2 uninstall — 卸载客户端从指定 Android 设备上卸载客户端并退出gnirehtet uninstall gnirehtet uninstall 1234567890ABCDEF3.3 reinstall — 重装客户端先卸载再安装客户端适用于客户端版本升级或状态异常需要重置的场景gnirehtet reinstall gnirehtet reinstall 1234567890ABCDEFEscrcpy 中的对应实现在 gnirehtet 中间件 中安装命令被封装为install(deviceId)实际执行的是gnirehtet install deviceId设备 ID 会以引号包裹传入避免路径或序列号中的特殊字符破坏命令结构。此外中间件还通过 isInstalled() 调用 adb 的包检测能力检查设备上是否已安装com.genymobile.gnirehtet包从而决定启动前是否需要先安装。四、一键启用run 与 autorun4.1 run — 为单一设备启用反向网络共享run是使用频率最高的命令它自动完成一个完整的工作流必要时安装客户端启动客户端启动中继服务器按下CtrlC时同时停止中继服务器和客户端。# 最简单用法 gnirehtet run # 指定 DNS gnirehtet run -d 8.8.8.8,8.8.4.4 # 指定端口 gnirehtet run -p 8080 # 指定路由 gnirehtet run -r 192.168.1.0/24在 index.md 中强调反向网络共享会一直保持活跃直到按下CtrlC。在 Windows 上可以双击gnirehtet-run.cmd它内部只是执行gnirehtet run而无需打开终端。首次启动时设备端会弹出权限请求授权后状态栏会出现一个钥匙样式的图标表示 gnirehtet 处于活跃状态。Escrcpy 中的对应实现run在桌面端被封装为完整的启动流程见 gnirehtet 中间件 run() 函数先调用stop()清理可能存在的残留进程再调用relay()等待输出中出现Relay server started字样才确认中继服务器就绪见 relay()检查客户端是否已安装除非开启了gnirehtetFix跳过检查最后执行start启动客户端。4.2 autorun — 为所有设备启用反向网络共享autorun面向多设备场景它持续监控设备接入对每个检测到的设备自动启动客户端autostart启动中继服务器。gnirehtet autorun gnirehtet autorun -d 8.8.8.8,8.8.4.4 gnirehtet autorun -p 8080 gnirehtet autorun -r 192.168.1.0/24它适合插上设备就自动联网的场景无需逐个设备手动操作。五、单步控制start / autostart / stop / restartrun与autorun适合整体接管当你需要更细粒度地控制例如同时为多台设备分别启动时可以使用单步命令让中继服务器保持常驻、客户端独立启停。5.1 start — 启动客户端并退出在 Android 设备上启动客户端后命令即退出中继服务器需另行常驻。参数行为如下指定-d设备使用指定的 DNS 服务器指定-r仅对指定路由启用反向共享指定-p中继服务器监听指定端口。# 基本启动 gnirehtet start # 指定设备序列号 gnirehtet start 1234567890ABCDEF # 指定 DNS gnirehtet start -d 8.8.8.8,8.8.4.4 # 指定端口 gnirehtet start -p 8080 # 指定路由 gnirehtet start -r 192.168.1.0/24Escrcpy 中的对应实现中间件的 start() 支持通过options.append追加额外参数实际执行gnirehtet start deviceId append。这一append参数正是来自偏好设置中的Gnirehtet ArgumentsgnirehtetAppend配置项。5.2 autostart — 监听设备并自动启动客户端autostart监听设备连接为每个检测到的设备启动客户端。它接受与start相同的参数但无需也不能指定 serial序列号会自动从检测到的设备获取。gnirehtet autostart gnirehtet autostart -d 8.8.8.8,8.8.4.4 gnirehtet autostart -p 8080 gnirehtet autostart -r 192.168.1.0/245.3 stop — 停止客户端停止指定 Android 设备上的客户端并退出gnirehtet stop gnirehtet stop 1234567890ABCDEFEscrcpy 中的对应实现中间件的 stop() 会先通过processManager.kill()终止所有已托管的 gnirehtet 子进程包括中继服务器再执行gnirehtet stop deviceId通知设备端停止客户端。应用退出前quit-before事件也会调用它做清理。5.4 restart — 重启客户端停止当前客户端并重新启动参数与start一致gnirehtet restart gnirehtet restart 1234567890ABCDEF gnirehtet restart -d 8.8.8.8,8.8.4.4 gnirehtet restart -p 8080 gnirehtet restart -r 192.168.1.0/24适用于客户端运行异常或网络参数需要变更时快速恢复。六、隧道与中继tunnel / relay6.1 tunnel — 设置 adb reverse 隧道tunnel用于建立/重置adb reverse隧道。典型场景gnirehtet 运行期间如果设备被拔下又重新插上重置隧道即可恢复连接。gnirehtet tunnel gnirehtet tunnel 1234567890ABCDEF gnirehtet tunnel -p 8080从 index.md 的手动执行章节可以看到其底层等价命令adb reverse localabstract:gnirehtet tcp:31416即把设备端的localabstract:gnirehtet抽象 socket 映射到电脑端的tcp:31416端口这也是默认端口 31416 的来源。Escrcpy 中的对应实现中间件 tunnel() 直接封装为gnirehtet tunnel deviceId供需要重置连接时调用。6.2 relay — 启动中继服务器relay在当前终端启动中继服务器保持前台运行。它是整个反向网络共享的数据中枢设备端流量经由 adb 隧道汇聚到中继服务器再由它转发到电脑的真实网络。gnirehtet relay gnirehtet relay -p 8080Escrcpy 中的对应实现中间件 relay() 以 Promise 方式包装了该命令通过监听 stdout 中是否出现Relay server started来判定启动成功并 resolve若 stderr 报错则 reject交由上层捕获并抛出 Gnirehtet Relay fail 提示。6.3 手动执行底层命令如果你不想依赖gnirehtet封装的 CLI也可以完全手动执行底层命令见 index.md# 1. 启动中继服务器 ./gnirehtet relay # 2. 安装 APK adb install -r gnirehtet.apk # 3. 建立隧道并启动客户端 adb reverse localabstract:gnirehtet tcp:31416 adb shell am start -a com.genymobile.gnirehtet.START \ -n com.genymobile.gnirehtet/.GnirehtetActivity # 4. 停止客户端 adb shell am start -a com.genymobile.gnirehtet.STOP \ -n com.genymobile.gnirehtet/.GnirehtetActivity这一层手动流程清晰地揭示了各命令背后的真实动作install≈adb install -r gnirehtet.apkstart≈adb reverseam startstop≈am start ... STOP。七、环境变量与运行前提7.1 环境变量gnirehtet 支持通过两个环境变量覆盖默认路径# 自定义 adb 可执行文件路径 ADB/path/to/my/adb ./gnirehtet run # 自定义 gnirehtet.apk 路径 GNIREHTET_APK/usr/share/gnirehtet/gnirehtet.apk ./gnirehtet run7.2 运行前提Android 客户端要求设备系统API 21Android 5.0及以上需要较新的adb支持adb reverse1.0.36 即可用可通过 Android SDK platform-tools 获取设备端需开启 USB 调试并完成授权gnirehtet 本身有两种实现Java 版与 Rust 版推荐使用Rust 版原生二进制占用更少 CPU 与内存且不依赖 Java 运行时环境Java 版仅作为备选需要电脑安装 Java 8 JRE。八、Escrcpy 中的集成从命令到图形界面理解命令行 API 之后再看它在 Escrcpy 中如何被组织会事半功倍。8.1 中间件层命令封装与进程管理desktop/electron/middleware/gnirehtet/index.js 是命令层的核心封装统一的 shell() 通过sheller(gnirehtet command)拼装命令并交给 ProcessManager 托管保证应用退出或切换时能统一 kill 进程错误统一经normalizeGnirehtetError归一化为stderr或message后抛出对外导出relay / install / isInstalled / start / stop / tunnel / run / killProcesses等能力与本文的命令一一对应。8.2 偏好设置路径、附加参数与修复开关在 偏好设置模型 common/index.js 中可以看到三个与 gnirehtet 直接相关的配置项Gnirehtet PathgnirehtetPath自定义 gnirehtet 可执行文件路径用于提供反向网络共享Gnirehtet ArgumentsgnirehtetAppend以文本域形式追加额外参数到 gnirehtet 命令中配置提示明确说明输入的参数会直接追加到命令末尾不会过滤重复参数Gnirehtet FixgnirehtetFix开启后跳过gnirehtet.apk的安装检查可能改善部分设备的连接问题代价是可能每次启动都会重新安装 APK。其中gnirehtetAppend在中间件 run() 中会替换换行、去空白后拼入start命令gnirehtetFix则在 L97-L101 决定是否调用isInstalled检查——这正是命令行-d/-p/-r参数在图形界面中的灵活入口。8.3 界面层控制栏的一键启停设备控制栏组件 control-bar/gnirehtet/index.vue 提供Start Service / Stop Service下拉菜单分别调用$gnirehtet.run(device.id)与$gnirehtet.stop(device.id)并带 loading 状态与成功/失败消息反馈业务编排层 use-gnirehtet-action/index.js 定义了start/stop两种模式支持对设备数组批量执行成功或失败时以 ElMessage 提示多设备场景下还支持在浮动控制菜单floating中通过系统级右键菜单选择启停操作。九、典型使用流程小结终端场景单设备最省心./gnirehtet run终端场景多设备分别控制./gnirehtet relay # 终端 A中继服务器常驻 ./gnirehtet start serial # 终端 B为每个设备启动客户端 ./gnirehtet stop serial # 需要时停止Escrcpy 图形界面场景连接设备后在设备控制栏选择Reverse Tethering反向网络共享→ Start Service 即可如需自定义 DNS/端口/路由可在偏好设置 → 全局设置的 Gnirehtet Arguments 中追加-d、-p、-r参数。结语gnirehtet 的命令行 API 设计非常清晰install/uninstall/reinstall负责客户端生命周期run/autorun提供一键接管start/autostart/stop/restart提供细粒度控制tunnel/relay负责底层隧道与数据中继。而 Escrcpy 通过中间件封装、偏好设置映射与图形界面按钮把这一套命令无缝集成到了桌面应用中——即使你不熟悉命令行也可以在界面中享受同样的能力熟悉命令行的开发者则可以在终端中直接获得最大灵活性。【免费下载链接】escrcpy Display and control your Android device graphically with scrcpy.项目地址: https://gitcode.com/GitHub_Trending/es/escrcpy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表