使用Docker运行scrcpy-ws:实现Android web远程桌面

使用Docker运行scrcpy-ws:实现Android web远程桌面

一、引言

上一篇文章我写了一遍关于用嫖的甲骨文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展示:

使用Docker运行scrcpy-ws:实现Android web远程桌面

看着还不错是吧?

那就往下看,仔细阅读,你会得到的很方便安全的云手机。

如果是第一次阅读,请跟着我的说明,参数都不要乱动,等配置成功一次之后再自行发挥。

三、具体步骤

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 检查是否配置成功

提示需要密码登录,输入用户名密码

使用Docker运行scrcpy-ws:实现Android web远程桌面

检查结果

使用Docker运行scrcpy-ws:实现Android web远程桌面

四、scrcpy-ws说明

webshell:

使用Docker运行scrcpy-ws:实现Android web远程桌面

自定义画面参数

使用Docker运行scrcpy-ws:实现Android web远程桌面

H264 Converter 结果查看

使用Docker运行scrcpy-ws:实现Android web远程桌面

五、常见问题

1. 可以套cloudflare/cloudfront这种cdn吗?

可以,不过比如cloudflare需打开cdn的ws选项

不过不建议无脑套cdn,因为有时你分配到的节点会非常卡顿,导致远程桌面反应迟缓,如果你的服务器裸连很慢套一个也无所谓。

使用Docker运行scrcpy-ws:实现Android web远程桌面

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

本文来自《imoeq》,经本网转载发布,本文观点不代表《中国IPv6网》立场,转载请联系原作者。

(17)
中国IPv6网的头像中国IPv6网
上一篇 2022年8月30日 下午5:10
下一篇 2022年9月5日 上午3:29

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注