Files
workpod/ttyd-session.sh

63 lines
2.1 KiB
Bash

#!/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