在 Windows OpenSSH Server 中向 DefaultShell 添加参数(例如 powershell.exe -NoLogo)

在 Windows OpenSSH Server 中向 DefaultShell 添加参数(例如 powershell.exe -NoLogo)

我已安装 Windows OpenSSH 服务器并正常运行。我可以将 ssh 的默认 shell 更改为使用HKLM:\SOFTWARE\OpenSSH并添加DefaultShell属性,如所述这里

因此让我们采用默认示例,因为它几乎在每个具有“正常”C:\Windows路径的 Windows 安装上都可以按原样工作:

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

现在假设我想添加一个参数,可能是“-NoLogo”。这只是举个例子。最终,我希望能够使用选项启动 WSL 发行版。但现在,让我们简单一点:

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoLogo" -PropertyType String -Force

这不仅不起作用,还会以奇怪的方式破坏登录。使用第一种方法(无参数),我的 ssh-agent 中的公钥被提供并被接受。当我添加时-NoLogo,我最终会收到密码提示,使用我的 Windows 密码会失败。

正在播放的sshd.exe -ddd节目:

User not allowed because shell c:\\windows\\system32\\windowspowershell\\v1.0\\powershell.exe -nologo does not exist

好的,但这行不通,因为 OpenSSH 会检查以确保确切的DefaultShell字符串是可执行文件。

还有另外两个注册表设置,但似乎都不是我正在寻找的。从名称上看,有人可能会认为这DefaultShellCommandOption在这里会有些用处,但它只是 shell 需要的选项,当命令传入,如:

ssh hostname ls

由于这里尝试的答案之一认为DefaultShellCommandOption可以解决问题,所以我尝试了它,并确认它仅在传入命令时使用。我还可以在 OpenSSH 源中看到 shell_option 仅在有命令时使用,否则它只会自行执行 shell:

if (command) {
    size_t len = strlen(shell) + 1 + strlen(shell_option) + 1 + strlen(command) + 1;
    pty_cmd = calloc(1, len);

    strcpy_s(pty_cmd, len, shell);
    strcat_s(pty_cmd, len, " ");
    strcat_s(pty_cmd, len, shell_option);
    strcat_s(pty_cmd, len, " ");
    strcat_s(pty_cmd, len, command);
} else {
    pty_cmd = shell;
}

有人知道如何DefaultShell在 Windows OpenSSH 中添加参数/参数吗?

答案1

潜在的解决方法

当我注意到 OpenSSH 正在检查以确保DefaultShell存在并且可以执行时,我决​​定尝试创建一个包装 PowerShell 选项的批处理文件。

我创建了一个目录和文件C:\ProgramData\OpenSSH\ssh-shell.bat

@echo off
C:\Windows\System32\WindowsPowerShell/v1.0/powershell.exe -NoLogo %*

并改变我的DefaultShell运行该包装器(从提升的PowerShell):

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\ProgramData\OpenSSH\ssh-shell.bat" -PropertyType String -Force

这似乎可以按预期工作,既可以访问 shell 本身,也可以使用命令运行(例如ssh hostname ls)。

也可以通过这种方式直接启动到指定的 WSL 发行版:

@echo off
C:\Windows\System32\wsl.exe ~ -d Alpine %*

请注意,这确实要求DefaultShellCommandOption也进行更改:

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShellCommandOption -Value "-e /bin/sh -c" -PropertyType String -Force

安全隐患

感觉就像它与默认的 OpenSSH 行为一样安全DefaultShell,因为它使用实际的 shell(加上我想要的附加参数)、DefaultShellCommandOption-c默认情况下)和传入的命令来构建命令行。

但我愿意接受有关如何使其更加健壮或安全的建议,或者是否存在任何可能的安全问题。

相关内容