Я использую Bitvise SSH Server на своем компьютере с Windows для удаленного доступа. Оболочкой входа является ZSH, и я использую Oh My Zsh. Однако я также попробовал BASH и получил ту же проблему. Поэтому я предполагаю, что эта проблема связана с Bitvise SSH Server, а не с моими оболочками Cygwin или эмуляторами терминалов на стороне клиента.
Проблема может быть замечена в подсказке моего ZSH. Пока мой SSH-сеанс проходит через этот Bitvise SSH-сервер, в приглашении будут некоторые дополнительные пробелы. Пожалуйста, смотрите скриншоты:
Это окна MinTTY на этой машине Windows. Когда я открываю его, вы видите, что после ~
остается только один пробел (до того, как я ssh 127.0.0.1
). Однако, после того, как я отправил SSH в ту же машину, после ~
в приглашении появляются два пробела. Кроме того, если я выполняю еще один сеанс SSH (на машине tiger
) в рамках сеанса Bitvise SSH, в приглашении второго также появляются дополнительные пробелы (подсказки, подчеркнутые красным). Однако если я выйду из сеанса Bitvise и SSH напрямую к tiger
, приглашение будет нормальным (подсказки, подчеркнутые зеленым).
Я наблюдал то же самое при подключении с какой-либо удаленной машины (используя gnome-terminal
или xfce4-terminal
в качестве эмулятора терминала) к этой машине с Windows.
Поэтому, мой вывод, эмулятор терминала не виноват в этом. Cygwin и его ZSH тоже не виноваты, потому что все выглядит хорошо, пока я не прохожу через Bitvise.
Я предполагаю, что в теме Oh My Zsh определен какой-то специальный символ, который неправильно обрабатывается при прохождении через Bitvise. Однако я не мог узнать, что это такое. Темы Oh My Zsh хорошо выглядят локально без SSH-соединения Bitvise и хорошо смотрятся на всех машинах с Linux, которые у меня есть. Поэтому я думаю, что это должно быть что-то с Bitvise.
Как предложено в комментариях, я запустил set
в обеих средах и получил выходные данные в виде двух текстовых файлов: bitvise.txt и local.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
.
Обновлено 23.05.16
Проблема, кажется, сложнее, чем я ожидал. Я нашел папку «C:\Program Files\Bitvise SSH Server\TermInfo», в которой находятся файлы информации о терминале. Я заменил файлы в этой папке аналогичными файлами, которые я скопировал с обычного компьютера с Ubuntu, но это не помогло. Я также попробовал информацию о термине "cygwin", которая установлена вместе с Cygwin, не повезло ... На самом деле, файл "cygwin", который поставляется с Cygwin, такой же, как и файл, который поставляется с Ubuntu ...
Теперь у меня заканчиваются идеи.
Когда я SSH подключаюсь к Bitvise SSH Server, я могу выполнить exec /bin/bash
чтобы заменить текущий сеанс на Bash. Однако в этом Bash, если я SSH подключусь к какой-нибудь другой машине Linux, которая использует Zsh и Oh My Zsh, та же проблема сохраняется.