「麻雀虽小,五脏俱全」:Android 端 terminal termux 上手调校指南

Android 端 terminal 选择挺多的,甚至除了本地 terminal 之外,专精于 ssh 连接的工具(例如 juicessh、termius),那些个能给 Android 装上 Linux 子系统的工具都能或多或少的执行 Terminal 的工作。本文的主角 termux 就是其中一个轻量级本地 terminal。论界面和易用性,termux 绝对是排倒数的,教程、界面选择、各种设置啥的一概没有;但 terminal 该做的东西,比如软件生态,自启,服务,它都有;比他更全能的 Linux 虚拟机又太过臃肿,和它一样轻量的本地 terminal 们除了运行点二进制外就啥也没有了。但要发挥出 termux 的功力,免不了得折腾一番。

参考文章:

  1. Termux 使用教程 #1 - Android 手机安装 Linux:快捷键,ssh
  2. Termux 使用教程(二):打造手机上的最强终端:自定义扩展输入栏,换源,oh-my-zsh 和插件
  3. 国光:Termux 高级终端安装使用配置教程 信息安全类的包
  4. 神器Termux的使用记录 php+nginx+wordpress
  5. Termux 学习笔记 hexo,和一些 cli 文件管理工具

修改源

1
vi $PREFIX/etc/apt/sources.list

将原来的源注释掉,加入清华源

1
deb https://mirrors.tuna.tsinghua.edu.cn/termux stable main

安装必须软件

其中,可选的:

  • pynat 测梯子 udp 连通性和 nat 类型
  • tldr 命令例子,类似 man
  • tsu 没有 root 不用装,在 tsu 下既可以获得 su 的权限又不用忍受 su 的界面
  • supervisor,自启
  • openssh,后面某些步骤操作比较复杂(特别是自启那个地方),用电脑远程 ssh 连接效率较高(不过平时本来手机就到处带,如果不涉及路径的反复操作意义不大)
  • neofetch,打开终端时的欢迎界面
1
2
3
pkg update
pkg install vim tsu tmux python openssh neofetch
pip install pynat tldr

自定义扩展功能按键

打开相关文档

1
vim ~/.termux/termux.properties

将原来的配置注释或删掉,新增一行

1
extra-keys = [['ESC','/','-','HOME','UP','END'],['TAB','CTRL','ALT','LEFT','DOWN','RIGHT']]

ssh

1
sshd

需要密钥的话参考第二篇文章,在 github 中设置公钥,然后使用一键脚本设置:

1
bash <(curl -Ls git.io/ikey.sh) -g zbttl

查看一下手机当前的 ip 地址

1
ifconfig

之后使用 xshell 之类的 ssh 工具通过本手机的内网 ip 和密钥连接 8022 (不是 22)端口就行了。

ssh 下,尽管是局域网,输入命令运行时仍会感到明显的延迟。原因不明。

oh-my-zsh

安装 zsh

1
pkg i -y zsh

安装 Oh My Zsh

使用 curl 下载安装

1
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

Oh My Zsh 安装完成后会提示你设置 zsh 为默认 shell 。如果没有提示,输入下面的命令进行设置:

1
chsh -s zsh

设置主题

直接在 .zshrc 中修改

1
vim ~/.zshrc

修改这一行

1
ZSH_THEME="[主题名]"

或者使用命令

1
sed -i '/^ZSH_THEME=/c\ZSH_THEME="[主题名]"' ~/.zshrc

这里推荐两个主题:

  1. 自带的 agnoster

  2. powerlevel10k,符号全,但需要安装

    1
    git clone --depth=1 https://github.com/romkatv/powerlevel10k.git $ZSH_CUSTOM/themes/powerlevel10k

    修改 ~/.zshrc

    1
    ZSH_THEME="powerlevel10k/powerlevel10k"

    重启 termux 后,输入命令进入配置

    1
    p10k configure

    根据自己喜好选择。可以通过输入该命令反复修改。

安装 Oh My Zsh 插件

安装 zsh-syntax-highlighting(代码高亮)

1
git clone https://github.com/zsh-users/zsh-syntax-highlighting $ZSH_CUSTOM/plugins/zsh-syntax-highlighting

安装 zsh-autosuggestions(自动建议)

1
git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions

安装 zsh-completions(自动补全)

1
git clone https://github.com/zsh-users/zsh-completions $ZSH_CUSTOM/plugins/zsh-completions

安装 autojump(快速跳转)(可选)(粗略使用方法为用 j xxx 进入安装 autojump 以后进入过的文件夹。用 j --stat 查看当前 autojump 记录你进过的文件夹)

1
2
3
git clone git://github.com/joelthelion/autojump.git
cd autojump
./install.py

运行后会弹出提示,让你加内容到 .zshrc 中。

或是直接输入命令(sed 命令一键操作已经执行该内容)

1
echo "[[ -s $HOME/.autojump/etc/profile.d/autojump.sh ]] && source $HOME/.autojump/etc/profile.d/autojump.sh" >> ~/.zshrc

zsh-com­ple­tions 插件还需把 autoload -U compinit && compinit 添加到.zshrc。输入命令可一键添加:

1
[ -z "`grep "autoload -U compinit && compinit" ~/.zshrc`" ] && echo "autoload -U compinit && compinit" >> ~/.zshrc

把需要启用的插件写入到配置文件中,使用 sed 命令一键操作。

1
2
3
sed -i '/^plugins=/c\plugins=(git z zsh-syntax-highlighting zsh-autosuggestions zsh-completions)' ~/.zshrc
#加入autojump
sed -i '/^plugins=/c\plugins=(git z zsh-syntax-highlighting zsh-autosuggestions zsh-completions autojump)' ~/.zshrc

如果你有自己想添加的插件,写在括号内即可,插件名称用空格隔开。

最后应用配置

1
source ~/.zshrc

应用自启

辅以一个例子:kcptun 客户端打开 termux 时自启,kcptun 二进制文件放在用户根目录 ~/

原命令:

1
~/kcptun -l :2580 -r [IP:PORT] -key [PASSWORD] -crypt none -nocomp -datashard 0 -parityshard 0 -conn 4 -mtu 1200 -sndwnd 1024 -rcvwnd 3500 -mode normal

直接写入 bash 文件中

最便捷的方法。持续运行的命令需要配合重定向命令运行在后台。直接将命令放入 bash 文件中(默认为 .bashsrc,经过我们上面的修改后为 .zshrc),还可通过重定向命令将输入放在文件中便于查错。

1
~/kcptun -l :2580 -r [IP:PORT] -key [PASSWORD] -crypt none -nocomp -datashard 0 -parityshard 0 -conn 4 -mtu 1200 -sndwnd 1024 -rcvwnd 3500 -mode normal >~/kcptun.log 2>&1 &

另外也可以通过 jobs 指令查看后台已经运行了几个这样的进程。

1
jobs -l

但缺点时启动多个 termux 窗口或使用终端复用时,每新增一个窗口就会多运行一次这个指令,如果运行的命令没有自动限制自己只能运行一个实例的功能,那么可能会引起冲突和 bug。

实际上,这个功能比较适合需要更换终端窗口时重复运行的程序(比如终端欢迎界面 neofetch),和拥有独立控制,但需要随 termux 自启的 supervisor(这个我们之后讲),对于 kcptun 以及我手机上运行的另一个项目 UnblockNeteaseMusic 来说只是勉强合适,如果不开多终端没问题,开了多个终端以后就算后面又关到只剩一个终端甚至重启 termux 也会发现有项目正在运行或者运行不正常但在 jobs 命令中找不到,只能重启手机或者利用 kill -9 指令强行杀掉。

(20.5.28 更新) 经过一番研究,可能写在 ./.zprofile 中会比较好。因为 profile 文件中的命令只在第一次启动登录时会运行,而 bash 文件会在每一次打开命令行窗口时运行(适合放入系统变量一类的东西)。

termux-services

参考文章:

官方推荐的方法。实际上改自 runit,不过日志部分直接通过链接方法获得了。其实前三篇参考文章写的大同小异,不过都有错漏,我就列一起了。

  1. 安装 termux-services

    1
    pkg i termux-services 
  2. 指定程序名,按自己的喜好起

    1
    tpath='kcptun'
  3. 建立 run 文件,down 文件和 log 目录

    1
    2
    3
    4
    mkdir -p $PREFIX/var/service
    cd $PREFIX/var/service
    mkdir -p ${tpath}/log
    vim ${tpath}/run

    run 文件的内容,仅供参考

    1
    2
    #!/bin/sh
    exec ~/kcptun -l :2580 -r [IP:PORT] -key [PASSWORD] -crypt none -nocomp -datashard 0 -parityshard 0 -conn 4 -mtu 1200 -sndwnd 1024 -rcvwnd 3500 -mode normal 2>&1

    给权限,新建 down。down 文件实际上是近期开关,后面 enable 和 disable 的凭据实际上就是目录下存不存在 down 文件,我们建立 down 文件实际意思就是默认先关着。

    1
    2
    chmod +x ${tpath}/run
    touch ${tpath}/down
  4. 链接 log 文件

    1
    ln -sf $PREFIX/share/termux-services/svlogger ${tpath}/log/run
  5. 启动 sv up ${tpath}

    查看状态 sv status ${tpath}

    查看日志 cat $PREFIX/var/log/sv/${tpath}/current

    关闭 sv down ${tpath}

    一切没问题就可以开启自启 sv-enable ${tpath},开启自启时程序会自动打开

    不想用的时候可以关闭自启 sv-disable ${tpath}

supervisor

参考文章:termux 安装supervisor

和 runit 相比,supervisor 是 linux 下相对成熟的自启和后台管理方案,命令比 runit 丰富的多。而且相对于 runit 建文件夹控制的方法,supervisor 大部分控制依靠文件配置,需要配置多个自启的时候理论上要更方便。但,因为不是 termux 推荐的方案,导致配置文件里包含的各类文件需要自己创建,且其自启依赖普通 linux 发行版中的 systemd,termux 没有,导致自启还需要放到 bash 文件中,总体易用性其实差一点。

  1. 安装 supervisor

    1
    pip install supervisor -y
  2. 新建一个 supervisord.conf 文件

    1
    2
    cd $PREFIX/etc
    vim supervisord.conf

    内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    ;[unix_http_server]
    ;file=/data/data/com.termux/files/usr/var/run/supervisor.sock ; the path to the socket file
    ;chmod=0700 ; socket file mode (default 0700)
    ;chown=nobody:nogroup ; socket file uid:gid owner
    ;username=user ; default is no username (open server)
    ;password=123 ; default is no password (open server)

    [inet_http_server] ; inet (TCP) server disabled by default
    port=127.0.0.1:9001 ; ip_address:port specifier, *:port for all iface
    ;username=user ; default is no username (open server)
    ;password=123 ; default is no password (open server)

    [supervisord]
    logfile=/data/data/com.termux/files/usr/var/log/supervisord.log ; main log file; default $CWD/supervisord.log
    logfile_maxbytes=50MB ; max main logfile bytes b4 rotation; default 50MB
    logfile_backups=10 ; # of main logfile backups; 0 means none, default 10
    loglevel=info ; log level; default info; others: debug,warn,trace
    pidfile=/data/data/com.termux/files/usr/var/run/supervisord.pid ; supervisord pidfile; default supervisord.pid
    nodaemon=false ; start in foreground if true; default false
    minfds=1024 ; min. avail startup file descriptors; default 1024
    minprocs=200 ; min. avail process descriptors;default 200
    ;umask=022 ; process file creation umask; default 022
    ;user=supervisord ; setuid to this UNIX account at startup; recommended if root
    ;identifier=supervisor ; supervisord identifier, default is ‘supervisor’
    ;directory=/tmp ; default is not to cd during start
    ;nocleanup=true ; don’t clean up tempfiles at start; default false
    ;childlogdir=/tmp ; ‘AUTO’ child log dir, default $TEMP
    ;environment=KEY=“value” ; key value pairs to add to environment
    ;strip_ansi=false ; strip ansi escape codes in logs; def. false

    [rpcinterface:supervisor]
    supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

    [supervisorctl]
    ;serverurl=unix:///data/data/com.termux/files/usr/var/run/supervisor.sock ; use a unix:// URL for a unix socket
    serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
    ;username=chris ; should be same as in [_http_server] if set
    ;password=123 ; should be same as in [_http_server] if set
    ;prompt=mysupervisor ; cmd line prompt (default “supervisor”)
    ;history_file=~/.sc_history ; use readline history if available

    [include]
    files = /data/data/com.termux/files/usr/etc/supervisor.d/*.conf

注意,咱也不想用 /data/data/com.termux/files/usr/ 这个这么长的路径的,但 supervisor 这边所有的配置文件都不认 $PREFIX,甚至连 ~ 都不认。

  1. 新建具体到程序的配置文件

    首先获取当前用户的用户名

    1
    id

    假设是 u0_a999

    然后新建文件 kcptun.conf

    1
    2
    3
    tpath='kcptun'
    mkdir supervisor.d/
    vim supervisor.d/${tpath}.conf

    内容为

    1
    2
    3
    4
    5
    6
    7
    [program:kcptun]
    user=u0_a999
    command=/data/data/com.termux/files/home/kcptun -l :2580 -r [IP:PORT] -key [PASSWORD] -crypt none -nocomp -datashard 0 -parityshard 0 -conn 4 -mtu 1200 -sndwnd 1024 -rcvwnd 3500 -mode normal
    autostart=true
    redirect_stderr = true
    stdout_logfile_maxbytes = 1MB
    stdout_logfile = ~/tmp/kcptun.log

    这里的 logfile,supervisor 自己就不会新建,我们得手动建:

    1
    2
    mkdir ~/tmp
    touch ~/tmp/kcptun.log

    最后启动试试看:

    1
    2
    supervisord
    supervisorctl

    看到 kcptun 这个进程是 running 的就行。

  2. 将 supervisord 加入 bash 文件中。

    1
    echo "supervisord" >> ~/.zshrc

不推荐的配置

termux-boot

号称可以开机自启 termux。但需要开启唤醒锁才行,开启后手机的休眠会受到影响,耗电大幅增加(起码在我的 pe 安卓 10 是这样)。

访问外部存储功能

开启后访问内部储存内容会方便不少,但如果使用钛备份会默认把开启内部储存的几个位置的内容也当成需要备份的资料,生成的资料大小极为感人。