work_script/sso/run_sso_script.sh
Ching L 491db50f95 feat(sso): add interactive SSO management script tools
- Added run_sso_script.sh for remote script execution with SSH
- Added sso_script.py with Django-based SSO management functions
- Implemented XDP Ultra redeem code generation functionality
- Added batch product binding and update capabilities
- Included comprehensive documentation and usage examples
- Added automatic cleanup mechanisms for remote temporary files
2025-12-12 18:05:53 +08:00

90 lines
3.2 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# --- 配置区 ---
REMOTE_USER="root"
REMOTE_SERVER="172.24.9.97"
PYTHON_SCRIPT_FILE="./sso_script.py"
# --- 配置区结束 ---
# 检查本地脚本文件是否存在
if [ ! -f "$PYTHON_SCRIPT_FILE" ]; then
echo "错误: Python脚本文件 $PYTHON_SCRIPT_FILE 不存在!"
exit 1
fi
echo "第一步: 正在将脚本上传到远程服务器..."
# 在远程创建一个唯一的临时文件名
# 使用 mktemp 在本地生成一个有意义的名字,方便后续引用
# 格式: /tmp/interactive_script_随机数.py
TEMP_SCRIPT_NAME_ON_REMOTE="/srv/sso/cgi-bin/interactive_script_$$.py"
# 使用第一个SSH连接将本地脚本内容写入远程的临时文件
# 这个连接不需要 -t因为它只负责传输数据
# 注意:我们使用 `printf` 来构建远程命令,以避免复杂的引号问题
ssh "$REMOTE_USER@$REMOTE_SERVER" "
CT_ID=\$(pct list | awk '/celery/ {print \$1; exit}');
if [ -z \"\$CT_ID\" ]; then
echo '错误: 未找到名称包含 celery 的容器' >&2;
exit 1;
fi;
echo \"找到容器 ID: \$CT_ID\" >&2;
pct exec \"\$CT_ID\" -- bash -c \"cat > $TEMP_SCRIPT_NAME_ON_REMOTE\"
" < "$PYTHON_SCRIPT_FILE"
# 检查上传是否成功
if [ $? -ne 0 ]; then
echo "错误: 脚本上传失败。"
exit 1
fi
echo "上传成功: $TEMP_SCRIPT_NAME_ON_REMOTE"
# 设置本地清理机制,确保即使脚本被中断,也能清理远程临时文件
cleanup_remote() {
echo "正在清理远程临时文件..." >&2
ssh "$REMOTE_USER@$REMOTE_SERVER" "
CT_ID=\$(pct list | awk '/celery/ {print \$1; exit}');
if [ -n \"\$CT_ID\" ]; then
pct exec \"\$CT_ID\" -- bash -c \"rm -f $TEMP_SCRIPT_NAME_ON_REMOTE\" 2>/dev/null || true;
fi
" 2>/dev/null || true
}
trap cleanup_remote EXIT INT TERM
echo "----------------------------------------------------"
echo "第二步: 正在连接到远程服务器以交互式执行脚本..."
echo "(执行完毕后,临时文件将被自动删除)"
echo "----------------------------------------------------"
# 使用第二个SSH连接这个连接是纯粹的交互式连接 (-t)
# 它负责执行远程的脚本,并连接你的终端
# 注意:我们使用 `pct exec` 而不是 `pct enter`,这样更脚本化
ssh -t "$REMOTE_USER@$REMOTE_SERVER" "
CT_ID=\$(pct list | awk '/celery/ {print \$1; exit}');
if [ -z \"\$CT_ID\" ]; then
echo '错误: 未找到名称包含 celery 的容器' >&2;
exit 1;
fi;
# 定义一个退出清理函数
cleanup() {
echo \"清理远程临时文件...\";
pct exec \"\$CT_ID\" -- bash -c \"rm -f $TEMP_SCRIPT_NAME_ON_REMOTE\";
echo \"清理完成。\";
}
# 设置脚本结束时(无论是正常退出还是被中断)都执行清理
trap cleanup EXIT
# 执行脚本(使用 set -e 确保任何命令失败都会退出)
pct exec \"\$CT_ID\" -- bash -c \"
set -e;
cd /srv/sso/cgi-bin/;
source /srv/venv/bin/activate;
python $TEMP_SCRIPT_NAME_ON_REMOTE
\" || { echo '错误: Python 脚本执行失败' >&2; exit 1; };
"
echo "----------------------------------------------------"
echo "远程交互式脚本已结束。"