这几天,我一直在捣鼓这个,发现这个实在太强大了。后面我在想,既然是一个服务器,那就应该能实现远程连接进行交互式操作啊。
果不其然,百度了一圈,发现已经有人实现了
前言
Github Actions 一个拥有 E5 2vCPU/7G RAM/90G SSD
配置的 VPS。参考 @p3terx 的虚拟服务器评测
方案一
项目地址:mxschmitt/action-tmate
第一个实现 tmate
连接 Actions 的 action ,但此方案在退出连接后不能进行到下一个步骤,所以在实际使用中没有多少价值,只能用于 SSH 连接。不过由于其开天辟地的作用,我决定把它放到第一位
workflow 文件示例:
1 2 3 4 5 6 7 8 9
| name: CI on: push jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: Setup tmate session uses: mxschmitt/action-tmate@v1
|
方案二
项目地址:csexton/debugger-action
此 action 作者受 mxschmitt/action-tmate
启发,同样是通过 tmate
连接,退出连接后可持续进行下一个步骤,能更好的应用到实际项目中使用。作者可能考虑到为 GitHub 节约资源,默认加了 15 分钟自动断开连接,不过可以通过执行 touch /tmp/keepalive
命令去解除
workflow 文件示例:
1 2 3 4 5 6 7 8
| name: Ubuntu on: push jobs: Ubuntu: runs-on: ubuntu-latest steps: - name: Setup Debug Session uses: csexton/debugger-action@master
|
方案三
项目地址:P3TERX/debugger-action
此方案是由 @P3TERX
根据方案二改进,部分提示文案的显示逻辑,修改连接超时为 30 分钟,解决了失去控制的问题
workflow 文件示例:
1 2 3 4 5 6 7 8 9 10
| name: Ubuntu on: watch: types: started jobs: Ubuntu: runs-on: ubuntu-latest steps: - name: SSH connection to Actions uses: P3TERX/debugger-action@master
|
方案四(推荐)
此方案是博主我根据 网友XXX
改进而来的,该方案没有使用 action
来实现,而是另辟蹊径,直接使用 ngrok
来穿透内网
请先在 Github
项目中创建所需的 Secret
参数
名字 | 值 | 描述 |
---|
NGROK_TOKEN | string | 在 ngrok 的官网 生成的 Authtoken |
NGROK_SCRIPT | string | 自定义代码脚本,参考下方 |
USER_PASS | string | SSH连接时将使用的密码 |
自定义代码脚本如下:
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
| #!/bin/bash if [[ -z "$NGROK_TOKEN" ]]; then echo "请先设置名为 'NGROK_TOKEN' 的Secrets" exit 2 fi if [[ -z "$USER_PASS" ]]; then echo "请先设置名为 'USER_PASS' 的Secrets" exit 3 fi echo "### 安装 ngrok ###" wget -q https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-386.zip unzip -q ngrok-stable-linux-386.zip chmod +x ./ngrok
echo "### 设置 $USER 用户密码 ###" echo -e "$USER_PASS\n$USER_PASS" | sudo passwd "$USER" echo "### 启动 ngrok 端口代理 ###"
rm -f .ngrok.log ./ngrok authtoken "$NGROK_TOKEN" ./ngrok tcp 22 --log ".ngrok.log" & sleep 10 HAS_ERRORS=$(grep "command failed" < .ngrok.log) if [[ -z "$HAS_ERRORS" ]]; then echo "" echo "================SSH 账号信息===================" echo "To connect: $(grep -o -E "tcp://(.+)" < .ngrok.log | sed "s/tcp:\/\//ssh $USER@/" | sed "s/:/ -p /")" echo "==============================================" else echo "$HAS_ERRORS" exit 4 fi
|
该自定义代码脚本用来为 SSH 服务建立 TCP 隧道
,并打印出通过公网连接远程服务器的命令
紧接着,创建如下的 workflow:
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
| name: 开启 SSH 支持 on: watch: types: started jobs: build: runs-on: ubuntu-latest if: github.event.repository.owner.id == github.event.sender.id steps: - uses: actions/checkout@v1 - name: 尝试破坏构建过程 run: ./hello-world.sh - name: 通过 ngrok 启动 ssh if: ${{ failure() }} env: NGROK_TOKEN: ${{ secrets.NGROK_TOKEN }} NGROK_SCRIPT: ${{ secrets.NGROK_SCRIPT }} USER_PASS: ${{ secrets.USER_PASS }} run: | echo "$NGROK_SCRIPT" &> run.sh bash run.sh - name: 设置 ssh 存活时间 if: ${{ failure() }} run: sleep 1h
|
服务器存活时间默认是 1 小时,可自行调整,1 小时候需要重新连接
项目作者点击 Star
就可以运行了