Termux 详解—— Android 平台上完美移植的 Linux 工具集

最近换了新手机,系统是基于 Android Pie(即 Android 9)定制的 MIUI 10
Android 相对而言算得上是比较开放的平台,如此说来,不趁此机会乱搞一下难免有些说不过去。。。
额,新手机,刷机Root来一套有点舍不得,好在有 Termux 这个应用。来,耍一耍看上去能够彰显“硬核”范儿的东西。

一、简介

Termux 是 Android 平台上的一个终端模拟器,它将众多 Linux 上运行的软件和工具近乎完美的移植到了手机端。
无需任何复杂的安装和配置过程,软件装好以后即会自动配置一个基本的运行环境,用以执行一些常见的 Linux 命令。
最为关键的是,它还内置了功能健全的包管理工具,可以使用类似于 Ubuntu 系统的 apt (或 pkg)命令安装额外的软件包。

Termux 详解—— Android 平台上完美移植的 Linux 工具集
termux

之所以称它为“模拟器”而非“虚拟机”,是因为它并非像 PC 端的 VirtualBox 等虚拟机软件那样,在宿主机中虚拟出一个完全独立且完整的系统环境,而是类似于 Mingw 等软件,只是提供一个接口,以安装和运行面向新环境交叉编译后的程序。

也可以将此时的手机看作是安装了 Linux 系统的树莓派,可以像 PC 端系统那样运行各种类型的软件,只不过这些软件都是针对特定的 CPU 架构和硬件设备编译过的(交叉编译或者在树莓派系统中本地编译)。
需要注意的是,由于移动端和 PC 端硬件设备的巨大差异,加上 Android 内核和操作系统的限制,能够直接运行的程序毕竟是少数。不过我刚刚算了一下,实际上可直接安装运行的软件足足有 910 个!

Termux 详解—— Android 平台上完美移植的 Linux 工具集
apt list

二、软件包

前面提到的可供安装的近一千个(算上为数众多的基础工具、库文件和开发版软件包)程序和软件,数量虽然远不及桌面系统,面对日常使用、学习任务甚至很多高阶应用也已经算得上绰绰有余了。
举个例子来说,Termux 是可以直接安装配置 Python 编程环境的。想想 Python 社区里浩如烟海的第三方库,甚至还可以根据特定的需求自行编写程序源代码。这里面包含着无限的可能性。

当然这也只是 Python 罢了,那么 PerlRubyNodejsLua、C/C++、GolangRust……
我不会拿它去对标电脑上完备的系统环境,单说这种似乎无限的可能性,就已经很值得玩味了。

这里简单的列举下我所熟悉的部分软件:

  • 基础工具:apt、bash、busybox、dpkg、git、htop、make、zsh ……
  • 编程语言:binutils、clang、dart、erlang、golang、lua、nodejs、perl、php、python、ruby、rust ……
  • 服务器软件:apache2、lighttpd、nginx、openssh ……
  • 数据库软件:mariadb、memcached、mosquitto、postgresql、redis、sqlite ……
  • 文本工具和编辑器:emacs、gawk、nano、sed、vim ……
  • 媒体工具:ffmpeg、imagemagick、mpv、sox ……
  • 网络工具:curl、httping、nmap、wget ……
  • 游戏和娱乐:bastet、cmatrix、cowsay、fortune、moon-buggy、nsnake、sl ……

三、有趣的 Terminal 小命令

就先不说具体的环境搭建的步骤了,包含的东西很多,实际上跟电脑端的操作并没有太大的区别。
就简单列举一些我个人非常喜欢的好玩儿的小命令吧。

  • fortune:输出一段格言警句、名著节选或者小笑话等
  • cowsay:将输出的文字内容包含在由 ASCII 字符组成的动物形象的气泡内
  • lolcat:将苍白的输出文字变成绚丽的彩虹色

安装方法

  • fortune:$ apt install fortune
  • cowsay:$ apt install cowsay 或者 $ gem install cowsay
  • lolcat:$ gem install lolcat

其中 apt 版本的 cowsay 依赖 Perl ,安装包整个算起来有点大。所以我比较倾向于使用 gem 命令安装,即作为 Ruby 的第三方库。当然为了使用 gem 命令是要先安装好 Ruby 的:
$ apt install ruby

效果截图

Termux 详解—— Android 平台上完美移植的 Linux 工具集
fortune cowsay lolcat

虽然名字叫 cowsay ,但它所包含的动物形象事实上不只“牛”这一种。
可以使用 cowsay -l 命令列出所有可供选择的动物形象,并通过 cowsay -f animal_name 手动指定另一种动物。

Termux 详解—— Android 平台上完美移植的 Linux 工具集
cowsay -f

另外,其实 cowsay 的每个动物形象都是由对应的 cow 文件(基本就是 ASCII Art 形式的文本文件)定义的,可以自己扩充,篇幅有限不赘述。
类似的小玩意儿还有 sl(突突的小火车)、cmatrix(全屏滚动乱码),试试就知道了。

配置 ssh 服务

前面的截图,估计已经暴露了。。。
我是在电脑上截的图,但程序确实是在手机上运行的。只是在手机端 Termux 上安装了 SSH 服务,远程登录而已。步骤也非常简单:

  • 软件安装:$ apt install openssh
  • 设置远程登录密码:$ passwd
  • 电脑端登录:$ ssh phone_ip -p 8022

电脑上的 ssh 客户端可自行选择,尤其要注意,这里 SSH 服务监听的端口8022
呃,差点忘记了。远程连接之前,先在手机端运行下 sshd 命令启动 SSH 服务。。。

四、高端的命令行游戏

moon-buggy

moon-buggy 是一个非常“酷炫”的命令行版本的跑酷游戏。
虽说游戏界面完全由 ASCII 字符构成,它仍然具备了一个跑酷游戏必需的所有的基本要素。玩下就懂了,蛮神奇的。

Termux 详解—— Android 平台上完美移植的 Linux 工具集
moon-buggy GIF

玩儿到后面貌似还有迎面飞来的障碍物,还可以发射武器弹药?记不太清楚了。。。

nsnake

嗯,不多说了,看名字就知道,贪吃蛇。。。
初始的移动速度有点慢,建议在游戏选项里面改一下。

Termux 详解—— Android 平台上完美移植的 Linux 工具集
nsnake
bastet

就是大名鼎鼎的俄罗斯方块啦。看图:

Termux 详解—— Android 平台上完美移植的 Linux 工具集
bastet

五、oh-my-zsh

手机端输入命令总觉得有点别扭,可能还是不习惯吧。
这时候有个 oh-my-zsh 就显得很有必要了。反正我个人觉得挺好用的,尤其搭配上 zsh-completionszsh-autosuggestionszsh-syntax-highlighting 等插件。
可以对命令行中输入的命令进行语法高亮自动补全等,极大地提高了输入效率。

软件安装

  • oh-my-zsh
$ apt install zsh curl $ sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" 
  • zsh-autosuggestions
    $ git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
  • zsh-completions
    $ git clone https://github.com/zsh-users/zsh-completions ~/.oh-my-zsh/custom/plugins/zsh-completions
  • zsh-syntax-highlighting
    $ git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

软件配置
编辑 ~/.zshrc 文件,将上述插件添加到 plugins 项后面:

Termux 详解—— Android 平台上完美移植的 Linux 工具集
.zshrc

PS:Termux 貌似是没有默认 SHELL 的配置的,所以安装好 oh-my-zsh 以后,打开软件还是直接进入 Bash 界面。
我没有特别去找配置文件的位置,而是用了另外一种方案,,,手动输入 zsh 命令进入,或者,在 ~/.bashrc 文件中加入 zsh 一行内容。。。

六、访问手机文件及 Termux-Api

根据默认的 Android 系统的权限设定,Termux 是无法访问手机存储的。当然可以使用命令进行修改。
只需要输入 termux-setup-storage 命令,即会弹出授权窗口,允许即可。
该命令会在用户主目录下生成 storage 文件夹,里面即包含了到系统主要资源(如手机内存、外置存储卡、Downloads 文件夹、照片等)的链接。

Termux 详解—— Android 平台上完美移植的 Linux 工具集
storage

Termux-Api 是 Termux 软件的一个插件,需要安装额外的 APK 包。并且命令行中也需要使用 $ apt install termux-api 命令安装具体的工具。
它提供了一种以 API 的形式直接访问 Android 系统硬件和资源(如相机电池WiFi短信通讯录指纹GPS等)的途径。

Termux 详解—— Android 平台上完美移植的 Linux 工具集
Termux-Api

如获取电池状态和 WiFi 连接信息:

Termux 详解—— Android 平台上完美移植的 Linux 工具集
battery & wifi

这个感觉可以深挖,用好了可以达到曾经的安卓神器 Tasker 的效果。

今天也不早了,,,就先这样吧。熬,附个软件链接吧。。
Termux and Termux-Api 提取码:i37y
By the way,录了段蛮简陋的视频演示,额,第一次剪。。。

参考资料

Termux Wiki

发送未接来电信息到微信

  之前做的《用Tasker实现Android手机短信转发到微信》,很多人询问如何发送未接来电信息,问的人太多就做出来.
  本教程的大部分内容都跟《用Tasker实现Android手机短信转发到微信》的内容差不多少,只有发送信息的主体从短信改为未接来电,触发条件改成 未接来电 就可以了

整个操作步骤是:1,注册企业微信;2,创建一个应用;3,在tasker中创建配置文件。
 
发送未接来电信息到微信实际效果截图
//下面的三个变量值需要修改
var ID = "ww3c67de428ec7ebad";
var SECRET = "KNgBbbHiTo66VSVzqLv0vYCadXE11drn5o41cmuB2o4";
var AGENTID = 1000002;

//定义post方法
function postHttp(url, data) {
    var xhr = new XMLHttpRequest();
    xhr.addEventListener("readystatechange",
    function() {
        if (this.readyState === 4) {
            flash(this.responseText); //显示返回消息,可删除本行
        }
    });
    xhr.open("POST", url, false);
    xhr.send(data);
    return xhr.responseText;
}

//定义get方法
function getHttp(url) {
    var xhr = new XMLHttpRequest();
    xhr.addEventListener("readystatechange",
    function() {
        if (this.readyState === 4) {
            flash(this.responseText); //显示返回消息,可删除本行
        }
    });
    xhr.open("GET", url, false);
    xhr.send();
    return xhr.responseText;
}

//获取token
var tokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + ID + "&corpsecret=" + SECRET;
var access_token = JSON.parse(getHttp(tokenUrl)).access_token;

//发送消息(文本)
var cnum = global('CNUM');
cnum = cnum ? cnum: "来电未显示号码";
var cname = global('CNAME');
cname = (cname == "?") ? cnum: cname;
var ctime = global('CTIME').replace(/\./, ":");
var cdate = global('CDATE');

var content = "您有一条未接来电信息\n名字: " + cname + "\n号码: " + cnum + "\n时间: " + ctime + ",  日期: " + cdate;
var message = JSON.stringify({
    "touser": "@all", //@all代表发送给全体成员,也可指定某几个人,比如"hong|dan|tom"
    //"toparty" : "1|2",//部门id
    //"totag" : "1|2",//标签id,文档说明:https://work.weixin.qq.com/api/doc#90000/90135/90236
    "msgtype": "text",
    "agentid": AGENTID,
    "text": {
        "content": content
    },
    "safe": 0
});
var msgUrl = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + access_token;
postHttp(msgUrl, message);

  • 为保证Tasker稳定运行,请把Tasker加入电池优化白名单.
  • 为保证配置正常运行,请赋予Tasker相应的权限.
  • 运行不正常,请提供提示信息和运行日志到群内反馈.
    点击我加入群【Tasker配置分享群】

或者扫描二维码进入。

发送未接来电信息到微信
群二维码
点我导入配置

Tasker安装第一天的教程

Tasker安装第一天的教程
安装Tasker后发现,应用会在需要的时候主动提醒用户获取相应的权限.
说起来有些枯燥,实在不想多说,所以本篇文字极简。

  • 如果你是只想实现某一个或几个功能,那么找到可靠的配置文件或者链接,并且Tasker保持正常运行就足够了。
  • 如果你想自己创建配置,实现更多的自定义功能,就需要一步一步按照如下步骤操作。

保持正常运行的方法

  1. 首先,安装Tasker程序,安装后打开应用,在Tasker主界面上,打开右上角的菜单,单击更多选项,点击Android设置,该界面一共罗列了10项设置,按照提示一步一步设置就可以了。其中”省电模式”是设置让Tasker保持后台运行的关键设置。
    Tasker安装第一天的教程
    自启动
  2. 其次,按下最近任务键,在界面上长按Tasker程序,进入系统管理Tasker的设置界面,在Tasker的权限管理项中,选择信任Tasker。
  3. 最后,为Tasker赋予写安全权限。
    电脑上安装 adb后就可以使用以下命令获取权限

如何安装和使用adb请自行搜索

adb shell pm grant net.dinglisch.android.taskerm android.permission.WRITE_SECURE_SETTINGS

这个方法实现了很多需要root权限或者无障碍服务才能实现的功能.
其他技能:

  • 会查看运行日志
    Tasker安装第一天的教程
    运行日志
  • 置配置自动备份
    Tasker安装第一天的教程
    备份
    如果你是从低版本(5.2及之前的版本)升级的,最好备份下数据,卸载旧版本重新安装新版本.