1

Я использую Bitvise SSH Server на своем компьютере с Windows для удаленного доступа. Оболочкой входа является ZSH, и я использую Oh My Zsh. Однако я также попробовал BASH и получил ту же проблему. Поэтому я предполагаю, что эта проблема связана с Bitvise SSH Server, а не с моими оболочками Cygwin или эмуляторами терминалов на стороне клиента.

Проблема может быть замечена в подсказке моего ZSH. Пока мой SSH-сеанс проходит через этот Bitvise SSH-сервер, в приглашении будут некоторые дополнительные пробелы. Пожалуйста, смотрите скриншоты:

Различия между сеансом, который проходит через Bitvise, и сеансом, который не

Это окна 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 .

Различные настройки TERM


Обновлено 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, та же проблема сохраняется.

2 ответа2

1

Одна из возможностей заключается в том, что Oh My Zsh отображает символы Юникода, и проблема в том, что эти символы имеют разную ширину в консоли Windows.

Например, символ с шириной 0 в MinTTY может иметь ширину 1 в консоли Windows и будет перемещать курсор. Или символ шириной 1 в MinTTY может иметь ширину 2 в консоли Windows.

На скриншотах, которые вы предоставили, вы смотрите на zsh с надписью "Oh My Zsh" в MinTTY.

Но как насчет консоли Windows? Как там выглядит Oh My Zsh?

Bitvise SSH Server запускает вашу терминальную оболочку в скрытой консоли Windows, что необходимо для запуска консольных программ Windows. Из-за этой архитектуры zsh должен выглядеть прямо в консоли Windows для правильной визуализации через Bitvise SSH Server.

1

Четыре недели спустя я наконец-то понял проблему сам. Спасибо Денису Бидеру, который, кажется, пришел из службы поддержки Bitvise SSH Server. Его объяснение того, как Bitvise запускает оболочки в консоли Windows, является ключом к решению этой проблемы.

Оказалось, что переменная окружения $TREM и файлы terminfo имеют значения.

Проблема, с которой я столкнулся на самом деле, заключалась в том, что темы Oh My Zsh, которые я использую, имеют символы, которые отображаются другими способами в моей консоли Windows. Однако я обнаружил, что это на самом деле потому, что моя кодовая страница консоли Windows установлена на 936 (упрощенный китайский) из-за моих локальных настроек Windows (для символов, отличных от Юникода). Я обнаружил, что если я вручную изменю свою кодовую страницу на 437 (английский язык США) в сеансе Bitvise SSH, вывод станет правильным.

Тогда я понял, что для пользователей из США у них вообще нет этой проблемы!

Поэтому решение состоит в том, чтобы установить кодовую страницу по умолчанию консоли Windows Bitvise SSH на 437. Это можно сделать в реестре, более конкретно, в ключе HKCU\Console\Bitvise toterms.exe , для CodePage должно быть установлено значение 437 (десятичное). Я также удалил FaceName потому что он вообще не нужен.

Однако одной только этой настройки недостаточно, поскольку я обнаружил, что каждый раз при запуске сеанса Bitvise SSH значение возвращается на 936. Поэтому мне нужно изменить разрешения для HKCU\Console\Bitvise toterms.exe чтобы запретить доступ для записи всем пользователям. Шаги: 1. Щелкните правой кнопкой мыши на «Bitvise toterms.exe» и выберите «Разрешения ...». В диалоговом окне нажмите "Дополнительно". В новом диалоговом окне нажмите «Добавить ...», затем введите "Все". Наконец, проверьте следующие разрешения на отказ, как показано:

Таким образом, сам Bitvise SSH Server больше не сможет изменять эти значения, и тогда я получил правильный вывод из моих сессий Bitvise SSH.

Наконец, Oh My Zsh выглядит одинаково независимо от того, проходит он через Bitvise SSH Server или нет.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .