主机别名
win11= 192.168.31.225(root@22)
系统:Windows 11 IoT Enterprise LTSC(NTLite 精简镜像)
一、Linux 端 SSH 配置
~/.ssh/config:
text
Host win11
HostName 192.168.31.225
User root
Port 22
IdentityFile ~/.ssh/id_ed25519
RequestTTY yes
SetEnv LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8
二、Win11 端默认 Shell 改为 PowerShell
OpenSSH 默认启动 cmd,改为 PowerShell:
cmd
reg add "HKLM\SOFTWARE\OpenSSH" /v DefaultShell /t REG_SZ /d "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" /f net stop sshd net start sshd
注意:修改 DefaultShell 后,SSH 远程命令直接使用 PowerShell 语法(用 ; 连接多个命令),不再支持 cmd 的 && 语法。
三、编码架构(核心设计)
3.1 问题背景
| 设置 | 终端 | 中文 GUI 软件 | 问题 |
|---|---|---|---|
| 系统区域设为英文(ACP=1252/OEMCP=437) | ✅ 正常 | ❌ 乱码 | GUI 软件显示异常 |
| 系统区域设为中文(ACP=936) | ❌ GBK 输出 | ✅ 正常 | SSH 远程查看终端乱码 |
| 全局开启 UTF-8 Beta(65001) | ✅ 可能正常 | ⚠️ 风险 | 老软件兼容性问题 |
3.2 最终方案:两层解耦
| 层 | 设置 | 目的 |
|---|---|---|
| 系统区域 | zh-CN(ACP=936, OEMCP=936) | 中文 GUI、老软件正常显示 |
| SSH 会话 | PowerShell profile 检测到 SSH_CONNECTION 时强制 UTF-8 | Linux 端无乱码 |
| 本地控制台 | 不做干预,跟随系统默认 GBK | 与老软件保持一致 |
3.3 关键文件
C:\Users\root\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
必须使用 UTF-8 with BOM 编码保存:
powershell
Remove-Item Alias:curl -ErrorAction SilentlyContinue
Remove-Item Alias:wget -ErrorAction SilentlyContinue
if ($env:SSH_CONNECTION) {
[Console]::InputEncoding = [System.Text.Encoding]::UTF8
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
}
3.4 前置条件:执行策略
Profile 能正常加载的前提是 PowerShell 执行策略允许运行脚本:
powershell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
注意: 重启后执行策略可能被重置。若 SSH 连接后仍乱码,先检查策略状态:
powershell
Get-ExecutionPolicy # 应为 RemoteSigned
四、验证方法
bash
ssh win11 'chcp' # 输出:Active code page: 65001 ssh win11 'Write-Host 中文测试' # 输出正常即配置生效
在 Win11 本地控制台(cmd)中运行 chcp 显示 936 属于正常行为。
五、回滚操作
powershell
# 删除 profile,SSH 会话恢复 GBK 编码 Remove-Item $PROFILE # 恢复 cmd 为默认 Shell reg add "HKLM\SOFTWARE\OpenSSH" /v DefaultShell /t REG_SZ /d "C:\Windows\System32\cmd.exe" /f
六、总结
| 组件 | 编码 | 说明 |
|---|---|---|
| 系统区域 | GBK(936) | 保证中文 GUI 软件正常显示 |
| SSH 会话 | UTF-8(65001) | 仅在远程连接时切换,不影响本地 |
| 本地控制台 | GBK(936) | 跟随系统默认,避免影响老软件 |
核心思路: 通过 PowerShell Profile 动态检测连接来源,仅在 SSH 会话中切换为 UTF-8,实现系统层与远程会话层的编码解耦。

447

被折叠的 条评论
为什么被折叠?



