如何将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




