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 远程节点的几个常见环节:
- 根据账户类型使用正确的 OpenSSH 公钥文件和 ACL。
- 区分 SSH Shell 与本机 Windows Terminal 的设置。
- 通过 PowerShell 个人配置文件调用 Git for Windows 附带的 Vim。
- 先检查设备的睡眠能力,再调整电源计划,并在实际设备上验证待机网络。
参考资料
- Windows OpenSSH 服务器配置:
sshd_config、管理员公钥文件位置和 ACL。 - Windows OpenSSH 的密钥式身份验证:公钥文件和密钥管理。
- PowerShell 字符编码:Windows PowerShell 5.1 与 PowerShell 7 的 UTF-8/BOM 行为。
- Windows Terminal 配置文件设置:
commandline和elevate等设置。 - PowerShell 配置文件:
$PROFILE的位置和用途。 - Powercfg 命令行选项:电源计划和命令行参数。
- Modern Standby 网络连接:Windows 管理待机期间网络连接的方式。
- 允许 Modern Standby 期间的网络连接:
CONNECTIVITYINSTANDBY设置的值和适用范围。 - Modern Standby 验证概览:使用
powercfg /a检查设备的睡眠与网络能力。 - WinGet
list和 WinGetuninstall:检查并移除已安装的软件包。