Windows 电脑可以作为远程开发节点或家用服务器。本文介绍公钥登录、PowerShell 7、Windows Terminal 和笔记本电源管理,并说明管理员账户与 Modern Standby 的注意事项。

1. 配置 OpenSSH 公钥登录

Windows OpenSSH 会根据账户是否属于本机 Administrators 组来选择公钥文件:普通账户使用 ~/.ssh/authorized_keys;管理员账户默认使用 C:\ProgramData\ssh\administrators_authorized_keys。配置前先确认账户类型。详见 Microsoft 的 OpenSSH 服务器配置说明。

1.1 设置管理员账户的公钥文件

以管理员身份打开 PowerShell,将公钥添加到管理员共用的公钥文件:

$keys = "$env:ProgramData\ssh\administrators_authorized_keys"
notepad $keys

每个公钥单独占一行。该文件的 ACL 应只允许 SYSTEM 和 Administrators 组访问:

icacls $keys /inheritance:r
icacls $keys /grant "Administrators:F" "SYSTEM:F"

Windows OpenSSH 服务会使用这个权限受限的文件。不要把当前登录账户的个人权限添加到管理员共用的公钥文件中。

1.2 设置普通账户的公钥文件

普通账户应把公钥放在自己的 .ssh 目录中。以下命令会创建目录和文件,并移除继承的权限:

$sshDir = Join-Path $HOME ".ssh"
$keys = Join-Path $sshDir "authorized_keys"
New-Item -ItemType Directory -Path $sshDir -Force | Out-Null
New-Item -ItemType File -Path $keys -Force | Out-Null
notepad $keys

icacls $keys /inheritance:r
icacls $keys /grant:r "$($env:USERNAME):(F)" "SYSTEM:(F)"

将公钥作为单独一行粘贴并保存。要确认或修改公钥文件路径,请检查 %ProgramData%\ssh\sshd_config 中的 Match Group administrators 区块。修改配置后,以管理员身份重启服务:

Restart-Service sshd

1.3 避免 UTF-8 BOM 导致解析问题

Windows PowerShell 5.1 使用 -Encoding UTF8 时会写入带 BOM 的 UTF-8;PowerShell 7 默认使用不带 BOM 的 UTF-8。为确保 authorized_keys 是兼容的纯文本,PowerShell 7 可指定 utf8NoBOM;Windows PowerShell 5.1 可通过 .NET 写入不带 BOM 的 UTF-8。参见 PowerShell 字符编码说明。

PowerShell 7:

# $keys 指向第 1.1 或 1.2 节选定的 authorized_keys 文件。
(Get-Content "$HOME\.ssh\id_ed25519.pub" -Raw).Trim() |
    Set-Content $keys -Encoding utf8NoBOM

Windows PowerShell 5.1:

# $keys 指向第 1.1 或 1.2 节选定的 authorized_keys 文件。
$publicKey = (Get-Content "$HOME\.ssh\id_ed25519.pub" -Raw).Trim()
[System.IO.File]::WriteAllText(
    $keys,
    $publicKey + [Environment]::NewLine,
    [System.Text.UTF8Encoding]::new($false)
)

2. 将 PowerShell 7 设为 OpenSSH 默认 Shell

Windows Terminal 的默认设置只影响本机打开的终端。若要让 SSH 会话进入 PowerShell 7,需要在注册表中设置 OpenSSH 的 DefaultShell。以管理员身份打开 PowerShell,先查找 pwsh.exe,再写入注册表:

$pwshPath = (Get-Command pwsh.exe -ErrorAction SilentlyContinue).Source
if (-not $pwshPath) {
    $pwshPath = "C:\Program Files\PowerShell\7\pwsh.exe"
}

New-Item -Path "HKLM:\SOFTWARE\OpenSSH" -Force | Out-Null
New-ItemProperty `
    -Path "HKLM:\SOFTWARE\OpenSSH" `
    -Name DefaultShell `
    -Value $pwshPath `
    -PropertyType String `
    -Force

断开并重新连接后,SSH 会话会使用新的 Shell。如果 pwsh.exe 安装在其他位置,请将 $pwshPath 改为实际路径。

3. 配置 Windows Terminal

Windows Terminal 配置文件可以指定默认 Shell,以及是否以管理员身份运行。先在 Terminal 设置中创建或确认 PowerShell 7 配置文件,再将它的 GUID 设为 defaultProfile。例如:

{
  "defaultProfile": "{YOUR-POWERSHELL-7-PROFILE-GUID}",
  "profiles": {
    "list": [
      {
        "guid": "{YOUR-POWERSHELL-7-PROFILE-GUID}",
        "name": "PowerShell 7",
        "commandline": "pwsh.exe",
        "elevate": false
      }
    ]
  }
}

保留配置文件中的其他字段和配置项,不要用这个简化示例覆盖整个 settings.json。将 elevate 设为 true 会让该配置文件默认以管理员身份运行;日常开发通常应设为 false。参见 Windows Terminal 配置文件设置。

4. 在 PowerShell 中使用 Git for Windows 附带的 Vim

如果已安装 Git for Windows,可以直接调用它附带的 Vim,无需将整个 Git\usr\bin 添加到全局 PATH。先确认 Vim 的实际安装路径,再把函数加入 PowerShell 个人配置文件:

$vimPath = "C:\Program Files\Git\usr\bin\vim.exe"
if (-not (Test-Path $vimPath)) {
    throw "Vim not found at $vimPath; update the path for this Git installation."
}

if (-not (Test-Path $PROFILE)) {
    New-Item -ItemType File -Path $PROFILE -Force | Out-Null
}

@"
function vim { & `"$vimPath`" `$args }
function vi  { & `"$vimPath`" `$args }
"@ | Add-Content -Path $PROFILE

重新打开 PowerShell,或运行 . $PROFILE 加载配置。如果已有同名函数,请先删除旧定义,避免重复添加。

如果不再需要单独安装的 Vim,可先确认软件包 ID,再卸载:

winget list --id vim.vim
winget uninstall --id vim.vim

不要为了移除 Vim 而删除用途不明的目录。

5. 将笔记本配置为远程节点

先运行 powercfg /a 查看电脑支持哪些睡眠状态。如果希望笔记本合盖后继续提供服务,先确认散热、电源和网络设备适合长时间运行。关闭睡眠会增加耗电和温度,也不能保证每台笔记本合盖后都能保持网络连接。

5.1 设置合盖动作和屏幕超时

以下设置会让电脑在交流电供电时合盖不执行操作、5 分钟后关闭屏幕,并禁用交流电供电时的空闲睡眠:

powercfg /setacvalueindex SCHEME_CURRENT SUB_BUTTONS LIDACTION 0
powercfg /change monitor-timeout-ac 5
powercfg /change standby-timeout-ac 0
powercfg /setactive SCHEME_CURRENT

如果还希望电池供电时合盖不进入睡眠,可额外设置:

powercfg /setdcvalueindex SCHEME_CURRENT SUB_BUTTONS LIDACTION 0
powercfg /setactive SCHEME_CURRENT

不同电源计划和设备固件提供的选项可能不同。设置后用 powercfg /query 检查实际值,并在目标电源状态下验证 SSH 连接。

5.2 了解 Modern Standby 的网络行为

Modern Standby 期间的网络连接由 Windows 与设备固件共同管理;当前 Windows 版本会根据电源状态调整连接,并不保证睡眠期间 SSH 或其他服务持续可用。较旧的 CONNECTIVITYINSTANDBY 电源设置不适用于 Windows 10 版本 2004 及之后的 Modern Standby 平台,不要把它当作通用的常驻网络开关。参见 Modern Standby 网络连接说明。

可以用以下命令确认睡眠状态,并检查系统电源报告中的待机连接信息:

powercfg /a
powercfg /spr

网卡能否在待机期间保持连接,也取决于硬件能力和驱动程序。请参阅 Modern Standby 验证概览,并在实际设备上测试。如果服务必须一直可用,应避免让系统进入睡眠,或改用专为常驻服务设计的设备。

总结

这些设置涵盖了 Windows 远程节点的几个常见环节:

  1. 根据账户类型使用正确的 OpenSSH 公钥文件和 ACL。
  2. 区分 SSH Shell 与本机 Windows Terminal 的设置。
  3. 通过 PowerShell 个人配置文件调用 Git for Windows 附带的 Vim。
  4. 先检查设备的睡眠能力,再调整电源计划,并在实际设备上验证待机网络。

参考资料