ttyd 和 Cloudflared web访问内网机器shell

https://github.com/xkatld/github-actions/blob/main/start.sh

`

!/bin/bash

echo “正在安装 ttyd 和 Cloudflared…”

安装 ttyd

sudo apt update -y
sudo apt install snapd -y
sudo snap install ttyd —classic

安装 Cloudflared

ARCH=$(uname -m)
if [ “$ARCH” = “aarch64” ] || [ “$ARCH” = “arm64” ]; then
wget -q https://github.com/cloudflare/cloudflared/releases/download/2025.10.1/cloudflared-linux-arm64 -O cloudflared
else
wget -q https://github.com/cloudflare/cloudflared/releases/download/2025.10.1/cloudflared-linux-amd64 -O cloudflared
fi
chmod +x cloudflared
sudo mv cloudflared /usr/local/bin/

停止可能存在的进程

pkill -f ttyd 2>/dev/null || true
pkill -f cloudflared 2>/dev/null || true

启动 ttyd(关键:-W 允许写入,直接运行 bash)

echo “启动 ttyd…”
ttyd -p 7681 -W bash &
TTYD_PID=$!

等待启动

sleep 3

检查 ttyd 是否运行

if ps -p $TTYD_PID > /dev/null; then
echo “✓ ttyd 启动成功 (PID: $TTYD_PID)”
else
echo “✗ ttyd 启动失败,尝试重新启动…”
ttyd -p 7681 -W bash &
TTYD_PID=$!
sleep 2
fi

检查端口

if netstat -tuln | grep -q “:7681”; then
echo “✓ ttyd 正在监听端口 7681”
else
echo “✗ ttyd 未监听端口 7681”
exit 1
fi

启动 Cloudflared 隧道

echo “启动 Cloudflared 隧道…”
nohup cloudflared tunnel —url http://localhost:7681 > cloudflared.log 2>&1 &
CLOUDFLARED_PID=$!

等待隧道建立

echo “等待隧道建立…”
sleep 10

获取公共 URL

PUBLIC_URL=””
for i in {1..10}; do
if [ -f cloudflared.log ]; then
PUBLIC_URL=$(grep -o “https://[a-zA-Z0-9.-]*\.trycloudflare\.com“ cloudflared.log | head -1)
if [ -n “$PUBLIC_URL” ]; then
break
fi
fi
sleep 2
done

显示访问信息

IP=$(hostname -I | awk ‘{print $1}’)
echo “”
echo “==================================================”
echo “安装完成!”
echo “==================================================”
echo “本地访问: http://$IP:7681
if [ -n “$PUBLIC_URL” ]; then
echo “外网访问: $PUBLIC_URL”
else
echo “外网访问: 正在生成… (查看: cat cloudflared.log)”
fi
echo “”
echo “现在应该可以直接在网页终端中输入命令了!”
echo “==================================================”

保存进程信息

echo $TTYD_PID > ttyd.pid
echo $CLOUDFLARED_PID > cloudflared.pid

`