1 WindTerm远程连接Ubuntu26.04出现 OSC3008 代码
systemd < 259:无内置 OSC3008 脚本,服务器不会主动输出这串标记,无论终端开不开集成都不会乱码;
systemd ≥ 259:自带自动发送 3008 序列的 shell 钩子,只要终端下发了 Shell 集成环境变量,就会打印长串控制码。
该版本增加了一个名为 80-systemd-osc-context.sh 的脚本,它会向终端发送 Shell 和命令的上下文信息(即 OSC 3008 序列)
查看systemd版本
systemctl --version
原因:从systemd的较新版本开始,它在/etc/profile.d/80-systemd-osc-context.sh这个文件中加入了OSC 3008序列,用于向终端发送上下文信息(比如当前用户、主机名、是否root、容器、SSH、命令开始/结束等)
1)直接将PROMPT_COMMAND参数unset
缺点:PROMPT_COMMAND 是 Bash 中一个非常核心的环境变量,它在每次显示命令提示符前都会执行。除了触发 OSC 3008 序列,许多 Linux 发行版还利用它来记录用户操作历史、更新终端标题栏等。直接 unset 会导致这些正常功能失效。
# 清空会输出OSC标记的提示符钩子
echo 'unset PROMPT_COMMAND' >> ~/.bashrc
# 让配置立刻生效
source ~/.bashrc2)全局覆盖并禁用相关函数
缺点:无论您是通过 SSH 远程连接,还是直接使用 Ubuntu 主机前使用物理终端(XWindow桌面里的终端模拟器),都会禁用 OSC 3008 序列
如果在本地终端中某些工具或脚本依赖这些 systemd 的 OSC 扩展函数,可能会导致这些工具失效
# 禁用systemd OSC 3008的扩展输出
__systemd_osc_context_precmdline() { :; }
__systemd_osc_context_common() { :; }
__systemd_osc_context_escape() { :; }
PS0=""3)条件剔除
只在检测到 SSH 远程连接(通过 $SSH_CONNECTION 环境变量判断)时才禁用。如果您在本地桌面打开终端,OSC 序列依然会正常发送,不会影响本地终端的功能
# 仅在通过 SSH 连接时,从 PROMPT_COMMAND 中剔除 systemd 的 OSC 上下文函数
if [[ -n "$SSH_CONNECTION" ]]; then
PROMPT_COMMAND=(
"${PROMPT_COMMAND[@]/__systemd_osc_context_precmdline}"
)
PS0=""
fi4)临时解决办法:重命名该脚本,然后重新登录或者source /etc/profile
mv /usr/lib/systemd/profile.d/80-systemd-osc-context.sh /usr/lib/systemd/profile.d/80-systemd-osc-context.sh.bak终极解决办法:
使用xshell或者新版远程工具连接,工具会屏蔽相关信息。