启用ssh服务和ssh客户端
适用于 Windows 的 OpenSSH 入门 | Microsoft Learn
查看当前的用户名和ip
看用户名
echo %username%
看ip
ipconfig
通过ssh连接
ssh <你的用户名>@<你的ip>
如: ssh test@192.168.2.121
关于ssh连接密码
可能你查看你的登录选项中,并没有密码这一项,那么ssh用什么密码呢?
答案是: 微软账号的登录密码
ssh使用公钥/密钥方式,免输入密码登录win11
ssh客户端生成密钥/公钥
打开用户目录下的.ssh文件夹:%userprofile%\.ssh
打开cmd,生成密钥
ssh-keygen -t ed25519
按 Enter 来接受默认值, 此时密钥文件,会生成到你用户目录的.ssh文件夹,然后再输入密码(此密码是用来加密密钥文件的)
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服务默认使用22端口进行通信,那能不能不用22端口? 当然可以
Linux篇之添加或修改ssh服务的端口和通过指定端口进行连接_修改ssh连接-CSDN博客
xshell中ssh命令不使用默认的22端口_堡垒机 访问服务器 不是默认22端口-CSDN博客
参考资料
SSH 密钥登录 - SSH 教程 - 网道 (wangdoc.com)