臥槽!竟然可以直接白嫖 Github Action 的 2C7G 服務(wù)器!
GitHub Actions[1]?是 GitHub 的持續(xù)集成服務(wù)[2],于2018年10月推出[3]。它的功能非常強大,每一個?action?都用來執(zhí)行一種操作,比如抓取代碼、運行測試、登錄遠程服務(wù)器,發(fā)布到第三方服務(wù)等等。將這些?actions?組合起來,就是一個持續(xù)集成的過程。當(dāng)然,這些 actions 都共享在 GitHub 的代碼倉庫中,我們可以直接引用。
Github Actions 提供了整套服務(wù)器環(huán)境,服務(wù)器規(guī)格為:
2-core CPU 7 GB RAM 內(nèi)存 84 GB SSD 硬盤空間
詳細系統(tǒng)環(huán)境信息如圖:

當(dāng)然,可使用的系統(tǒng)除了?Ubuntu?之外還可以使用?Windows Server 2019?和?macOS X Catalina 10.15。
看起來很美好,但實際上 GitHub Ac-tions 本身是不允許直接連接進行交互式操作的,也就是說你無法通過 SSH 來連接服務(wù)器。如果有辦法能夠直接連接到服務(wù)器進行交互式操作,那豈不是相當(dāng)于白嫖了一臺或多臺 E5 2vCPU/7G RAM/90G SSD 配置的 VPS?
本文就來告訴你如何通過一些奇技淫巧來繞過 GitHub Actions 本身的限制,直接連接到服務(wù)器!
注意:請勿用于惡意用途,造成的一切后果比如封號、中美關(guān)系惡化、原子彈爆炸、第三次世界大戰(zhàn)等后果均與作者無關(guān)。
方案一
mxschmitt/action-tmate[4]
這是第一個實現(xiàn)?tmate[5]?連接 Ac-tions 服務(wù)器的 ac-tion ,但此方案在退出連接后不能進行到下一個步驟,所以在實際使用中沒有多少價值,只能用于 SSH 連接。不過由于其開天辟地的作用,我決定把它放到第一位。
work-flow 文件示例:
name:?CI
on:?[push]
jobs:
??build:
????runs-on:?ubuntu-latest
????steps:
????-?uses:?actions/checkout@v2
????-?name:?Setup?tmate?session
??????uses:?mxschmitt/action-tmate@v2
方案二
csexton/debugger-action[6]
此 ac-tion 作者受?mxschmitt/action-tmate[7]?啟發(fā),同樣是通過 tmate 連接,退出連接后可持續(xù)進行下一個步驟,能更好的應(yīng)用到實際項目中使用。作者可能考慮到為 GitHub 節(jié)約資源,默認(rèn)加了 15 分鐘自動斷開連接,不過可以通過執(zhí)行?touch /tmp/keepalive?命令去解除。
work-flow 文件示例:
name:?debugger-action
on:?
??watch:
????types:?started
jobs:
??build:
????runs-on:?ubuntu-latest
????steps:
?????-?uses:?actions/checkout@v2
?????-?name:?Setup?Debug?Session
???????uses:?csexton/debugger-action@master
Action 日志輸出:

方案三
該方案沒有使用 action 來實現(xiàn),而是另辟蹊徑,直接使用 ngrok 來穿透內(nèi)網(wǎng),腳本如下:
#!/bin/bash
if?[[?-z?"$NGROK_TOKEN"?]];?then
??echo?"Please?set?'NGROK_TOKEN'"
??exit?2
fi
if?[[?-z?"$USER_PASS"?]];?then
??echo?"Please?set?'USER_PASS'?for?user:?$USER"
??exit?3
fi
echo?"###?Install?ngrok?###"
wget?-q?https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-386.zip
unzip?ngrok-stable-linux-386.zip
chmod?+x?./ngrok
echo?"###?Update?user:?$USER?password?###"
echo?-e?"$USER_PASS\n$USER_PASS"?|?sudo?passwd?"$USER"
echo?"###?Start?ngrok?proxy?for?22?port?###"
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?"=========================================="
??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?服務(wù)建立?TCP?隧道,并打印出通過公網(wǎng)連接遠程服務(wù)器的命令。
首先需要在?ngrok 的官網(wǎng)[8]?注冊一個賬戶,并生成一個Tunnel Authtoken:https://dashboard.ngrok.com/auth。然后創(chuàng)建如下的 workflow:
name:?Debugging?with?SSH
on:?push
jobs:
??build:
????runs-on:?ubuntu-latest
????steps:
?????-?uses:?actions/checkout@v1
?????-?name:?Try?Build
???????run:?./not-exist-file.sh?it?bloke?build
?????-?name:?Start?SSH?via?Ngrok
???????if:?${{?failure()?}}
???????run:?curl?-sL?https://gist.githubusercontent.com/retyui/7115bb6acf151351a143ec8f96a7c561/raw/7099b9db76729dc5761da72aa8525f632d8875c9/debug-github-actions.sh?|?bash
???????env:
????????#?After?sign?up?on?the?https://ngrok.com/
????????#?You?can?find?this?token?here:?https://dashboard.ngrok.com/get-started/setup
????????NGROK_TOKEN:?${{?secrets.NGROK_TOKEN?}}
????????#?This?password?you?will?use?when?authorizing?via?SSH?
????????USER_PASS:?${{?secrets.USER_PASS?}}
?????-?name:?Don't?kill?instace
???????if:?${{?failure()?}}
???????run:?sleep?1h?#?Prevent?to?killing?instance?after?failure
服務(wù)器存活時間默認(rèn)是 1 小時,可自行調(diào)整。這里面的 TOKEN 和 SSH 登錄密碼最好采用 workflow 中推薦的方式,先在 GitHub 中創(chuàng)建 Secret,然后在 workflow 中引用 Secret。具體步驟可參考官方文檔[9]。
Action 日志輸出:

最后再次強調(diào):希望大家以學(xué)習(xí)研究目的來使用,切勿用作其他惡意用途,切勿濫用!
參考資料
SSH 連接到 GitHub Actions 虛擬服務(wù)器環(huán)境?[10]
參考資料
GitHub Actions:?https://github.com/features/actions
[2]持續(xù)集成服務(wù):?http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html
[3]推出:?https://github.blog/changelog/2018-10-16-github-actions-limited-beta/
[4]mxschmitt/action-tmate:?https://p3terx.com/go/aHR0cHM6Ly9naXRodWIuY29tL214c2NobWl0dC9hY3Rpb24tdG1hdGU=
[5]tmate:?https://github.com/tmate-io/tmate
[6]csexton/debugger-action:?https://p3terx.com/go/aHR0cHM6Ly9naXRodWIuY29tL2NzZXh0b24vZGVidWdnZXItYWN0aW9u
[7]mxschmitt/action-tmate:?https://p3terx.com/go/aHR0cHM6Ly9naXRodWIuY29tL214c2NobWl0dC9hY3Rpb24tdG1hdGU=
[8]ngrok 的官網(wǎng):?https://ngrok.com/
[9]官方文檔:?https://docs.github.com/cn/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets
[10]SSH 連接到 GitHub Actions 虛擬服務(wù)器環(huán)境 :?https://p3terx.com/archives/ssh-to-the-github-actions-virtual-server-environment.html
往期推薦

我的星球是否適合你?
點擊閱讀原文看看我們都聊過啥?
