如何在服务器上录制 SSH 会话的操作视频

你可以直接在服务器端捕获 SSH 会话,并将其转换为可回放的录制内容。实现这一点的方法有很多:内置的 script 命令、asciinema、ttyrec,以及 Teleport 和 JumpServer 这类商业化会话录制网关。每一种方案都是在伪终端层面捕获终端活动,因此回放时会像观看一段会话“视频”一样重现整个操作过程。
你真正关心的是实际落地:哪种方法最适合你的环境,以及今天该如何部署?答案取决于你的目标。有些团队只需要在单台主机上快速录制;有些团队更看重可分享的回放、传统兼容性,或集中式的合规控制。本指南将帮助你根据审计、故障排查或培训的需求,选择最合适的方式来录制操作视频。
SSH 录制是如何工作的
文本日志与可回放录制的区别
普通文本日志只保存操作人员输入的字符,以及服务器返回的输出内容。你得到的是一份平面的文字记录。它确实能告诉你执行了哪些命令,但会丢失事件发生的顺序感和节奏感。可回放录制则会保留相同的内容,并额外记录时间信息。每一次按键、每一行输出都会带上时间戳。播放时,系统会按照原始节奏重现整个会话,让你看到命令何时执行、结果在几秒后如何出现,就像操作人员当时所看到的一样。
第二个关键差异在于转义序列。终端程序会发送控制代码,用于颜色显示、光标移动和全屏重绘。文本日志通常会去掉这些代码,或者把它们保存成难以阅读的杂乱内容。而录制文件会保留这些信息,播放器在回放时再对其进行解析。因此,菜单、进度条和交互式编辑器都能正确呈现。你还可以在时间轴上拖动、暂停,精准定位到配置变更出错的那个瞬间。
| 方面 | 文本日志 | 可回放录制 |
|---|---|---|
| 内容 | 仅包含字符 | 字符、时间信息与控制代码 |
| 回放方式 | 静态阅读 | 按时间节奏进行可视化回放 |
| 最适合 | 快速 grep 检索 | 审计、培训、事故复盘 |
服务器端捕获与 pty
每一次 SSH 登录,主机都会分配一个伪终端,也就是 pty。Shell、命令和应用程序都通过这个 pty 进行读写。如果你在这一层进行捕获,就等于处在操作人员与 shell 之间。任何输入输出在到达进程之前,都会经过你的捕获点。
这种位置上的优势解决了一个常见缺口。客户端工具只能录制那些已安装软件的设备。如果操作人员使用个人笔记本、跳板机,或平板设备接入,那么这些客户端软件就可能被完全绕过。而服务器端捕获是跟随会话本身进行的,所以一旦认证成功,录制就会自动开始。操作人员本地环境如何配置不再重要。你只需在主机上完成一次配置,就能覆盖所有连接者,并让整个团队、所有班次都拥有一致的录制归档方式。
录制操作视频的方法
使用 script 命令进行录制
script 工具随大多数 Linux 发行版一同提供,通常属于 util-linux 软件包,因此你无需额外安装,也不需要单独的配置文件。它会把终端中经过的所有内容写入文件;如果你启用时间记录,还会连同时间信息一起保存。
使用 script session.log 即可开始录制。该工具会打开一个新的 shell,之后所有按键和输出都会写入这个文件。输入 exit 即可结束录制。若要将时间信息保存到独立文件,可加上 -t 参数:script -t timing.log session.log。之后可通过 scriptreplay timing.log session.log 回放会话。回放会遵循原始延迟,因此效果看起来就像是一段终端操作视频。播放器还支持速度除数参数,这样你可以更快浏览较长的会话。请务必将时间文件与会话文件放在一起,因为播放器需要同时使用这两个文件。
若想实现自动录制,可以把命令写入用户的 shell 配置文件。例如,像 script -q -a /var/log/sessions/USER-(date +%s).log 这样一行命令,就可以把每次登录的内容追加到带时间戳的文件中。参数 -q 用于隐藏启动提示。这种方式无需安装新软件包,就能在任意主机上实现轻量级的操作视频录制。你可以再配合日志轮转,以免旧文件占满磁盘。需要注意的是,script 保存的是原始终端输出,因此播放器必须正确解析转义代码。在真正依赖归档之前,先测试一次回放效果。
使用 asciinema 和 ttyrec 录制操作视频
asciinema 能生成紧凑、便于分享的录制文件。你可以通过软件包管理器安装它,例如 apt install asciinema 或 pip install asciinema。该工具依赖 Python,而大多数服务器本身已具备该运行环境。安装前请确认解释器版本满足工具要求。执行 asciinema rec demo.cast 开始录制,按下 Ctrl-D 结束。你可以用 asciinema play demo.cast 回放文件,或者上传到 asciinema.org,生成一个供团队成员在浏览器中打开的链接。cast 格式保存的是文本与时间信息,因此文件体积通常很小。你还可以通过 --idle-time-limit 参数限制空闲停顿时长,并在用户家目录下的配置文件中设置默认值,以便今后的每一次录制都自动应用这些选项。
ttyrec 的模式与之类似,但历史更久。你可以通过发行版仓库安装,例如 apt install ttyrec。执行 ttyrec session.tty 开始录制,按 Ctrl-D 结束。使用 ttyplay session.tty 回放。参数 -a 可将内容追加到现有文件中,这在你希望每位操作人员都维护一个统一归档文件时非常有用。该格式得到广泛播放器支持,因此当你需要打开旧档案时会很方便。社区中也有脚本可将 ttyrec 文件转换为其他格式。由于这两种工具都是在会话内部进行捕获,因此更适合希望自行保存个人录制内容的操作人员。
如果你需要在整个服务器集群范围内统一捕获,会话管理网关如 Teleport 和 JumpServer 则可以在代理层记录所有会话。它们提供集中式存储、访问策略和检索能力。每份录制都会附带用户、主机、开始时间等元数据。你只需配置一次网关,经过它的全部流量都能被回放。相较于单条命令,这类方案部署起来需要更多规划,但回报是覆盖范围统一且管理标准一致。请查阅厂商文档,确认其支持的协议与存储后端。这类方案非常适合需要在大量服务器上实现一致录制能力的团队。
录制方法对比
性能与成本
每一种录制方式都会给服务器带来一定负载,而负载大小主要取决于捕获发生在哪一层。script 命令以本地进程形式运行在登录 shell 内部。它将原始终端输出写入磁盘,因此开销较低且可预期。asciinema 和 ttyrec 的工作方式类似,同样是在会话旁边运行一个轻量进程。它们的 cast 文件和 tty 文件只保存文本与时间信息,因此归档文件通常较小,存储成本也比较低。像 Teleport 和 JumpServer 这样的托管网关则在前面增加了一层代理。这一层需要处理加密、存储和索引所有连接,因此会提高网关主机上的资源消耗。你用更多算力换来集中控制能力。
成本结构也遵循同样的规律。这三种命令行工具基本都是免费随发行版提供,或者可以通过公共仓库安装,不需要许可证费用。真正的成本在于存储,以及团队为配置轮转和访问控制规则投入的时间。商业化网关则会产生授权费和基础设施成本,而且这些成本往往会随着账号数和服务器数量增长而上升。对于仅有少量主机的小团队来说,内置工具通常更经济。对于拥有大规模服务器集群和众多操作人员的环境,网关成本往往更容易被合理化,因为一个平台就能取代零散的脚本体系。
使用场景的匹配程度和价格同样重要。如果你只想在单台主机上零门槛开启录制,选择 script。如果你需要一个同事可以直接在浏览器中打开的分享链接,选择 asciinema。如果你必须兼容旧档案,并依赖长期存在的播放器支持,选择 ttyrec。如果你需要在大量机器上获得统一覆盖,并希望拥有可搜索索引,选择托管网关。你也可以混合使用,例如在开发者机器上使用 asciinema,在生产环境中使用网关。
合规适配性
比起纯粹的性能指标,合规要求往往更能决定最终方案。审计人员希望看到:每一次会话都被完整捕获,归档内容未被篡改,并且只有授权人员才能查看。命令行工具能帮你完成“录制”本身,但文件防篡改与访问控制需要你自行设计和落实。你必须收紧文件权限、把日志发送到集中式存储,并保留谁查看过什么内容的审计轨迹。这些工作完全可以做到,而且许多团队都通过严谨脚本实现了良好的结果。
托管网关则把这些控制能力直接做进了平台。它们会把每一段录制与一个已认证身份绑定,将内容存放到集中式后端,并记录每一次回放操作。这种设计非常适合受监管环境,因为你需要向审计方证明完整的证据链。代价则是更强的厂商依赖,以及更复杂、更重的部署过程。
先根据审计义务选择工具,再考虑预算。一个访问控制薄弱的免费工具,在合规审查中造成的代价,可能比一个付费平台更高。
无论你选择哪条路线,在大规模推广前都应先完整测试一次回放流程。确认时间节奏正确、颜色渲染正常,且文件能够在你选定的播放器中顺利打开。然后再配合保留策略和明确的观看权限规则进行推广。这样做能让你的录制工作始终围绕其真正目的展开:审计、故障排查或培训。只有以这种纪律来录制操作视频,团队在数月后遇到问题时,才能真正信任这些归档内容。
录制最佳实践
存储与保留
应将录制文件发送到集中式位置,而不是保存在各台主机的本地磁盘上。共享挂载、对象存储,或者网关自身的后端,都能把文件统一起来,并在服务器重建后仍然保留。只保存在本地的文件会在机器被替换时消失,也会随着服务器数量增长而分散到各处。集中存储还能让你对所有归档统一应用一套保留规则。
设置与审计要求及磁盘预算相匹配的保留周期。保留时间要足够长,以便在几个月后仍能回答相关问题;之后则按计划删除。可使用 cron 任务或日志管理工具来自动轮转。不要在未验证的情况下直接信任删除任务,因为一个失效的清理脚本会悄无声息地把磁盘占满。为事故复盘而录制操作视频的团队,通常会设置比合规场景更短的保留窗口。
安全与访问控制
应将录制文件视为敏感数据。会话中可能包含明文输入的密码、屏幕上显示的客户数据,以及内部主机名。只向确有需要的人员开放读取权限,并记录每一次回放。对于共享主机而言,仅依赖文件权限的保护较为薄弱,因此更建议使用带有基于角色访问控制的集中式存储。
还要防止篡改。将录制内容写入仅追加存储,或写入可保留不可变副本的后端。文件关闭时计算校验和,并将其单独保存,这样你以后就能证明归档未被修改。再为每段录制配套一份审计轨迹,注明操作人员、主机、开始时间,以及所有观看过回放的人。这样的一整条证据链,才能让原始文件真正成为审计人员认可的材料。
在大规模推广前,先完整测试一次回放流程。确认时间节奏、颜色渲染以及访问控制规则都符合预期。
选择与你目标相匹配的工具。若想在单台主机上快速使用内置能力进行录制,选择 script。若需要轻量且便于分享的回放,选择 asciinema。若你需要经典兼容性,选择 ttyrec。若处于合规要求严格的环境,则选择像 Teleport 或 JumpServer 这样的托管网关。
从小范围开始。先在一台服务器上试点,然后在扩展前验证回放质量。检查时间节奏、颜色呈现和播放器兼容性。随后再在具备保留策略和访问控制政策的前提下进行推广。
最后,请始终让工具服务于你的目标。无论是为了审计、故障排查还是培训而录制操作视频,都应让这一目的主导你的每一项选择。只有目标明确,归档内容在几个月后回头查看时才真正有价值。
常见问题
会话录制会捕获在提示符中输入的密码吗?
会。捕获发生在伪终端层,因此每一次按键都会写入文件,包括密码和屏幕上显示的敏感信息。请将每一份归档都视为敏感数据。只允许授权人员进行回放,并将文件保存在受保护的后端中。绝不要通过公开链接分享原始 cast 文件。
能否在操作人员不知情的情况下捕获会话?
可以,很多合规项目确实就是这样做的。服务器端捕获运行在操作人员控制范围之外,因此无论其本地如何设置,都会在登录后立即开始录制。不过你应先核查本地法律法规以及雇佣协议。在许多司法辖区,你必须告知用户其会话正受到监控。
这些录制文件会占用多少磁盘空间?
基于文本的录制文件通常较小,因为它们保存的是字符与时间信息,而不是视频帧。实际大小取决于会话时长和输出量。请先在自己的主机上测量几段真实会话,再根据样本来规划存储容量。同时设置保留周期并自动清理,以防归档无限增长。
script 命令在所有 Linux 服务器上都可用吗?
它属于 util-linux,而大多数发行版默认都会包含该软件包。在依赖它之前,请先确认你的基础镜像中确实存在该软件包。极简容器和某些嵌入式系统可能并不包含它。在标准化部署前,先在一台主机上做一次快速录制与回放测试。
如何确认录制文件可以正确回放?
用你选定的播放器把一份文件从头到尾回放一遍。检查时间节奏是否自然、颜色是否正常显示、全屏程序是否能正确重绘。再确认该文件能在另一台机器上打开,而不仅仅是在录制它的那台机器上。每次工具或播放器升级后,都应重复进行这项检查。
