trzsz/trzsz-ssh

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环境编译出来的二进制文件, 是能正常运行的

Termux 不支持使用 Debian、Ubuntu 和其他 Linux 发行版存储库中的软件包。

也就意味着, 就算指定平台为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