You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将SSH会话的完整TTY回显历史保存至文件?

当然可以实现!

这个需求非常实用,不管是临时排查问题还是长期审计会话操作,都有成熟的解决方案,而且客户端和服务器端都能操作,我给你分场景讲清楚:

一、临时需求:客户端操作(无需服务器配置)

如果你只是偶尔需要记录某次SSH会话的所有输出,直接在本地发起SSH连接时带上script命令就行,服务器上不需要做任何修改:

ssh your-user@your-server-ip 'script -f -q /home/your-user/session-log-$(date +%Y%m%d-%H%M%S).log'
  • -f:强制实时刷新日志内容,避免输出缓存导致日志不完整
  • -q:安静模式,不会显示Script started/Script done这类提示信息
  • 后面的路径可以自己改,加时间戳是为了避免每次覆盖旧日志

执行这条命令后,你会正常进入服务器的Shell,之后所有的命令输入、输出(包括提示符、命令结果)都会被完整记录到指定的日志文件里。退出SSH会话时,script会自动停止,日志就保存好了。

二、长期需求:服务器端配置(自动记录所有会话)

如果希望每次SSH登录都自动记录会话,或者要统一管理所有用户的会话日志,可以在服务器端做配置:

1. 针对单个用户(比如你的个人账号)

编辑你的Shell配置文件(如果用Bash就是~/.bashrc,Zsh就是~/.zshrc),添加一行:

script -f -q /home/your-user/session-logs/$(date +%Y%m%d-%H%M%S).log

先创建日志目录避免报错:

mkdir -p /home/your-user/session-logs
chmod 700 /home/your-user/session-logs

之后每次你SSH登录,都会自动启动script记录会话,退出时自动停止。

2. 针对所有用户(管理员统一配置)

修改SSH服务的配置文件/etc/ssh/sshd_config,添加:

ForceCommand script -f -q /var/log/ssh-sessions/%u-%t.log
  • %u会替换为登录的用户名,%t会替换为会话启动的时间戳,方便区分不同用户的会话

然后创建日志目录并设置权限(确保只有管理员能访问):

mkdir -p /var/log/ssh-sessions
chown root:root /var/log/ssh-sessions
chmod 700 /var/log/ssh-sessions

最后重启SSH服务生效:

systemctl restart sshd

这样所有用户通过SSH登录服务器时,都会被强制记录会话日志,适合企业级的审计需求。

验证效果

不管用哪种方法,你登录后执行:

echo "dafds"
ls

退出会话后打开日志文件,就能看到类似这样的内容:

bash-4.4$ echo "dafds"
dafds
bash-4.4$ ls
README.md

完全符合你的要求!

另外提个小细节:script默认会记录终端的控制字符(比如颜色代码),如果需要清理这些字符得到纯文本日志,可以用:

col -b < session-log-file > clean-log-file

内容的提问来源于stack exchange,提问作者cmal

火山引擎 最新活动