管理员

termux是一个功能很强大的命令行工具.唯一的不足之处就是.它不启动,通过它安装的一些服务就无法启动.
手动启动termux后,如果安装的服务多.还得手动敲命令去启动.比较麻烦.
从F-droid下载的版本,按照教程操作,不知道为什么.也实现不了打开termux后就启动已安装的服务的功能.有人说需要下载收费版的.反正我是不知道在哪下载收费版.

通过查看github上termux:boot的源码.发现termux:boot是通过intent方式启动一个termux的服务.那通过autojs去启动应该也是一样的效果.除非它进行验证......不过,并没有验证...

那下面通过两种方式来启动termux的服务.一种是root方法.另一种是免root方法

root的方法.比较简单.就是一条shell命令

需要注意的是,-d传递的 scheme中, 文件路径只允许修改末尾的文件名.

shell("am startservice -n com.termux/.app.TermuxService "+
    "-a com.termux.service_execute "+
    //-d参数中需要修改你自己的文件名.你只能修改文件路径结尾的文件名称.不得变更路径
    "-d com.termux.file:/data/data/com.termux/files/home/.termux/boot/bootsshd "+
    "-e com.termux.execute.background true", true);

以上的一条shell命令可以说是termux:boot使用的核心命令.你可以修改做成变种,启动多个boot下的文件,但是启动脚本的路径/data/data/com.termux/files/home/.termux/boot/ 不允许改变

免root的方式 测试需要root权限

免root方式就比较麻烦一点.
需要修改termux的AndroidManifest.xml文件.
使用MT管理器.查看termux的包,然后反编译方式打开androidManifest.xml. 跳转到129行
具体内容是:

<service
    android:name="com.termux.app.TermuxService"
    android:exported="false" />

将exported的值改为true

<service
    android:name="com.termux.app.TermuxService"
    android:exported="true" />

这里修改完成后.会生成一个新的apk包.这个包不能直接安装.需要重新签名或者去除签名.
MT管理器可以去除签名或者重新签名
搞定签名后,再安装即可.
安装好以后.使用下面的脚本.运行

importPackage(android.content);

importClass(android.net.Uri);

const TERMUX_SERVICE = "com.termux.app.TermuxService";
const ACTION_EXECUTE = "com.termux.service_execute";
const EXTRA_EXECUTE_IN_BACKGROUND = "com.termux.execute.background";
const BOOT_SCRIPT_PATH = "/data/data/com.termux/files/home/.termux/boot/services";

app.startActivity({
    packageName : "com.termux",
    className : "com.termux.app.TermuxActivity"
});
waitForActivity("com.termux.app.TermuxActivity");

var scriptUri = new Uri.Builder().scheme("com.termux.file").path(BOOT_SCRIPT_PATH).build();
var executeIntent = new Intent(ACTION_EXECUTE, scriptUri);
executeIntent.setClassName("com.termux", TERMUX_SERVICE);
executeIntent.putExtra(EXTRA_EXECUTE_IN_BACKGROUND, true);
context.startService(executeIntent);

★注意:
同样的 BOOT_SCRIPT_PATH 这个变量的值只允许修改最后一个文件的文件名.
也就是说.以上两种方法.都不可以修改启动脚本存放的路径.

  • 一个示例
    假如我们在打开termux的时候,希望启动sshd这个服务.
#首先安装openssh
$ pkg install openssh
#然后在家目录中创建文件夹
$ mkdir -p $HOME/.termux/boot
#创建启动服务的脚本文件
$ touch $HOME/.termux/boot/services
#将要启动的服务写入脚本文件
$ echo sshd >> $HOME/.termux/boot/services

以上的步骤执行完成后关闭termux.然后使用刚才的脚本来启动termux.

使用命令来验证一下.

#检查服务
$ ps -a |grep sshd
 4855 u0_a141   0:00 sshd
 4868 u0_a141   0:00 /data/data/com.termux/files/usr/bin/sshd -R
 5220 u0_a141   0:00 grep sshd
#检查端口 如果状态为 LISTEN 则说明8022端口已经打开
$ netstat -atn |grep 8022
tcp        0      0 0.0.0.0:8022            0.0.0.0:*               LISTEN

或者使用nmap来扫描一下自己的端口.看看8022是否开启

$ nmap localhost
Starting Nmap 7.70 ( https://nmap.org ) at 2019-01-07 14:01 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0013s latency).
Not shown: 999 closed ports
PORT     STATE SERVICE
8022/tcp open  oa-system

好了 以上便是使用Autojs来替代termux:boot插件教程. 如果你想启动多个脚本文件.注意编写脚本的逻辑.
1.先启动termux
2.再启动boot/目录下的脚本

最后由 DcrClub 编辑