我在 Windows 机器上使用 Bitvise SSH Server 进行远程访问。登录 shell 是 ZSH,我使用 Oh My Zsh 进行登录。但是,我也尝试过 BASH,但遇到了同样的问题。因此,我猜这个问题出在 Bitvise SSH Server 上,而不是我的 Cygwin shell 或客户端终端仿真器上。
这个问题在我的 ZSH 提示符上就可以看出来。只要我的 SSH 会话经过这个 Bitvise SSH 服务器,提示符中就会出现一些多余的空格。请看截图:
这个窗口是 Windows 机器上的 MinTTY。当我打开它时,你可以看到后面只有一个尾随空格~
(在我输入 之前ssh 127.0.0.1
)。但是,一旦我通过 SSH 进入同一台机器,~
提示符后面就会有两个尾随空格。此外,如果我tiger
在 Bitvise SSH 会话中执行另一个 SSH 会话(到机器),第二个会话的提示符也会有多余的空格(红色下划线提示)。但是,如果我退出 Bitvise 会话并tiger
直接通过 SSH 进入 ,提示符是正常的(绿色下划线提示)。
gnome-terminal
当我从某台远程机器(使用或xfce4-terminal
作为终端仿真器)连接到该 Windows 机器时,我观察到了同样的事情。
因此,我的结论是,这不能怪终端仿真器。也不能怪 Cygwin 及其 ZSH,因为只要我不通过 Bitvise,一切看起来都很好。
我猜想 Oh My Zsh 主题中定义的某些特殊字符在通过 Bitvise 时无法正确处理。但是我无法找出具体是什么。Oh My Zsh 主题在没有 Bitvise SSH 连接的情况下在本地看起来不错,在我拥有的所有 Linux 机器上看起来也不错。因此我认为应该是 Bitvise 出了问题。
正如评论中所建议的,我set
在两种环境中运行,并将输出转储到两个文本文件中:bitvise.txt和本地.txt。现在最大的问题是我无法比较它们,diff
因为diff
它们声称它们是二进制文件(并且它们不同)。我不确定这是否与奇怪的空格有关。
强迫LANG
并diff
没有帮助。
$ diff -uN bitvise.txt local.txt
Binary files bitvise.txt and local.txt differ
$ LANG=en_US.UTF-8 diff -uN bitvise.txt local.txt
Binary files bitvise.txt and local.txt differ
$ LANG=C diff -uN bitvise.txt local.txt
Binary files bitvise.txt and local.txt differ
两个文件上传到这里:https://drive.google.com/open?id=0B6Pxoys5MF0Bc1d6QUMweUkybHc
测试了一些不同的TERM
设置...似乎没有什么效果。设置TERM=linux
结果与相同xterm
。
2016 年 5 月 23 日更新
这个问题似乎比我想象的要难。我找到了一个文件夹“C:\Program Files\Bitvise SSH Server\TermInfo”,其中包含终端信息文件。我用从普通 Ubuntu 机器复制的类似文件替换了该文件夹中的文件,但没有帮助。我还尝试了随 Cygwin 安装的“cygwin”术语信息,但没有成功……实际上,Cygwin 附带的“cygwin”文件与 Ubuntu 附带的文件相同……
我现在没主意了。
当我通过 SSH 进入 Bitvise SSH 服务器时,我可以exec /bin/bash
用 Bash 替换当前会话。但是,在那个 Bash 中,如果我通过 SSH 进入其他使用 Zsh 和 Oh My Zsh 的 Linux 机器,同样的问题仍然存在。
答案1
一种可能性是 Oh My Zsh 呈现 Unicode 字符,而问题是这些字符在 Windows 控制台中的宽度不同。
例如,在 MinTTY 中宽度为 0 的字符在 Windows 控制台中可能宽度为 1,并会使光标前进。或者,在 MinTTY 中宽度为 1 的字符在 Windows 控制台中可能宽度为 2。
在您提供的屏幕截图中,您正在 MinTTY 下使用“Oh My Zsh”查看 zsh。
但在 Windows 控制台中情况如何?Oh My Zsh 在那里看起来怎么样?
Bitvise SSH Server 在隐藏的 Windows 控制台中运行终端 shell,这对于运行 Windows 控制台程序必不可少。由于这种架构,zsh 必须在 Windows 控制台中正确显示,才能通过 Bitvise SSH Server 正确呈现。
答案2
四周后,我终于自己解决了这个问题。感谢丹尼斯·比德他似乎来自 Bitvise SSH Server 的支持团队。他对 Bitvise 如何在 Windows 控制台中运行 shell 的解释是解决此问题的关键。
事实证明$TREM
环境变量和terminfo
文件无关。
我实际遇到的问题是,我使用的 Oh My Zsh 主题中的字符在我的 Windows 控制台中以其他方式显示。但是,我发现这实际上是因为我的 Windows 控制台代码页设置为 936(简体中文),因为我的 Windows 本地设置(针对非 Unicode 字符)。我发现,如果我在 Bitvise SSH 会话中手动将代码页更改为 437(美国英语),输出就会正确。
然后我意识到对于美国用户来说,他们根本没有这个问题!
因此,解决方案是将 Bitvise SSH Windows 控制台的默认代码页设置为 437。这可以在注册表中完成,更具体地说,在键中HKCU\Console\Bitvise toterms.exe
,有一个CodePage
设置为 437(十进制)。我也删除了,FaceName
因为它听起来根本没有必要。
但是,仅设置这个是不够的,因为我发现每次启动 Bitvise SSH 会话时,该值都会被设置回 936。因此,我需要更改的权限以HKCU\Console\Bitvise toterms.exe
拒绝所有人的写入访问。步骤:1. 右键单击“Bitvise toterms.exe”,然后单击“权限...”。在对话框中,单击高级。在新对话框中,单击“添加...”,然后输入“Everyone”。最后,检查以下拒绝的权限,如下所示:
这样,Bitvise SSH 服务器本身将不再能够更改这些值,然后我从 Bitvise SSH 会话中获得正确的输出。
最后,无论是否通过 Bitvise SSH 服务器,Oh My Zsh 看起来都一样。