我的手机是OnePlus7 Pro 官方系统, 没有root, 仅安装一个Termux应用来使用

初衷

之前我写过两篇博客:

近期考虑了下, 原生的termux功能肯定是不如原生Linux强的, 因此, 我想在手机上单独跑一个Linux系统, 而后利用frp做穿透, 可以将ssh端口暴露至公网. 可以利用手机运行Linux, 并且能随时随地访问.

简单的linux环境

在上个博客vscode_remote在Android上运行记录中, 已经可以使用anyfed来运行fedora系统, 原理的话就是proot, 这次我学聪明了, 直接搜索了proot linux

找到了官网中的这部分内容:

https://wiki.termux.com/wiki/PRoot

可以直接利用proot-distro来运行和启动系统

1
2
proot-distro install <alias>
proot-distro login <alias>

ssh服务以及frp服务

ssh服务

主要需要编辑/etc/ssh/sshd_config

22端口肯定是不可用的, 我因此换成了8122, 手机上默认都是用root用户的, root用户也需要允许密码登录

PermitRootLogin yes

frp服务

使用frp主要是希望将自己的端口映射到公网中, 这样可以随时随地连接, token和server_addr 需要自己提前准备好.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[common]
server_addr = 192.168.12.32
server_port = 7000
token = xxxxxx

[ssh-mi_ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 8122
remote_port = 7001

# Enable TCP health check
health_check_type = tcp
# TCPing timeout seconds
health_check_timeout_s = 3
# If health check failed 3 times in a row, the proxy will be removed from frps
health_check_max_failed = 3
# A health check every 10 seconds
health_check_interval_s = 10

服务启动以及守护进程

由于我们是使用了proot, 并不是一个完整的Linux系统, 没有办法使用systemd做守护进程. 没办法, 我选择了supervisor做服务管理, 目前仅管理了sshd以及frp.

.bashrc中, 检查到supervisor未启动, 则进行启动:

1
2
3
if [ ! -f /proc/$(cat /var/run/supervisord.pid)/status ]; then
service supervisor start
fi

启动了supervisor之后, 发现supervisorctl无法连接, 这个主要是unix socket的读取问题, proot的限制略多. 我这里使用的替换方案是, 改用tcp端口

主要修改: /etc/supervisor/supervisord.conf,

1
2
3
4
5
6
7
8
9
10
11
12
[inet_http_server]
port = 127.0.0.1:3000

# 注释掉unix socket
# [unix_http_server]
# file=/var/run/supervisor.sock ; (the path to the socket file)
# chmod=0777 ; sockef file mode (default 0700)

[supervisorctl]
# 注释掉unix socket, 改用tcp端口
# serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
serverurl=http://127.0.0.1:3000 ; use a unix:// URL for a unix socket
1
2
3
4
# 这样再去运行命令就正常了
root@localhost ~$ supervisorctl
frpc RUNNING pid 10892, uptime 0:14:28
sshd RUNNING pid 10894, uptime 0:14:28

安全性与易用性讨论

安全性

回顾一下刚刚的博客中的操作, 你可数过我有多少不安全的操作, 这里我分别列一下:

  1. 日常使用root用户操作
  2. PermitRootLogin yes允许root用户密码登录
  3. frp穿透后, 暴露到公网的IP和端口
  4. supervisor使用tcp socket, 意味着机器上所有用户均有管理权限

建议大家平时在工作中千万不要有上面的用法!!!

由于我是在Termus中使用的proot, 所以这个root权限的功能很小, 可以这么用, 这个系统中没有其他用户, supervisor也可以直接这么用.

frp穿透仅在我启动应用时才会进行, 也就是说, 平时关闭了Termux, 并不会将端口暴露在公网中.

易用性

  1. 与直接使用Termux不同, 使用一个较为完整的Linux系统体验上会好很多, 有glibc, 可以运行各种Linux软件, 与开发服务器无异
  2. 定制化的启动与关闭, 针对在外运维的同学, 手头上只有手机(硬核的朋友也可以直接在手机上运维.) . 舒适一些的方案是在网吧找一台电脑, ssh连到自己的手机上, 也可以使用vscode remove作为一台临时的开发机
  3. 平时手机上我会安装公司提供的VPN, 在termux中也可以走VPN, 这个小Linux系统也获得了和办公网一样的体验

总结

博客只是介绍一种我自己平时在用的远程运维的方案, 我平时很少带电脑出门, 能用手机跑一个Linux系统实在是方便了很多. 另外, 仅依靠终端能做到的事情有限, 运维管理的网页端最好也有配套的设施, 这样非工作时间出现问题就能更好更快的处理了.