Windows Server 2022 把 OpenSSH Server 作为可选功能提供:不需要第三方安装程序,通过 Windows Update 更新。启用后,你可以通过 SSH 运行 PowerShell、用 scp 复制文件,并像对待任何 Linux 机器一样把脚本或 CI 指向这台服务器。
以下所有操作都是在我们的 Windows Server 2022 镜像上,通过 RDP 打开的管理员 PowerShell 中完成的(如何连接)。
先说网络。 在 NAT 的 Windows 套餐上,唯一的入站转发指向 RDP,所以无法从互联网访问 SSH。要从外部使用 SSH,需要带独立 IPv4 的套餐,例如 Windows Small-IP。端口可达时,下面的步骤大约需要五分钟。
1. 安装 OpenSSH Server
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
客户端已经装好;服务器端在你添加之前显示为 NotPresent。在我们的服务器上,安装用了 28 秒。
2. 启动服务并设为开机自启
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
Get-NetFirewallRule -Name *OpenSSH*
安装该功能时会创建防火墙规则 OpenSSH-Server-In-TCP(22 端口,入站,允许),所以不需要自己添加。
3. 把 PowerShell 设为默认 Shell
默认情况下,SSH 会话进入的是 cmd.exe。切换到 PowerShell:
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
新连接会立即得到 PowerShell 5.1,无需重启。
4. 为 Administrator 添加密钥:人人都会踩的文件
这是 Windows 的第一个陷阱。对于 Administrators 组的账户,sshd 不会读取 C:\Users\<name>\.ssh\authorized_keys。它读取一个共享文件 C:\ProgramData\ssh\administrators_authorized_keys,而且只有在除了 Administrators 和 SYSTEM 之外没人能写入时才会读取:
$pub = 'ssh-ed25519 AAAA...your-public-key... you@laptop'
Set-Content -Path C:\ProgramData\ssh\administrators_authorized_keys -Value $pub -Encoding ascii
icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
-Encoding ascii 也很重要。在我们的测试中,同一个密钥用 Out-File(UTF-16,PowerShell 5.1 的默认编码)保存后,会被 Permission denied (publickey) 拒绝。在你自己的电脑上:
ssh Administrator@YOUR.SERVER.IP
应该无需密码就得到 PowerShell 提示符。对于非管理员用户,常规的 C:\Users\<name>\.ssh\authorized_keys 可以正常使用。
5. 关闭密码登录:第二个陷阱
最直观的修改 PasswordAuthentication no 在这个版本里并不够。OpenSSH 8.1 仍会提供 keyboard-interactive,它询问的是同一个 Windows 密码。在我们的测试中,直到把它也关掉之前,不带密钥的登录仍会显示 keyboard-interactive。此外,这些设置必须放在文件末尾 Match Group administrators 块的前面,否则只对管理员生效。下面的命令把两行都放到文件开头:
$cfg = 'C:\ProgramData\ssh\sshd_config'
$lines = Get-Content $cfg | Where-Object { $_ -notmatch '^#?\s*(PasswordAuthentication|KbdInteractiveAuthentication|ChallengeResponseAuthentication)\s' }
Set-Content $cfg -Value (@('PasswordAuthentication no', 'ChallengeResponseAuthentication no') + $lines) -Encoding ascii
Restart-Service sshd
保持当前 SSH 会话不关闭,从第二个终端测试。仅用密码尝试,现在应该得到:
Permission denied (publickey).
在我们的测试中,Administrator 和普通用户都是这个结果,而密钥登录依然可用。
能用它做什么
- 在任何地方运行命令:
ssh Administrator@IP 'Get-Service sshd'。 - 复制文件:
scp .\app.zip Administrator@IP:C:/apps/。 - 用与 RDP 相同的方法,把端口限制为你的地址:
Set-NetFirewallRule -Name OpenSSH-Server-In-TCP -RemoteAddress 203.0.113.10。
选哪个套餐
从外部使用 SSH 需要公网 IPv4:Windows Small-IP(4 vCPU、4 GB、50 GB)为 $28/月,Windows Medium-IP(6 vCPU、6 GB)为 $36/月。Windows 是使用你自有许可证的 Server 2022(BYOL 说明)。四个套餐都在 Windows VPS 页面。想让程序在断开连接后继续运行,请看 在 Windows Server 上 24/7 运行脚本。
评论
暂无评论。来做第一个吧。