Windows 启用 OpenSSH Server 及无密码登录操作笔记
February 8, 2023 默认分类
背景:Windows
服务器,需要用 SFTP
将代码向其同步,即需对其进行 SSH
服务器的安装,并使密钥文件访问打通。
一、快速配置 OpenSSH Server 的代码
环境简述: 控制端A:可以是 Windows
或 Linux
受控端B:Windows server core 2022
,准备安装 OpenSSH Server
1. 受控端B 安装 OpenSSH Server
在受控端上 按 Win + X A
打开管理员权限的 Powershell
窗口,执行:
# 检查SSH安装情况
Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
# 期望输出如下
# Name : OpenSSH.Client~~~~0.0.1.0
# State : NotPresent
# Name : OpenSSH.Server~~~~0.0.1.0
# State : NotPresent
# 安装 OpenSSH Client
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
# 安装 OpenSSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
# 两条命例期望输出如下
# Path :
# Online : True
# RestartNeeded : False
# 打开 OpenSSH Server 配置文件
notepad "C:\ProgramData\ssh\sshd_config"
# 找到文件最后这2行,把它们注释掉,像这样:
# Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
2. 本机生成密钥并将公钥送与受控端SSHD认证
在本机用户文件夹,执行:
# 如果你还没有密钥或不知道密钥是啥的话,就先生成一对密钥好了
ssh-keygen
然后把公钥扔到受控端上,也就是 控制端: ~/.ssh/id_rsa.pub
变成 受控端: ~/.ssh/authorized_keys
即可。这里因为指令集不一样所以 ssh-copy-id
无效,就只好手动复制一下了。即执行指令:
scp .ssh\id_rsa.pub [email protected]:.ssh\authorized_keys2
至此完成了配置,再尝试进行 ssh
连接就可以无密码连上去了。
3. Windows OpenSSH Server 下的 SFTP 配置,以 vscode 工程为例
在本机依然可以用 ~ 作为相对用户目录。
.vscode/sftp.config
{
"name": "[email protected]",
"host": "host",
"protocol": "sftp",
"port": 22,
"username": "user",
"privateKeyPath": "~/.ssh/id_rsa",
"remotePath": "C:/Path/To/Your/Project",
"uploadOnSave": true
}
二、为什么?
OpenSSH Server 默认路径问题
Linux 下的 sshd 通常会采用 ~/.ssh/authorized_keys 来认证传入 sshd 的连接。
而 Windows 下似乎 OpenSSH Server 并不运行在普通用户权限下,于是 AuthorizedKeysFile 也就自然而然的没有放到用户的文件夹里。
找到 OpenSSH Server 的配置文件文件,便得知了这一点。C:\ProgramData\ssh\sshd_config
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# ………省略N多行
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
另一条出路
或者如果你想按它的默认路径放置的话(即 __PROGRAMDATA__/ssh/administrators_authorized_keys
), 那么还需要修正一下你放上去的 administrators_authorized_keys
的权限。这个方案的权限的问题雪得猜测是来源于 ProgramData
是个系统管理的文件夹,普通进程需要申请权限才能读写,
即修复方法如下:在受控端上 按 Win + X A
打开管理员权限的 Powershell窗口,执行:
# 执行以下代码修正 icacls administrators_authorized_keys 的文件权限,并重启 sshd
cd C:\ProgramData\ssh
icacls administrators_authorized_keys /inheritance:r
icacls administrators_authorized_keys /grant SYSTEM:`(F`)
icacls administrators_authorized_keys /grant BUILTIN\Administrators:`(F`)
net stop sshd
net start sshd
三、参考文献
Get started with OpenSSH for Windows
ssh - Public Key Authentication Windows Port of OpenSSH - Server Fault