|
| 1 | +#!/usr/bin/env bash |
| 2 | +# |
| 3 | +# Copyright (c) 2020 P3TERX <https://p3terx.com> |
| 4 | +# |
| 5 | +# This is free software, licensed under the MIT License. |
| 6 | +# See /LICENSE for more information. |
| 7 | +# |
| 8 | +# https://github.com/P3TERX/ssh2actions |
| 9 | +# File name:ngrok2actions.sh |
| 10 | +# Description: Connect to Github Actions VM via SSH by using ngrok |
| 11 | +# Version: 2.0 |
| 12 | +# |
| 13 | + |
| 14 | +Green_font_prefix="\033[32m" |
| 15 | +Red_font_prefix="\033[31m" |
| 16 | +Green_background_prefix="\033[42;37m" |
| 17 | +Red_background_prefix="\033[41;37m" |
| 18 | +Font_color_suffix="\033[0m" |
| 19 | +INFO="[${Green_font_prefix}INFO${Font_color_suffix}]" |
| 20 | +ERROR="[${Red_font_prefix}ERROR${Font_color_suffix}]" |
| 21 | +LOG_FILE='/tmp/ngrok.log' |
| 22 | +TELEGRAM_LOG="/tmp/telegram.log" |
| 23 | +CONTINUE_FILE="/tmp/continue" |
| 24 | + |
| 25 | +if [[ -z "${NGROK_TOKEN}" ]]; then |
| 26 | + echo -e "${ERROR} Please set 'NGROK_TOKEN' environment variable." |
| 27 | + exit 2 |
| 28 | +fi |
| 29 | + |
| 30 | +if [[ -z "${SSH_PASSWORD}" && -z "${SSH_PUBKEY}" && -z "${GH_SSH_PUBKEY}" ]]; then |
| 31 | + echo -e "${ERROR} Please set 'SSH_PASSWORD' environment variable." |
| 32 | + exit 3 |
| 33 | +fi |
| 34 | + |
| 35 | +if [[ -n "$(uname | grep -i Linux)" ]]; then |
| 36 | + echo -e "${INFO} Install ngrok ..." |
| 37 | + curl -fsSL https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip -o ngrok.zip |
| 38 | + unzip ngrok.zip ngrok |
| 39 | + rm ngrok.zip |
| 40 | + chmod +x ngrok |
| 41 | + sudo mv ngrok /usr/local/bin |
| 42 | + ngrok -v |
| 43 | +elif [[ -n "$(uname | grep -i Darwin)" ]]; then |
| 44 | + echo -e "${INFO} Install ngrok ..." |
| 45 | + curl -fsSL https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-darwin-amd64.zip -o ngrok.zip |
| 46 | + unzip ngrok.zip ngrok |
| 47 | + rm ngrok.zip |
| 48 | + chmod +x ngrok |
| 49 | + sudo mv ngrok /usr/local/bin |
| 50 | + ngrok -v |
| 51 | + USER=root |
| 52 | + echo -e "${INFO} Set SSH service ..." |
| 53 | + echo 'PermitRootLogin yes' | sudo tee -a /etc/ssh/sshd_config >/dev/null |
| 54 | + sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist |
| 55 | + sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist |
| 56 | +else |
| 57 | + echo -e "${ERROR} This system is not supported!" |
| 58 | + exit 1 |
| 59 | +fi |
| 60 | + |
| 61 | +if [[ -n "${SSH_PASSWORD}" ]]; then |
| 62 | + echo -e "${INFO} Set user(${USER}) password ..." |
| 63 | + echo -e "${SSH_PASSWORD}\n${SSH_PASSWORD}" | sudo passwd "${USER}" |
| 64 | +fi |
| 65 | + |
| 66 | +echo -e "${INFO} Start ngrok proxy for SSH port..." |
| 67 | +screen -dmS ngrok \ |
| 68 | + ngrok tcp 22 \ |
| 69 | + --log "${LOG_FILE}" \ |
| 70 | + --authtoken "${NGROK_TOKEN}" \ |
| 71 | + --region "${NGROK_REGION:-us}" |
| 72 | + |
| 73 | +while ((${SECONDS_LEFT:=10} > 0)); do |
| 74 | + echo -e "${INFO} Please wait ${SECONDS_LEFT}s ..." |
| 75 | + sleep 1 |
| 76 | + SECONDS_LEFT=$((${SECONDS_LEFT} - 1)) |
| 77 | +done |
| 78 | + |
| 79 | +ERRORS_LOG=$(grep "command failed" ${LOG_FILE}) |
| 80 | + |
| 81 | +if [[ -e "${LOG_FILE}" && -z "${ERRORS_LOG}" ]]; then |
| 82 | + SSH_CMD="$(grep -oE "tcp://(.+)" ${LOG_FILE} | sed "s/tcp:\/\//ssh ${USER}@/" | sed "s/:/ -p /")" |
| 83 | + MSG=" |
| 84 | +*GitHub Actions - ngrok session info:* |
| 85 | +
|
| 86 | +⚡ *CLI:* |
| 87 | +\`${SSH_CMD}\` |
| 88 | +
|
| 89 | +🔔 *TIPS:* |
| 90 | +Run '\`touch ${CONTINUE_FILE}\`' to continue to the next step. |
| 91 | +" |
| 92 | + if [[ -n "${TELEGRAM_BOT_TOKEN}" && -n "${TELEGRAM_CHAT_ID}" ]]; then |
| 93 | + echo -e "${INFO} Sending message to Telegram..." |
| 94 | + curl -sSX POST "${TELEGRAM_API_URL:-https://api.telegram.org}/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \ |
| 95 | + -d "disable_web_page_preview=true" \ |
| 96 | + -d "parse_mode=Markdown" \ |
| 97 | + -d "chat_id=${TELEGRAM_CHAT_ID}" \ |
| 98 | + -d "text=${MSG}" >${TELEGRAM_LOG} |
| 99 | + TELEGRAM_STATUS=$(cat ${TELEGRAM_LOG} | jq -r .ok) |
| 100 | + if [[ ${TELEGRAM_STATUS} != true ]]; then |
| 101 | + echo -e "${ERROR} Telegram message sending failed: $(cat ${TELEGRAM_LOG})" |
| 102 | + else |
| 103 | + echo -e "${INFO} Telegram message sent successfully!" |
| 104 | + fi |
| 105 | + fi |
| 106 | + while ((${PRT_COUNT:=1} <= ${PRT_TOTAL:=10})); do |
| 107 | + SECONDS_LEFT=${PRT_INTERVAL_SEC:=10} |
| 108 | + while ((${PRT_COUNT} > 1)) && ((${SECONDS_LEFT} > 0)); do |
| 109 | + echo -e "${INFO} (${PRT_COUNT}/${PRT_TOTAL}) Please wait ${SECONDS_LEFT}s ..." |
| 110 | + sleep 1 |
| 111 | + SECONDS_LEFT=$((${SECONDS_LEFT} - 1)) |
| 112 | + done |
| 113 | + echo "------------------------------------------------------------------------" |
| 114 | + echo "To connect to this session copy and paste the following into a terminal:" |
| 115 | + echo -e "${Green_font_prefix}$SSH_CMD${Font_color_suffix}" |
| 116 | + echo -e "TIPS: Run 'touch ${CONTINUE_FILE}' to continue to the next step." |
| 117 | + echo "------------------------------------------------------------------------" |
| 118 | + PRT_COUNT=$((${PRT_COUNT} + 1)) |
| 119 | + done |
| 120 | +else |
| 121 | + echo "${ERRORS_LOG}" |
| 122 | + exit 4 |
| 123 | +fi |
| 124 | + |
| 125 | +while [[ -n $(ps aux | grep ngrok) ]]; do |
| 126 | + sleep 1 |
| 127 | + if [[ -e ${CONTINUE_FILE} ]]; then |
| 128 | + echo -e "${INFO} Continue to the next step." |
| 129 | + exit 0 |
| 130 | + fi |
| 131 | +done |
| 132 | + |
| 133 | +# ref: https://gist.github.com/retyui/7115bb6acf151351a143ec8f96a7c561 |
0 commit comments