Android 的 Termux 从v0.1.15开始没法使用 tssh
falseUtopia opened this issue · 6 comments
Termux (Termux 是一个 Android 终端模拟器和 Linux 环境应用程序) 中, 从v0.1.15开始没法使用 tssh
版本: tssh_0.1.15_linux_aarch64.tar.gz
从0.1.11 开始试, 试到 0.1.15 就会出现这个错误, 前面都正常
这是错误信息
SIGSYS: bad system call
PC=0x16030 m=0 sigcode=1
goroutine 1 [syscall, locked to thread]:
syscall.Syscall6(0x4000024330?, 0x28?, 0x28?, 0x4000024360?, 0x0?, 0x4f?, 0xffffffffffffff9c?)
/opt/hostedtoolcache/go/1.21.4/x64/src/syscall/syscall_linux.go:91 +0x2c fp=0x4000090b90 sp=0x4000090b00 pc=0x91fec
syscall.faccessat2(0x4000024330?, {0x4000024330?, 0x7992c68eb8?}, 0x1, 0xc0?)
/opt/hostedtoolcache/go/1.21.4/x64/src/syscall/zsyscall_linux_arm64.go:33 +0x84 fp=0x4000090c00 sp=0x4000090b90 pc=0x8eb34
syscall.Faccessat(0x4000024330?, {0x4000024330, 0x28}, 0x1, 0x200)
/opt/hostedtoolcache/go/1.21.4/x64/src/syscall/syscall_linux.go:167 +0x3c fp=0x4000090cf0 sp=0x4000090c00 pc=0x8c23c
internal/syscall/unix.Eaccess(...)
/opt/hostedtoolcache/go/1.21.4/x64/src/internal/syscall/unix/eaccess_linux.go:10
os/exec.findExecutable({0x4000024330, 0x28})
/opt/hostedtoolcache/go/1.21.4/x64/src/os/exec/lp_unix.go:31 +0x58 fp=0x4000090d40 sp=0x4000090cf0 pc=0x220cb8
os/exec.LookPath({0x5232f7, 0x4})
/opt/hostedtoolcache/go/1.21.4/x64/src/os/exec/lp_unix.go:71 +0x1b8 fp=0x4000090de0 sp=0x4000090d40 pc=0x220f88
github.com/atotto/clipboard.init.0()
/home/runner/go/pkg/mod/github.com/atotto/clipboard@v0.1.4/clipboard_unix.go:73 +0x264 fp=0x4000090e00 sp=0x4000090de0 pc=0x2a2dc4
runtime.doInit1(0x8d1a90)
/opt/hostedtoolcache/go/1.21.4/x64/src/runtime/proc.go:6740 +0xd4 fp=0x4000090f30 sp=0x4000090e00 pc=0x58b24
runtime.doInit(...)
/opt/hostedtoolcache/go/1.21.4/x64/src/runtime/proc.go:6707
runtime.main()
/opt/hostedtoolcache/go/1.21.4/x64/src/runtime/proc.go:249 +0x374 fp=0x4000090fd0 sp=0x4000090f30 pc=0x4ad94
runtime.goexit()
/opt/hostedtoolcache/go/1.21.4/x64/src/runtime/asm_arm64.s:1197 +0x4 fp=0x4000090fd0 sp=0x4000090fd0 pc=0x7c114
tssh 在 0.1.15 引入了 github.com/charmbracelet/bubbles ,间接引入了 github.com/atotto/clipboard ,它有个 init 函数 https://github.com/atotto/clipboard/blob/master/clipboard_unix.go#L51 ,问题出在这。
问题出在 exec.LookPath
,这可能是 go 的问题,你换个 go 的版本编译试试。
可以确认是Go环境的问题
我在Termux中使用它的Golang环境编译出来的二进制文件, 是能正常运行的
也就意味着, 就算指定平台为aarch64, 如果依赖存在兼容问题, 编译结果依然运行不了
Termux 的Golang环境在这里 https://packages.termux.dev/apt/termux-main/pool/main/g/golang/
我不知道你的Github Action能不能用上它
我发现 Termux 官方提供了 Termux 的docker镜像 termux/termux-docker
经过我的研究, 我用docker 成功构建出了 能在termux 运行的二进制文件
这是Dockerfile
# 使用 termux/termux-docker:aarch64 作为基础镜像
FROM termux/termux-docker:aarch64 AS builder
# 切换内置用户 system
USER system
# 修改 apt 源为清华大学镜像站 安装必要的软件包 clone源码 配置go代理 和 构建
RUN sed -i 's@^\(deb.*stable main\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/apt/termux-main stable main@' /data/data/com.termux/files/usr/etc/apt/sources.list \
&& pkg update -y \
&& pkg install -y golang git make \
&& git clone https://mirror.ghproxy.com/github.com/trzsz/trzsz-ssh.git \
&& cd trzsz-ssh \
&& export GO111MODULE=on \
&& export GOPROXY=https://goproxy.cn,direct \
&& make
# 第二阶段:生成最终镜像
FROM scratch
# 从 builder 阶段复制二进制文件
COPY --from=builder /data/data/com.termux/files/home/trzsz-ssh/bin/tssh /tssh
# 设置入口点
ENTRYPOINT ["/tssh"]
构建过程
# 安装qemu环境
sudo apt install qemu qemu-user-static -y
# 把qemu环境注册到/usr/bin
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
# 开始构建
docker build --network=host --platform linux/arm64 -t "termux-tssh" .
从容器中提取 tssh 二进制文件到主机的当前目录
# 创建一个容器但不启动它 , 从容器中复制文件到当前目录 , 删除容器
container_id=$(docker create termux-tssh) \ docker cp $container_id:/tssh . && docker rm $container_id
下面是让Chatgpt 生成的 Github Action 工作流配置, 可以参考下
name: Build and Publish
on:
push:
tags:
- 'v*.*.*'
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Cache Docker layers
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build Docker image
run: docker buildx build --platform linux/arm64 -t termux-tssh --load .
- name: Create Docker container and copy binary
run: |
container_id=$(docker create termux-tssh)
docker cp $container_id:/tssh ./tssh
docker rm $container_id
- name: Upload binary to GitHub Release
uses: actions/upload-release-asset@v1
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: ./tssh
asset_name: tssh
asset_content_type: application/octet-stream
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@falseUtopia 你这样编译一个出来试试?
GOOS=android GOARCH=arm64 make
# powershell
$env:GOOS="android"
$env:GOARCH="arm64"
go build -o bin/tssh ./cmd/tssh
编译出来可以运行,
d848284 Actions 编译结果在我的设备上也没问题,
可以, 很强
新版本的 action 会产生类似这样的: tssh_0.1.21_android_aarch64.tar.gz