PowerShell SSH连接服务器执行命令输出乱码 配置UTF8无效如何解决
PowerShell通过SSH执行远程命令输出乱码修复
乱码具体出现在Similarity与->之后的文本位置,本质原因不是编码配置错误,而是远程命令输出携带的ANSI彩色格式控制序列,本地PowerShell无法正常解析导致的,仅配置UTF8编码无法解决这类问题。
方案1:从源头禁用远程输出的彩色格式(优先推荐,无额外处理成本)
- 调用SSH时加
-T参数禁用伪终端分配,绝大多数命令行程序检测到非交互式终端环境时,会自动关闭彩色、格式类控制字符输出:
ssh -T <远程用户名>@<远程服务器地址> "<需要执行的远程命令>"
- 如果加
-T参数后仍有彩色输出,执行远程命令前先设置TERM=dumb环境变量,强制终端下所有程序不输出格式控制符:
ssh <远程用户名>@<远程服务器地址> "export TERM=dumb; <需要执行的远程命令>"
方案2:本地过滤输出内容中的ANSI控制序列
如果需要保留交互式终端能力、不能直接禁用彩色输出,可以在接收到SSH返回内容后,用正则把所有ANSI格式控制符删掉,保留纯文本内容。
保留原有UTF8编码配置的基础上,增加过滤逻辑即可:
# 原有UTF8编码配置保留 $OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding # 执行SSH命令获取原始输出 $rawResult = ssh <远程用户名>@<远程服务器地址> "<需要执行的远程命令>" # 正则匹配移除所有ANSI彩色/光标/格式控制序列 $cleanResult = $rawResult -replace '\x1B\[[0-9;]*[a-zA-Z]', '' # 输出清理后的无乱码内容 $cleanResult
方案3:升级PowerShell原生支持ANSI格式
如果使用的是Windows自带的旧版PowerShell 5.1,其本身对ANSI转义序列的支持存在缺陷,升级到PowerShell 7及以上版本后,可原生解析ANSI彩色控制符,既不会出现乱码,还能正常保留远程输出的彩色效果。
内容的提问来源于stack exchange,提问作者Alando123
相关产品推荐
相关产品推荐

