#!/bin/bash # ttyd 会话入口:根据 URL 参数或用户选择分配 tmux session SESSION_NAME="" # ttyd 会将 query string 存入 TTYD_QUERY_STRING 环境变量 if [ -n "$TTYD_QUERY_STRING" ]; then # 解析 session 参数 SESSION_NAME=$(echo "$TTYD_QUERY_STRING" | tr '&' '\n' | grep '^session=' | head -1 | cut -d= -f2) fi if [ -z "$SESSION_NAME" ]; then # 没有指定 session,显示选择菜单 echo "" echo "╔══════════════════════════════════════╗" echo "║ 选择或创建 tmux session ║" echo "╠══════════════════════════════════════╣" # 列出已有 session EXISTING=$(tmux list-sessions 2>/dev/null | awk '{print $1}') if [ -n "$EXISTING" ]; then echo "║ 已有 session: ║" I=1 for s in $EXISTING; do printf "║ [%d] %-33s║\n" "$I" "$s" I=$((I + 1)) done else echo "║ (无已有 session) ║" fi echo "╠══════════════════════════════════════╣" echo "║ 输入编号选择,或输入新名称创建 ║" echo "╚══════════════════════════════════════╝" echo "" read -p "session: " CHOICE if [ -z "$CHOICE" ]; then CHOICE="default" fi # 判断是数字编号还是名称 if echo "$CHOICE" | grep -qE '^[0-9]+$' && [ -n "$EXISTING" ]; then SESSION_NAME=$(echo "$EXISTING" | sed -n "${CHOICE}p") else SESSION_NAME="$CHOICE" fi # 清屏 clear fi # session 名只保留字母数字下划线连字符 SESSION_NAME=$(echo "$SESSION_NAME" | tr -cd 'a-zA-Z0-9_\-') # 如果 session 已存在,共享 attach;否则新建 if tmux has-session -t "$SESSION_NAME" 2>/dev/null; then exec tmux attach-session -t "$SESSION_NAME" else exec tmux new-session -s "$SESSION_NAME" fi