4

Есть ли способ настроить OpenSSH в Windows 7 для инициализации другой оболочки, отличной от командной оболочки Windows по умолчанию?

me@linuxhost:~
$ ssh me@windowshost
me@windowshost's password:
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

me@windowshost C:\Users\me> exit
Connection to windowshost closed.
me@linuxhost:~
$

С другой стороны, установка Cygwin и включение OpenSSH в дополнительные пакеты Net приводит к оболочке Cygwin по умолчанию, поэтому остается тот же вопрос: есть ли способ настроить оболочку, инициализированную OpenSSH после установки?

РЕДАКТИРОВАТЬ:

Спасибо @simlev за ваше предложение использовать Cygwin. Я перефразировал мой вопрос, чтобы более четко представить мою проблему.

3 ответа3

4

Я настоятельно рекомендую использовать Cygwin для приема SSH-соединений на вашем компьютере с Windows. Это позволит вам выполнять поиск по нему и входить в него, а также входить из удаленной системы через ssh в оболочку Bash и командную строку git.

user@linuxhost$ ssh 192.168.x.x
Last login: Sun Feb 12 08:20:07 2017 from 10.x.x.x
user@windowshost$ echo $0 && git --version
-bash
git version 2.8.3

Оболочку, конечно, можно настроить по умолчанию: ash, bash, dash и sh включены по умолчанию, но просто запустите установщик Cygwin, и вы можете добавить свой выбор zsh, mksh, tcsh или posh. Затем добавьте следующую строку в /etc/nsswitch.conf:

db_shell: /bin/sh

возможно, заменив /usr/bin/sh на путь к вашей предпочитаемой оболочке. Все процессы Cygwin (окна терминала и служба sshd) должны быть перезапущены, чтобы настройки вступили в силу.

Есть даже способ получить приглашение cmd или powershell при входе в систему, о котором я недавно узнал в Stackoverflow.

  1. Загрузите winpty для Cygwin и извлеките winpty.exe , winpty.dll и winpty-agent.exe в /bin . Если вы делаете это снаружи терминала Cygwin, найдите подкаталог bin в папке установки Cygwin.
  2. Создайте два пакетных файла в /bin и убедитесь, что у них есть разрешения на выполнение. Давайте назовем их winpty-cmd.bat и winpty-powershell.bat и наполним их следующим содержимым, где, конечно, <cygwin path> является заполнителем для пути, к которому вы установили Cygwin (по умолчанию это C:\cygwin):

    @ECHO OFF
    <cygwin path>\bin\winpty.exe cmd
    

    а также

    @ECHO OFF
    <cygwin path>\bin\winpty.exe powershell
    
  3. Поместите одну из этих строк в /etc/nsswitch.conf:

    db_shell: /bin/winpty-cmd.bat
    

    или же

    db_shell: /bin/winpty-powershell.bat
    
  4. Перезапустите службу sshd.

Поскольку название было "перефразировано", и мое сообщение теперь может показаться неуместным, позвольте мне прямо ответить на исходный вопрос:

"Используйте git bash вместо cmd при загрузке из Linux"

В дополнение к использованию Cygwin для приема соединений ssh на компьютере с Windows:

  1. Выполните шаг 1. выше.
  2. Создайте файл с именем <cygwin path>\bin\winpty-gitbash.bat с этим содержимым, где <cygwin path> является заполнителем для пути, к которому вы установили git-for-windows (по умолчанию это C:\Program Files\Git):

    @ECHO OFF
    SET PATH="/bin"
    <cygwin path>\bin\winpty.exe "<git path>\bin\bash.exe"
    
  3. Поместите эту строку в /etc/nsswitch.conf:

    db_shell: /bin/winpty-gitbash.bat
    
  4. Перезапустите службу sshd.

Обновление - сентябрь 2018 года:

Все меняется, и Win32-OpenSSH теперь позволяет выбирать оболочку по умолчанию (фактически любую оболочку), устанавливая ее путь в разделе реестра. Смотрите недавний ответ Бретлосзе.

2

Win32-OpenSSH жестко кодирует cmd.exe в качестве оболочки по умолчанию в источнике: см. Строки 978-984 и 1081-1086 в shell-host.c. С учетом вышесказанного представляется, что единственный способ изменить оболочку по умолчанию - изменить ее в этих местах и перекомпилировать OpenSSH.

1

В соответствии с этим вы можете настроить DefaultShell для OpenSSH в Windows, чтобы он был PowerShell или любым другим исполняемым файлом.

Требуется добавить строковый ключ реестра Computer\HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH\DefaultShell с путем к исполняемому файлу оболочки в качестве строкового значения, то есть:

  • Powershell: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

  • CygWin Bash: C:\Cygwin64\bin\bash.exe

Я проверил это и работает как ожидалось.


Из вики Win32-OpenSSH:

На стороне сервера настройте стандартную оболочку ssh в реестре Windows.

  • Computer\HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH\DefaultShell - полный путь к исполняемому файлу оболочки
  • Computer\HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH\DefaultShellCommandOption (необязательно) - включите, если для настроенной оболочки по умолчанию требуется выполнить команду, немедленно выйти и вернуться к вызывающему процессу. По умолчанию это -c .
  • Computer\HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH\DefaultShellEscapeArguments (необязательно) - флаг, позволяющий пропустить экранирование аргументов оболочки по умолчанию. По умолчанию это 0 . Этот параметр применим только к оболочкам, отличным от powershell, powershell, bash, cygwin, cmd и ssh-shellhost.exe.

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