win11开启ssh服务,让你能通过ssh方式登录到win11

5,955 阅读3分钟

启用ssh服务和ssh客户端

适用于 Windows 的 OpenSSH 入门 | Microsoft Learn

查看当前的用户名和ip

看用户名

echo %username%

看ip

ipconfig

通过ssh连接

ssh <你的用户名>@<你的ip>

如: ssh test@192.168.2.121

关于ssh连接密码

可能你查看你的登录选项中,并没有密码这一项,那么ssh用什么密码呢?

image.png

答案是: 微软账号的登录密码

ssh使用公钥/密钥方式,免输入密码登录win11

ssh客户端生成密钥/公钥

打开用户目录下的.ssh文件夹:%userprofile%\.ssh

image.png

打开cmd,生成密钥

ssh-keygen -t ed25519

按 Enter 来接受默认值, 此时密钥文件,会生成到你用户目录的.ssh文件夹,然后再输入密码(此密码是用来加密密钥文件的)

image.png

id_xxx.pub的是公钥,另一个是私钥。

私钥文件等效于密码,应当采用与保护密码相同的方式来保护它。使用 ssh-agent 来将私钥安全地存储在与你的 Windows 帐户关联的 Windows 安全上下文中。 要在每次重启计算机时启动 ssh-agent 服务,并使用 ssh-add 存储私钥,请通过服务器上提升的 PowerShell 提示符运行以下命令:

# 当前这些命令需要以管理员身份在PowerShell中运行
# ssh-agent服务默认是禁用的,需要通过如下方式启用
Get-Service ssh-agent | Set-Service -StartupType Automatic

# 启动 ssh-agent 服务
Start-Service ssh-agent

# 查看 ssh-agent 服务的运行状态
Get-Service ssh-agent

# 将私钥文件添加到ssh-agent(此时需要输入一次之前创建密钥文件时输入的密码)
ssh-add $env:USERPROFILE\.ssh\id_ed25519

OpenSSH for Windows 中基于密钥的身份验证 | Microsoft Learn

将ssh客户端生成的公钥上传至ssh服务端

ssh要使用公钥/密钥的方式来登录远程的windows,还需要将ssh客户端生成的公钥上传到ssh服务端

此时分两种情况

你登录的是标准用户(即: 你的ssh登录时使用的账户是win的标准用户)

公钥 (\.ssh\id_ed25519.pub) 的内容需放置在服务器上的一个名为 authorized_keys 的文本文件中,该文件位于 C:\Users\username\.ssh\。 可以使用 OpenSSH scp 安全文件传输实用工具或使用 PowerShell 将密钥写入文件来复制公钥。

以下示例将公钥复制到服务器(其中username替换为你的用户名)。 最初,你需要使用服务器的用户帐户的密码。

# 以下命令需要在PowerShell中执行
# 获取公钥文件内容,并存放到临时变量 $authorizedKey 中
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ed25519.pub

# 将临时变量 $authorizedKey 中的内容,写入 authorized_keys 文件
$remotePowershell = "powershell New-Item -Force -ItemType Directory -Path $env:USERPROFILE\.ssh; Add-Content -Force -Path $env:USERPROFILE\.ssh\authorized_keys -Value '$authorizedKey'"

# 使用 authorized_keys 文件,登录ssh
ssh username@domain1@contoso.com $remotePowershell

你是管理用户(即: 你的ssh登录时使用的账户是win的管理用户)

公钥 (\.ssh\id_ed25519.pub) 的内容需放置在服务器上的一个名为 administrators_authorized_keys 的文本文件中,该文件位于 C:\ProgramData\ssh\。 可以使用 OpenSSH scp 安全文件传输实用工具或使用 PowerShell 将密钥写入文件来复制公钥。 此文件上的 ACL 需要配置为仅允许访问管理员和系统。

以下示例将公钥复制到服务器并配置 ACL(其中username替换为你的用户名)。 最初,你需要使用服务器的用户帐户的密码。

# Get the public key file generated previously on your client
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ed25519.pub

# Generate the PowerShell to be run remote that will copy the public key file generated previously on your client to the authorized_keys file on your server
$remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '$authorizedKey';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""Administrators:F"" /grant ""SYSTEM:F"""

# Connect to your server and run the PowerShell using the $remotePowerShell variable
ssh username@domain1@contoso.com $remotePowershell

ssh客户端此时就可以免密登录了

如:

ssh test@192.168.1.200

ssh -l test 192.168.1.200

SSH 密钥登录过程

预备步骤,客户端通过ssh-keygen生成自己的公钥和私钥。

第一步,手动将客户端的公钥放入远程服务器的指定位置。

第二步,客户端向服务器发起 SSH 登录的请求。

第三步,服务器收到用户 SSH 登录的请求,发送一些随机数据给用户,要求用户证明自己的身份。

第四步,客户端收到服务器发来的数据,使用私钥对数据进行签名,然后再发还给服务器。

第五步,服务器收到客户端发来的加密签名后,使用对应的公钥解密,然后跟原始数据比较。如果一致,就允许用户登录。

SSH 密钥登录 - SSH 教程 - 网道.png

补充

ssh服务默认使用22端口进行通信,那能不能不用22端口? 当然可以

Linux篇之添加或修改ssh服务的端口和通过指定端口进行连接_修改ssh连接-CSDN博客

xshell中ssh命令不使用默认的22端口_堡垒机 访问服务器 不是默认22端口-CSDN博客

参考资料

SSH 密钥登录 - SSH 教程 - 网道 (wangdoc.com)

Windows Terminal:SSH连接远程服务器 - 知乎 (zhihu.com)

ssh远程连接windows_ssh连接windows-CSDN博客