feat: remote assist bootstrap script for macOS
This commit is contained in:
commit
27f1de9c36
33
README.md
Normal file
33
README.md
Normal file
@ -0,0 +1,33 @@
|
||||
# Remote Assist
|
||||
|
||||
macOS 远程协助一键脚本。启用 SSH + Cloudflare Quick Tunnel,让远程 Agent 可以 SSH 进来帮忙。
|
||||
|
||||
## 使用
|
||||
|
||||
被协助方执行:
|
||||
|
||||
```bash
|
||||
bash <(curl -fsSL https://git.shazhou.work/scottwei/remote-assist/raw/branch/main/remote-assist.sh) "ssh-ed25519 AAAA..."
|
||||
```
|
||||
|
||||
参数是协助者的 SSH 公钥。脚本会:
|
||||
|
||||
1. 将公钥加入 `~/.ssh/authorized_keys`
|
||||
2. 开启 macOS Remote Login (sshd)
|
||||
3. 安装并启动 Cloudflare Quick Tunnel
|
||||
4. 打印连接信息(隧道地址 + 用户名)
|
||||
|
||||
## 协助者连接
|
||||
|
||||
```bash
|
||||
# 1. 启动本地代理
|
||||
cloudflared access tcp --hostname <tunnel-host> --url localhost:2222
|
||||
|
||||
# 2. SSH(另一个终端)
|
||||
ssh -p 2222 <username>@localhost
|
||||
```
|
||||
|
||||
## 要求
|
||||
|
||||
- macOS(Intel / Apple Silicon)
|
||||
- 管理员密码(用于开启 Remote Login)
|
||||
158
remote-assist.sh
Normal file
158
remote-assist.sh
Normal file
@ -0,0 +1,158 @@
|
||||
#!/bin/bash
|
||||
# ─────────────────────────────────────────────────────────────────
|
||||
# remote-assist.sh — macOS 远程协助引导脚本
|
||||
# 用法: bash <(curl -fsSL https://git.shazhou.work/scottwei/remote-assist/raw/branch/main/remote-assist.sh) "ssh-ed25519 AAAA..."
|
||||
# ─────────────────────────────────────────────────────────────────
|
||||
set -euo pipefail
|
||||
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m'
|
||||
|
||||
info() { echo -e "${GREEN}[✓]${NC} $*"; }
|
||||
warn() { echo -e "${YELLOW}[!]${NC} $*"; }
|
||||
error() { echo -e "${RED}[✗]${NC} $*"; }
|
||||
banner() { echo -e "\n${CYAN}═══ $* ═══${NC}\n"; }
|
||||
|
||||
# ── 参数检查 ──────────────────────────────────────────────────────
|
||||
PUBKEY="${1:-}"
|
||||
if [[ -z "$PUBKEY" ]]; then
|
||||
error "请提供协助者的 SSH 公钥作为参数"
|
||||
echo "用法: bash <(curl -fsSL URL) \"ssh-ed25519 AAAA...\""
|
||||
exit 1
|
||||
fi
|
||||
|
||||
banner "远程协助引导脚本"
|
||||
echo "协助者公钥: ${PUBKEY:0:30}..."
|
||||
echo ""
|
||||
|
||||
# ── 1. 安装协助者公钥 ────────────────────────────────────────────
|
||||
banner "1/4 配置 SSH 公钥"
|
||||
mkdir -p ~/.ssh
|
||||
chmod 700 ~/.ssh
|
||||
touch ~/.ssh/authorized_keys
|
||||
chmod 600 ~/.ssh/authorized_keys
|
||||
|
||||
if grep -qF "$PUBKEY" ~/.ssh/authorized_keys 2>/dev/null; then
|
||||
info "公钥已存在,跳过"
|
||||
else
|
||||
echo "$PUBKEY" >> ~/.ssh/authorized_keys
|
||||
info "公钥已添加到 ~/.ssh/authorized_keys"
|
||||
fi
|
||||
|
||||
# ── 2. 启用 macOS Remote Login (sshd) ────────────────────────────
|
||||
banner "2/4 启用 SSH 服务"
|
||||
|
||||
# 检查是否已经运行
|
||||
if sudo systemsetup -getremotelogin 2>/dev/null | grep -qi "on"; then
|
||||
info "Remote Login 已开启"
|
||||
else
|
||||
warn "需要管理员权限来开启 Remote Login"
|
||||
sudo systemsetup -setremotelogin on
|
||||
if sudo systemsetup -getremotelogin 2>/dev/null | grep -qi "on"; then
|
||||
info "Remote Login 已开启"
|
||||
else
|
||||
# 备用方案:直接启动 sshd
|
||||
warn "systemsetup 失败,尝试直接启动 sshd..."
|
||||
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist 2>/dev/null || true
|
||||
if ssh -o ConnectTimeout=2 -o StrictHostKeyChecking=no localhost true 2>/dev/null; then
|
||||
info "sshd 已通过 launchctl 启动"
|
||||
else
|
||||
error "无法启动 SSH 服务,请在系统设置中手动开启:"
|
||||
echo " 系统设置 → 通用 → 共享 → 远程登录"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# ── 3. 安装 cloudflared 并启动隧道 ───────────────────────────────
|
||||
banner "3/4 启动 Cloudflare Tunnel"
|
||||
|
||||
if ! command -v cloudflared &>/dev/null; then
|
||||
info "正在安装 cloudflared..."
|
||||
if command -v brew &>/dev/null; then
|
||||
brew install cloudflared
|
||||
else
|
||||
# 直接下载二进制
|
||||
ARCH=$(uname -m)
|
||||
if [[ "$ARCH" == "arm64" ]]; then
|
||||
CF_URL="https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-darwin-arm64.tgz"
|
||||
else
|
||||
CF_URL="https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-darwin-amd64.tgz"
|
||||
fi
|
||||
curl -fsSL "$CF_URL" -o /tmp/cloudflared.tgz
|
||||
tar xzf /tmp/cloudflared.tgz -C /tmp
|
||||
sudo mv /tmp/cloudflared /usr/local/bin/cloudflared
|
||||
sudo chmod +x /usr/local/bin/cloudflared
|
||||
rm -f /tmp/cloudflared.tgz
|
||||
fi
|
||||
info "cloudflared 已安装"
|
||||
else
|
||||
info "cloudflared 已存在: $(cloudflared --version 2>&1 | head -1)"
|
||||
fi
|
||||
|
||||
# 启动 Quick Tunnel(后台运行,捕获输出)
|
||||
CF_LOG="/tmp/cloudflared-assist.log"
|
||||
pkill -f "cloudflared tunnel --url ssh://localhost:22" 2>/dev/null || true
|
||||
sleep 1
|
||||
|
||||
cloudflared tunnel --url ssh://localhost:22 > "$CF_LOG" 2>&1 &
|
||||
CF_PID=$!
|
||||
|
||||
info "cloudflared 已启动 (PID: $CF_PID)"
|
||||
info "等待隧道就绪..."
|
||||
|
||||
# 等待隧道 URL
|
||||
TUNNEL_HOST=""
|
||||
for i in $(seq 1 30); do
|
||||
TUNNEL_HOST=$(grep -oE 'https://[a-z0-9-]+\.trycloudflare\.com' "$CF_LOG" 2>/dev/null | head -1 || true)
|
||||
if [[ -n "$TUNNEL_HOST" ]]; then
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
if [[ -z "$TUNNEL_HOST" ]]; then
|
||||
error "30 秒内未获取到隧道地址,日志如下:"
|
||||
cat "$CF_LOG"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TUNNEL_HOSTNAME=$(echo "$TUNNEL_HOST" | sed 's|https://||')
|
||||
USERNAME=$(whoami)
|
||||
|
||||
# ── 4. 打印连接信息 ──────────────────────────────────────────────
|
||||
banner "4/4 连接信息"
|
||||
|
||||
echo -e "${GREEN}╔══════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${GREEN}║${NC} 远程协助已就绪!请将以下信息发给协助者: ${GREEN}║${NC}"
|
||||
echo -e "${GREEN}╠══════════════════════════════════════════════════════════════╣${NC}"
|
||||
echo -e "${GREEN}║${NC} ${GREEN}║${NC}"
|
||||
echo -e "${GREEN}║${NC} 隧道地址: ${CYAN}${TUNNEL_HOSTNAME}${NC}"
|
||||
echo -e "${GREEN}║${NC} 用户名: ${CYAN}${USERNAME}${NC}"
|
||||
echo -e "${GREEN}║${NC} ${GREEN}║${NC}"
|
||||
echo -e "${GREEN}║${NC} 协助者连接命令: ${GREEN}║${NC}"
|
||||
echo -e "${GREEN}║${NC} ${YELLOW}# 1. 启动本地代理${NC}"
|
||||
echo -e "${GREEN}║${NC} ${CYAN}cloudflared access tcp --hostname ${TUNNEL_HOSTNAME} --url localhost:2222${NC}"
|
||||
echo -e "${GREEN}║${NC} ${YELLOW}# 2. SSH 连接(另一个终端)${NC}"
|
||||
echo -e "${GREEN}║${NC} ${CYAN}ssh -p 2222 ${USERNAME}@localhost${NC}"
|
||||
echo -e "${GREEN}║${NC} ${GREEN}║${NC}"
|
||||
echo -e "${GREEN}╚══════════════════════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
warn "隧道保持运行中,按 Ctrl+C 结束会话"
|
||||
warn "日志: $CF_LOG"
|
||||
echo ""
|
||||
|
||||
# 保持前台运行,Ctrl+C 退出时清理
|
||||
cleanup() {
|
||||
echo ""
|
||||
info "正在清理..."
|
||||
kill $CF_PID 2>/dev/null || true
|
||||
info "隧道已关闭,远程协助结束"
|
||||
}
|
||||
trap cleanup EXIT INT TERM
|
||||
|
||||
# 等待 cloudflared 进程
|
||||
wait $CF_PID 2>/dev/null || true
|
||||
Loading…
x
Reference in New Issue
Block a user