🛡️ 解决堡垒机会话频繁断开:使用 Tampermonkey 脚本自动保活
适用场景:运维、安全审计、远程办公等需要长时间保持 Web 堡垒机(Bastion Host)会话的场景。
问题:堡垒机因“无操作”在 5~10 分钟内自动登出,严重影响工作效率。
解决方案:通过浏览器油猴脚本(Tampermonkey)模拟用户活动,实现“静默保活”。
🔧 一、为什么需要保活?
大多数企业级堡垒机(如 JumpServer、阿里云云堡垒机、自研系统等)出于安全考虑,会设置 会话空闲超时机制(例如 5 分钟无操作自动登出)。
但实际工作中,我们可能:
- 需要长时间查看日志
- 等待命令执行结果
- 多窗口协作操作
频繁重新登录不仅打断工作流,还可能丢失上下文。
🛠 二、解决方案:Tampermonkey 模拟用户活动
✅ 优势
- 无需刷新页面(避免重新登录)
- 完全前端实现,不依赖后端
- 免费、开源、本地运行
- 仅作用于指定域名,安全可控
📝 三、操作步骤
步骤 1:安装 Tampermonkey 插件
- Chrome / Edge 用户访问:https://www.tampermonkey.net/
- 点击 “Add to Chrome” 安装
- 安装后浏览器右上角会出现 🐒 图标
步骤 2:创建保活脚本
- 点击 Tampermonkey 图标 → 选择“创建新脚本”
- 删除默认内容,粘贴以下代码:
// ==UserScript==// @name Bastion Keep-Alive// @namespace http://tampermonkey.net/// @version 1.0// @description 在堡垒机页面定时模拟用户活动,防止会话超时断开// @author Your Name// @match https://10.99.XX.XX/*// @grant none// ==/UserScript==(function(){'use strict';// 设置保活间隔(建议小于堡垒机超时时间,例如4分钟)constINTERVAL=4*60*1000;// 4分钟functionsimulateActivity(){try{console.log('🛡️ [Keep-Alive] 模拟用户活动 at',newDate().toLocaleTimeString());// 触发 mousemove 事件(多数系统以此判断活跃)document.dispatchEvent(newMouseEvent('mousemove',{view:window,bubbles:true,cancelable:true,clientX:Math.random()*100,clientY:Math.random()*100}));}catch(e){console.warn('⚠️ Keep-Alive 脚本异常:',e.message);}}// 立即执行一次 + 定时循环simulateActivity();setInterval(simulateActivity,INTERVAL);})();⚠️ 重要:请将
@match行中的https://10.99.XX.XX/*替换为你实际的堡垒机地址。
- 如果使用 HTTP,添加
// @match http://your-ip/*- 如果带端口(如 :8443),写成
https://10.99.XX.XX:8443/*
- 按
Ctrl+S保存脚本
步骤 3:验证脚本是否生效
- 打开你的堡垒机页面(如
https://10.99.XX.XX/client/...) - 按
F12打开开发者工具 → 切到Console标签 - 观察是否每隔 4 分钟出现如下日志:
🛡️ [Keep-Alive] 模拟用户活动 at 14:30:22 - 同时检查 Tampermonkey 图标是否亮起(表示脚本已注入)
✅ 出现日志 → 脚本正常运行!会话将不再因“无操作”而断开。
⚠️ 四、注意事项
- 遵守公司安全策略
自动保活可能违反部分企业的安全规定,请确保你有权限使用。 - 不要设置过短间隔
建议保活间隔为超时时间的 70%80%(如超时 5 分钟,设为 34 分钟)。
避免高频操作被系统判定为异常行为。 - 某些系统需更强交互
如果mousemove无效,可尝试增加键盘事件:document.dispatchEvent(newKeyboardEvent('keydown',{key:'Control'})); - IP 地址变更需更新脚本
若堡垒机 IP 或端口变化,记得同步修改@match规则。
💡 五、进阶建议
- 多环境支持:可添加多个
@match行,覆盖测试/生产环境。 - **视觉反馈(调试用)**:临时加
document.body.style.boxShadow = '0 0 10px red'看是否触发。 - 结合 AutoHotkey:若浏览器插件受限,可用桌面自动化工具辅助。