一、引言
上一篇文章我写了一遍关于用嫖的甲骨文Arm通过Redroid image开一个Andriod容器用来安卓挂机,更好的利用吃灰的甲骨文做点事情,但是很多人误会了我那篇文章的意思,并不是非得是Arm64架构才能运行此镜像。
只是甲骨文Arm的性能过剩了才拿出来做的栗子,其实只要是能跑docker的arm64/amd64都能启动Redroid。
本篇文章将用x64的机型做栗子,根据别人善意提醒,scrcpy-ws可以通过ws提供一个web版Android的远程桌面。
我去了解了一下,确实比起传统的用iptables限制ip访问adb得到的安全性相比,能有个web端,能让我们更方便的访问和做授权访问。
优点: web端可以通过任意浏览器直接访问方便,还能套诸如cloudflare支持ws的cdn,加速访问; 不用做上一篇文章那种复杂的防火墙规则来保证安全。
缺点: 需要配置nginx auth模块、小白噩梦、多跑一个scrcpy-web容器
下方介绍如有纰漏、错误,请留言指正
二、结果展示
如果你参照如下的说明,你就会得到一个可以授权的web版桌面(密码验证是nginx做的),下面是gif展示:
看着还不错是吧?
那就往下看,仔细阅读,你会得到的很方便安全的云手机。
如果是第一次阅读,请跟着我的说明,参数都不要乱动,等配置成功一次之后再自行发挥。
三、具体步骤
1.准备工作
为了避免复制粘贴,先给没有基础的用户一个提醒,没有看过上一篇文章的看这里:ARM服务器利用docker镜像运行安卓云手机详细完整教程
如果你要熟悉使用本篇文章的说明请阅读至这篇文章的<使用> <四. 拉取docker镜像并启动容器>,查看完该docker命令是什么意思不需要启动容器有点不一样,做好准备工作就行。
2. 启动redroid容器
这里和上一篇文章不用web的直接连接adb时不一样,下面有说明,请注意
docker run -itd
--memory-swappiness=0
--privileged --pull always
-v /root/test/data:/data
--rm
--name=redroid8
redroid/redroid:8.1.0-latest
androidboot.hardware=mt6891 ro.secure=0 ro.boot.hwc=GLOBAL ro.ril.oem.imei=861503068361145 ro.ril.oem.imei1=861503068361145 ro.ril.oem.imei2=861503068361148 ro.ril.miui.imei0=861503068361148 ro.product.manufacturer=Xiaomi ro.build.product=chopin
redroid.width=720 redroid.height=1280
--name redroid8
也是给容器起个名字,方便连接adb- 没有映射adb端口,因为我们这里不需要它暴露adb端口到外网
- 这个分辨率可以适当调大,因为是web端嘛,自测
2.用docker运行scrcpy-ws获得web端
目前scrcpy-ws没有官方镜像,有人提了pr但是都一年多了都没有合并,看原作者的意思是不希望维护docker镜像,需要该pr的人维护,但是提该pr的人可能也觉得麻烦不想维护…..
所以我自己打包了个scrcpy-web镜像push到dockerhub上去了,支持amd64和arm64(其他架构貌似需求不大所以没加),随缘更新,保证可用就行。
docker run --rm -itd --privileged -v /root/scrcpy-web/data:/data --name scrcpy-web -p 127.0.0.1:48000:8000/tcp --link redroid8:myphone1 emptysuns/scrcpy-web:v0.1
-p 127.0.0.1:48000:8000/tcp
这里只映射127.0.0.1,因为我们下面需要用nginx做密码登录,所以只允许本机访问,防止有人扫描抓取,如果你有其他玩法,就改变这个映射端口。--name scrcpy-web
这里最好加个名称,因为后面连接adb要用到,比如这个名称就叫scrcpy-web
-v /root/scrcpy-web/data:/data
映射一个目录进去,方便到时候用adb install 安装本地apk,因为启动的安卓容器只能由这个scrcpy-web访问,方便以后本地向容器里传数据。--link redroid8:myphone1
意思是本容器连接到其他容器,<你需要连接的容器名称>:<自定义别名>,这里这么写就是为了只需要scrcpy-web容器能连接改adb端口,其他都是拒绝,为了安全。
等待容器启动成功后,用curl访问一下127.0.0.1:48000查看是否启动成功
root@ubuntu:~# curl 127.0.0.1:48000
#如果有如下返回值就说明成功
<!doctype html><html lang="en"><head><meta charset="UTF-8"><meta content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" name="viewport"/><title>WS scrcpy</title><script defer="defer" src="bundle.js"></script><link href="main.css" rel="stylesheet"></head><body></body></html>
4. scrcpy-web容器连接adb端口
这个简单,scrcpy-web
是你给scrcpy-web
镜像启动的容器起的名称,redroid8
是安卓容器起的名称,如果你没有改动我上面的介绍,直接输入就行。
docker exec -it scrcpy-web adb connect myphone1:5555
connected to myphone1:5555 #出现这个说明启动成功
5. nginx反代scrcpy-web端口,增加密码登录
由于原本的scrcpy-web也是没有鉴权功能的,他只是一个web前端,如果要增加登录验证功能需要去改源码,比较麻烦,我们可以曲线救国,用nginx auth模块来做登录即可。
如果你是如上一步一步走下来的,没有改东西,则默认scrcpy-web只监听127.0.0.1本机ip,如果你在第2步设置了端口映射,允许0.0.0.0访问了,请自行解决授权安全问题。
5.1 用openssl生成账号密码文件
echo -n "test:" > /etc/nginx/passwd_scrcpy_web #生成一个用户名,将test改成自己的用户名
openssl passwd qwert1234 >> /etc/nginx/passwd_scrcpy_web #加密密文,qwert1234改成自己的密码
5.2 配置nginx auth模块
这里给出样例代码,照着自己nginx配置就行,我先说好,我不扫盲,如果你连nginx配置文件都不会修改,就尽力自己解决好吧。
这里只有80的代码,但是最好开启https,修改方法一样,这里不做说明
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream websocket {
#这里是scrcpy-web的ip+端口,docker ps可以查看
#你是如上操作的就是127.0.0.1:48000,因为这里要代理websocket
server 127.0.0.1:48000;
}
server {
listen 80;
server_name test.com;
#root /usr/share/nginx/html;
auth_basic "Please input password:"; #这里是输入密码的提示信息
auth_basic_user_file /etc/nginx/passwd_scrcpy_web; #这里是密码文件位置
location / {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
if ($request_method = 'OPTIONS') {
return 204;
}
proxy_pass http://websocket;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
其实如上加了一群header是为了做一些简单的防护和允许跨站请求,方便你把这个网页插入其他站点做内嵌网页,最关键的就是以下三点 + 转发ws的部分:
proxy_pass http://websocket;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
5.3检查nginx配置并重启
> nginx -t
#如下说明nginx配置没问题
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
> nginx -s reload #nginx平滑重启
5.4 检查是否配置成功
提示需要密码登录,输入用户名密码
检查结果
四、scrcpy-ws说明
webshell:
自定义画面参数
H264 Converter 结果查看
五、常见问题
1. 可以套cloudflare/cloudfront这种cdn吗?
可以,不过比如cloudflare需打开cdn的ws选项
不过不建议无脑套cdn,因为有时你分配到的节点会非常卡顿,导致远程桌面反应迟缓,如果你的服务器裸连很慢套一个也无所谓。
2. 折腾半天有什么用?
不知道,总有人会有用,自己考虑用途
3. 我不是甲骨文Arm可以用吗?
可以,看我上面开头说明,不管你是不是甲骨文,只要你觉得的机器性能尚可,都可以试试
内存起码准备4G以上的
4. 我如何连接多个adb? / 我可以安全连接其他主机上的容器吗?
看我发的这两篇文章,自己总结办法,我充其量只是介绍基础用法,灵活使用,看你了。
只要你认真看完介绍了,这个问题很简单
5. webview浏览器无法下载任何文件怎么办?
<三、具体步骤> <2. 用docker运行scrcpy-ws获得web端>里向主机映射了一个目录-v /root/scrcpy-web/data:/data
用来向容器里传数据。
如果你无法通过webview浏览器下载东西,请装一个via浏览器
下载via.apk
放到/root/scrcpy-web/data
目录下
docker exec -it scrcpy-web adb install /data/via.apk
这样你就离开古老的webview了
6. redroid容器启动失败怎么办?
docker exec -it redroid8 sh #进入容器内> logcat #查看输出的日志
六、参考
https://github.com/NetrisTV/ws-scrcpy