在 Windows 7 上配置由 OpenSSH 初始化的默认 shell

在 Windows 7 上配置由 OpenSSH 初始化的默认 shell

有没有办法配置OpenSSH在 Windows 7 中初始化除默认 Windows 命令 shell 之外的其他 shell?

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 并在附加 Net 包中包含 OpenSSH 会产生默认的 Cygwin shell,因此同样的问题仍然存在:有没有办法在安装后配置由 OpenSSH 初始化的 shell?

编辑:

感谢@simlev 建议使用 Cygwin,我已重新措辞我的问题以更清楚地表达我的问题。

答案1

您可以将 Windows 中 OpenSSH 的 DefaultShell 配置为 PowerShell 或任何其他可执行文件。

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH\DefaultShell它需要添加以可执行文件路径作为字符串值的字符串注册表项。

对于 Powershell,

Set-ItemProperty -verbose -path "HKLM:\HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH" -Name "DefaultShell" -Value $(Get-Command powershell.exe).Source

对于 CygWin Bash

Set-ItemProperty -verbose -path "HKLM:\HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH" -Name "DefaultShell" -Value "C:\Cygwin64\bin\bash.exe"

cmd.exe将注册表项设置为空字符串将恢复为用作shell的默认行为。


来自Win32-OpenSSH 维基

在服务器端,在windows注册表中配置默认​​的ssh shell。

  • Computer\HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH\DefaultShell- shell 可执行文件的完整路径
  • Computer\HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH\DefaultShellCommandOption (可选)- 配置的默认 shell 执行命令所需的开关,立即退出并返回到调用进程。默认情况下,这是-c
  • Computer\HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH\DefaultShellEscapeArguments (可选)- 允许您跳过转义默认 shell 参数的标志。默认情况下为0。此选项仅适用于 powershell、powershell、bash、cygwin、cmd 和 ssh-shellhost.exe 以外的 shell。

答案2

我强烈建议使用赛格威在您的 Windows 机器上接受 ssh 连接。这将允许您通过 scp 与其进行通信,以及通过 ssh 从远程系统登录到 Bash shell 和命令行 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

当然,shell 可以自定义:默认情况下包含 ash、bash、dash 和 sh,但只需运行 Cygwin 安装程序,您就可以添加您选择的 zsh、mksh、tcsh 或 posh。然后将以下行添加到/etc/nsswitch.conf

db_shell: /bin/sh

可能/usr/bin/sh用您首选 shell 的路径替换。必须重新启动所有 Cygwin 进程(终端窗口和 sshd 服务)才能使设置生效。

甚至还有一种方法可以在登录时获取 cmd 或 powershell 提示符,这是我最近在堆栈溢出

  1. 下载温普蒂对于 Cygwin 并提取winpty.exewinpty.dllwinpty-agent.exe/bin。如果您从 Cygwin 终端外部执行此操作,请查找binCygwin 安装文件夹的子目录。
  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 服务。

由于标题已被“改写”,我的帖子现在可能看起来有点不合适,请允许我直接回答原来的问题:

“从 Linux 进行 ssh 时使用 git bash 而不是 cmd”

除了使用 Cygwin 在 Windows 机器上接受 ssh 连接之外:

  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 年 9 月:

事情在变化,Win32的OpenSSH现在允许通过在注册表项中设置其路径来选择默认 shell(实际上是任何 shell)。请参阅布雷特洛泽最近回答

答案3

Win32-OpenSSH 在源代码中将 cmd.exe 硬编码为默认 shell:参见以下行978-9841081-1086shell-host.c。话虽如此,看来更改默认 shell 的唯一方法是在这些位置进行更改并重新编译 OpenSSH。

答案4

值得一提的是,我整理了 OpenSSH 的 Cygwin 端口的包装,其中包含一个易于使用的安装程序以及 PDF 和 CHM 格式的详细文档。它在 Github 上:

https://github.com/Bill-Stewart/CygSSH

它使用 Cygwin v3,因此不需要专用的服务帐户(服务以 身份运行SYSTEM)。

我的目的是构建一个方便的 Cygwin 和 rsync 打包包,使其在 Windows 机器上安装和使用起来(相对)方便,因此它具有一些更加以 Windows 为中心的默认设置和功能:

  • 安装程序支持静默安装和添加到系统路径
  • Windows PowerShell 是远程交互式 shell
  • 它创建一个SSH Users用于身份验证的本地组,并默认设置sshd_config;支持嵌套组(例如,如果您想通过 GPO 管理成员资格)
  • 它支持授予账户仅 sftp 访问权限
  • 这包括rsync

它需要 Windows 8.1 64 位或 Windows Server 2012 R2 或更高版本。

相关内容