ngrok實現(xiàn)adb wifi連接的內(nèi)網(wǎng)穿透

? 大家都知道,android的adb連接支持wifi調(diào)試,有個前提是需要android手機和電腦在同一個網(wǎng)絡中撕蔼。那么怎么做到在不同網(wǎng)段達到控制android手機的目的呢?
? 這里用到了一個熱門的內(nèi)網(wǎng)穿透工具ngrok,借助ngrok我們可以實現(xiàn)在不同網(wǎng)絡環(huán)境adb連接到手機吆视。
接下來手把手教大家怎么做。

1.搭建ngrok服務器

需要一臺公網(wǎng)服務器酥宴,假設你訪問公網(wǎng)服務器的的域名為ngrok.domain.com
同樣假設服務器上已經(jīng)安裝go的開發(fā)環(huán)境和git
如果沒有安裝:下面以centos為例:

yum install gcc -y

yum install git -y

yum install mercurial git bzr subversion golang golang-pkg-windows-amd64 golang-pkg-windows-386 -y

下載源碼:

git clone https://github.com/inconshreveable/ngrok.git

生成證書:

cd ngrok  

mkdir cert 

cd cert

export NGROK_DOMAIN="ngrok.domain.com"

openssl genrsa -out rootCA.key 2048

openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem

openssl genrsa -out device.key 2048

openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr

openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
#替換證書
cp rootCA.pem ../assets/client/tls/ngrokroot.crt

cp device.crt ../assets/server/tls/snakeoil.crt

cp device.key ../assets/server/tls/snakeoil.key

回到ngrok目錄啦吧,生成服務端與客戶端:
這里我們暫時先只需要生成linux服務端,后面再講述如何生成安卓的client端

<!--linux服務端-->
GOOS=linux GOARCH=386 make release-server (32位)
GOOS=linux GOARCH=amd64 make release-server(64位)

<!--Mac OS客戶端-->
GOOS=darwin GOARCH=386 make release-client
GOOS=darwin GOARCH=amd64 make release-client

<!--windows客戶端-->
GOOS=windows GOARCH=386 make release-client
GOOS=windows GOARCH=amd64 make release-client

啟動服務器:

#這里運行ngrok服務器為nohup模式拙寡,其中httpAddr參數(shù)指定映射域名http訪問的端口授滓,httpsAddr是https的訪問端口,tunnelAddr為客戶端連接的端口肆糕,這里筆者修改成其它端口是因為服務上相應的80般堆,443,和默認的4443端口被占用了
nohup ./bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="$NGROK_DOMAIN" -httpAddr=":81" -httpsAddr=":444" -tunnelAddr=":4444" > server.log &
#檢查服務器運行狀態(tài)
tail -f server.log

2.生成ngrok的android client

這里我們用go的一條命令可以看到 支持的os和arch列表

$ go tool dist list
android/386
android/amd64
android/arm
android/arm64
....
windows/386
windows/amd64

我們可以看到支持編譯生成android的arm擎宝,是不是意味著我們可以直接用下面的命令生成呢郁妈?

GOOS="android" GOARCH="arm64" CGO_ENABLED="0" make release-client

答案是否定的。

系統(tǒng)自帶的gcc绍申、clang等編譯器都不支持Android平臺噩咪,我們需要安裝 Android NDK。

如果 Android NDK 網(wǎng)址打不開极阅,請掛上vpn胃碾,或百度搜索 Android NDK 下載

安裝配置方法參考了這個網(wǎng)址,編譯可在Android設備上運行的Go語言程序

假設下載解壓后的目錄為/opt/android-ndk

export ANDROID_NDK_ROOT=/opt/android-ndk
#按需安裝 Android 獨立工具鏈
#Android 獨立工具鏈安裝目錄統(tǒng)一為 $ANDROID_NDK_ROOT/bin
# android/arm
$ANDROID_NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-16 --install-dir=$ANDROID_NDK_ROOT/bin/arm-linux-androideabi/ --arch=arm
# android/arm64
$ANDROID_NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-21 --install-dir=$ANDROID_NDK_ROOT/bin/aarch64-linux-android/ --arch=arm64
# android/386
$ANDROID_NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-16 --install-dir=$ANDROID_NDK_ROOT/bin/i686-linux-android/ --arch=x86
# android/amd64
$ANDROID_NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-21 --install-dir=$ANDROID_NDK_ROOT/bin/x86_64-linux-android/ --arch=x86_64

#或者使用python安裝
# android/arm
$ANDROID_NDK_ROOT/build/tools/make_standalone_toolchain.py --api=16 --install-dir=$ANDROID_NDK_ROOT/bin/arm-linux-androideabi/ --arch=arm
# android/arm64
$ANDROID_NDK_ROOT/build/tools/make_standalone_toolchain.py --api=21 --install-dir=$ANDROID_NDK_ROOT/bin/aarch64-linux-android/ --arch=arm64
# android/386
$ANDROID_NDK_ROOT/build/tools/make_standalone_toolchain.py --api=16 --install-dir=$ANDROID_NDK_ROOT/bin/i686-linux-android/ --arch=x86
# android/amd64
$ANDROID_NDK_ROOT/build/tools/make_standalone_toolchain.py --api=21 --install-dir=$ANDROID_NDK_ROOT/bin/x86_64-linux-android/ --arch=x86_64

#安裝完成Android 獨立工具鏈筋搏,CC 編譯器的位置分別為

#android/arm
CC=$ANDROID_NDK_ROOT/bin/arm-linux-androideabi/bin/arm-linux-androideabi-gcc

#android/arm64
CC=$ANDROID_NDK_ROOT/bin/aarch64-linux-android/bin/aarch64-linux-android-gcc

#android/386
CC=$ANDROID_NDK_ROOT/bin/i686-linux-android/bin/i686-linux-android-gcc

#android/amd64
CC=$ANDROID_NDK_ROOT/bin/x86_64-linux-android/bin/x86_64-linux-android-gcc

#編譯Android的Go語言程序
#需要指定 CC 編譯器的位置

# android/arm
CC=$ANDROID_NDK_ROOT/bin/arm-linux-androideabi/bin/arm-linux-androideabi-gcc GOOS="android" GOARCH="arm" CGO_ENABLED="1" go build
# android/arm64
CC=$ANDROID_NDK_ROOT/bin/aarch64-linux-android/bin/aarch64-linux-android-gcc GOOS="android" GOARCH="arm64" CGO_ENABLED="1" go build
# android/386
CC=$ANDROID_NDK_ROOT/bin/i686-linux-android/bin/i686-linux-android-gcc GOOS="android" GOARCH="386" CGO_ENABLED="1" go build
# android/amd64
CC=$ANDROID_NDK_ROOT/bin/x86_64-linux-android/bin/x86_64-linux-android-gcc GOOS="android" GOARCH="amd64" CGO_ENABLED="1" go build

接下來生成ngrok的android的client端
這里筆者的手機是arm的仆百,不是arm64,這里因為搞錯了android的位數(shù)奔脐,結(jié)果導進去之后無法運行

#在ngrok目錄下執(zhí)行下面命令
CC=$ANDROID_NDK_ROOT/bin/arm-linux-androideabi/bin/arm-linux-androideabi-gcc GOOS="android" GOARCH="arm" CGO_ENABLED="1" make release-client

檢查生成的二進制文件

$ tree bin

bin

├── android_arm

│ └── ngrok

├── android_arm64

│ └── ngrok

├── darwin_amd64

│ └── ngrok

├── go-bindata

└── ngrokd

3.導入ngrok client端和配置到android 手機

這里需要兩個文件俄周,一個是ngrok的client的二進制文件吁讨,上面我們已經(jīng)生成出來了

還需要一個ngrok.cfg配置文件

下面是配置文件的樣例

#填寫服務器域名和連接端口
server_addr: ngrok.domain.com:4444
trust_host_root_certs: false
tunnels:
 adb:
 #這里的remote_port是指從ngrok.domain.com:5555->android手機的5555端口
  remote_port: 5555
  proto:
  #使用tcp協(xié)議
   tcp: 5555

我們把ngrok二進制文件和ngrok.cfg放在公網(wǎng)上,一個可以下載的地方

然后在手機端下載這兩個文件峦朗。

在手機端安裝termux這個終端模擬器軟件

把ngrok和ngrok.cfg文件拷貝到data/local/ngrok

為什么要拷貝到這個目錄呢建丧?因為下載的文件都是放在sdcard的,而sdcard是沒有執(zhí)行權(quán)限的波势,即便使用命令
chmod +x也是無效的翎朱。
我們使用chmod +x ngrok命令給二進制文件賦予執(zhí)行權(quán)限。

4.啟動adb-tcp連接端口

#手機端開啟adb tcp連接端口尺铣,使用termux
:/$setprop service.adb.tcp.port 5555
:/$stop adbd
:/$start adbd

5.啟動ngrok 客戶端

./ngrok -config ngrok.cfg start-all

運行成功拴曲,連接狀態(tài)為online


ngrok-android-client

6.adb調(diào)試

adb kill-server
adb tcpip 5555
adb connect ngrok.domain.com:5555
adb shell
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凛忿,隨后出現(xiàn)的幾起案子澈灼,更是在濱河造成了極大的恐慌,老刑警劉巖侄非,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蕉汪,死亡現(xiàn)場離奇詭異,居然都是意外死亡逞怨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門福澡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叠赦,“玉大人,你說我怎么就攤上這事革砸〕悖” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵算利,是天一觀的道長册踩。 經(jīng)常有香客問我,道長效拭,這世上最難降的妖魔是什么暂吉? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮缎患,結(jié)果婚禮上慕的,老公的妹妹穿的比我還像新娘。我一直安慰自己挤渔,他們只是感情好肮街,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著判导,像睡著了一般嫉父。 火紅的嫁衣襯著肌膚如雪沛硅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天绕辖,我揣著相機與錄音稽鞭,去河邊找鬼。 笑死引镊,一個胖子當著我的面吹牛朦蕴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弟头,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼吩抓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赴恨?” 一聲冷哼從身側(cè)響起疹娶,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伦连,沒想到半個月后雨饺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡惑淳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年额港,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歧焦。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡移斩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绢馍,到底是詐尸還是另有隱情向瓷,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布舰涌,位于F島的核電站猖任,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瓷耙。R本人自食惡果不足惜朱躺,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哺徊。 院中可真熱鬧室琢,春花似錦、人聲如沸落追。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巢钓,卻和暖如春病苗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背症汹。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工硫朦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人背镇。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓咬展,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瞒斩。 傳聞我的和親對象是個殘疾皇子破婆,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348