SSH 免密登录 Windows
安装并启动 OpenSSH 服务器
在开始之前请确保你的远程 Windows 已经安装了 OpenSSH 服务器。若没有安装,请在 设置 > 系统 > 可选功能 > 添加可选功能 中安装 OpenSSH 服务器。
安装完成后,在远程 Windows 终端(管理员)中输入以下命令启动 OpenSSH 服务器:
Start-Service sshd # 启动 sshd 服务
Set-Service -StartupType Automatic sshd # 设置 sshd 服务自动启动
上传公钥
方法一
Windows 上的 OpenSSH 默认将管理员用户组的公钥存储到 C:\ProgramData\ssh\administors_authorized_keys。因此如果你登录的用户属于管理员组,那么将使用 C:\ProgramData\ssh\administors_authorized_keys 文件中的公钥(而不是 ~\.ssh\authorized_keys)来验证你的身份。
因此我们需要把公钥存储到 C:\ProgramData\ssh\administors_authorized_keys。如果你的本地主机是 Linux / macOS,运行下面这条命令:
scp ~/.ssh/id_rsa.pub USER@HOST:/ProgramData/ssh/administrators_authorized_keys
将
USER和HOST分别改为你自己的用户名和主机名
如果你的本地主机是 Windows,运行下面这条命令:
# 获取公钥
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_rsa.pub
# 要在远程主机上运行的命令,将公钥内容拷贝到远程主机的 administrators_authorized_keys 文件
$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"""
# 连接远程主机并运行 $remotePowershell 中的命令
ssh username@domain1@contoso.com $remotePowershell
参考:OpenSSH for Windows 中基于密钥的身份验证 | Microsoft Learn
这里没有使用 ssh-copy-id,因为 ssh-copy-id 内部会执行一些 *nix shell 命令,因此只能用于 *nix 机器。
方法二
编辑 C:\ProgramData\ssh\sshd_config,在文件最底部,注释掉这两行配置:
#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
此时所有用户的公钥验证文件都设置成了 ~/.ssh/authorized_keys,此时再将公钥上传到远程 Windows 的 ~/.ssh/authorized_keys 文件中:
scp ~/.ssh/id_rsa.pub USER@HOST:.ssh/authorized_keys
另外,你需要确保 ~\.ssh\authorized_keys 文件的访问控制权限包括 Everyone 的读权限。如果没有 Everyone 的权限,你可以使用下面的命令添加 Everyone 的访问权限:
icacls $Env:USERPROFILE\.ssh\authorized_keys /inheritance:r /grant Everyone:F
或者你可以打开资源管理器,在 authorized_keys 文件上右键 属性 > 安全 > 编辑 > 添加 > 高级 > 立即查找 中选中 Everyone ,再一路确定。
参考:多台 WIN 10 之间的 SSH 免密登录 | 知乎
登录
ssh USER@HOST
在使用 SSH 登录 Windows 时,容易遇到一个巨坑就是不知道远程 Windows 的用户名。由于远程 Windows 可能设置了 Microsoft 帐户的原因,远程 Windows 的用户名可能不是用户主目录的名字。你需要使用下面的命令来查看用户名:
$Env:USERNAME
而密码则使用 Microsoft 帐户的密码。
更改默认 Shell(可选)
通过 SSH 连接到 Windows 时默认登录的 Shell 是 CMD,可以通过下面的命令将默认 Shell 改为 PowerShell:
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
# 可以使用 Remove-ItemProperty 删除这个属性
这种方法登录的是 PowerShell 5。如果将 Value 改为 PowerShell 7 的话在连接时会出错误提示:
Access is denied.
Connection to localhost closed.
参考:
- 适用于 Windows 的 OpenSSH 服务器配置 | Microsoft Learn
- 通过 SSH 进行 PowerShell 远程处理 - PowerShell | Microsoft Learn
Troubleshooting
无法登录:No auth methods could be used
有一次为了偷懒,没有上传公钥,想直接用密码登录 Windows。结果提示:
ssh: Connection to USER@HOST:22 exited: No auth methods could be used.
最后发现无法登录的原因是没有启用密码登录的选项。
解决方法:编辑 SSH 配置文件 C:\ProgramData\ssh\sshd_config,找到 PasswordAuthentication 项,将选项改为 yes:
PasswordAuthentication yes
然后重启 SSH 服务器。在终端(管理员)下运行:
Restart-Service sshd
然后再次尝试连接。用户名用 $Env:USERNAME 查看,密码是 Windows 帐户的密码。
SSH 免密登录 Windows的更多相关文章
- ssh免密登录linux服务器
Ssh免密登录 sshd服务 sshd简介: SSH 密钥为登录 Linux 服务器提供了更好且安全的机制.运行 ssh-keygen 后,将会生成公私密钥对.你可以将公钥放置到任意服务器,从持有私钥 ...
- Cmder下ssh免密登录配置
1.本地生成ssh-key 在本地cmder终端下运行下面的命令生成ssh的公钥和私钥文件: ssh-keygen -t rsa 其中,.ssh/id_rsa为私钥文件,留在本地使用,而.ssh/id ...
- 【Linux】文件权限,ssh免密登录
1.文件/文件夹权限 例子: -rw-r--r--. 1 root root 12288 Aug 21 09:50 aliases.db drwxr-xr-x. 2 root root 4096 Au ...
- linux(十)配置ssh免密登录实现
知道ssh的朋友应该知道它是用来干什么的,如果你不知道什么是ssh远程登录的话,可以去看一下我的上一篇博客,关于linux的网络基础的知识.备注:ssh是用于远端登入.执行ssh指令开启终端机阶段作业 ...
- 【Linux】ssh免密登录
一.ssh免密配置 ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例.有机器A(192.168.1.155),B(192.168. ...
- Ubuntu如何配置SSH免密登录
前言 在搭建hadoop集群时,需要主机和副机之间实现SSH免密登录 一.环境准备 1.ubuntu两台 二.安装SSH 1.首先检测一下本机有没有安装SSH服务,如果没有任何打印说明未安装 sudo ...
- linux 远程ssh免密登录
写在前面 先说说需求: 我们平时开发.运维操作linux过程中经常需要实现将远程文件拷贝到本地或者本地文件拷贝到远程:执行远程命令等操作:这个时候建立ssh免密登录应该是一个比较好的选择: 原理 在l ...
- linux服务器ssh免密登录
环境:两台服务器,Park01.Park02,配置ssh免密登录 在Park01执行:ssh-keygen 然后一直回车 生成节点的公钥和私钥,生成的文件会自动放在/root/.ssh目录下 然后 ...
- (11)ssh免密登录配置
***在Linux命令行中登录到另一台虚拟机(需要用到ssh协议) Linux中默认有ssh的服务器端和客户端,客户端的名字就叫ssh 前提是当前使用的用户名在待连接的虚拟机中存在 格式: ssh ...
- linux上ssh免密登录原理及实现
因为我的服务器集群需要回收日志到中央进行统一处理,所以需要建立ssh互信关系实现免密登录.关于ssh的使用大家可能都很熟悉了,我们今天主要来讲下ssh连接和免密登录的原理. scp 传输文件 scp( ...
随机推荐
- Go 如何对多个网络命令空间中的端口进行监听
Go 如何对多个网络命令空间中的端口进行监听 需求为 对多个命名空间内的端口进行监听和代理. 刚开始对 netns 的理解不够深刻,以为必须存在一个新的线程然后调用 setns(2) 切换过去,如果有 ...
- 【Grafana】Grafana模板自定义-1-创建选择框
如何创建选择框 第一步:编辑模板 第二步:配置变量 配置说明: General: [Name]变量名,后面模板中如果要按条件筛选,会用到这个变量名. [Type]类型,目前没仔细研究,使用默认的Que ...
- virtualbox ubuntu拓展存储空间
1. 关闭虚拟机,右键点击virtualbox图标,选择打开文件位置,记录下路径: 2. 找到需要拓容的ubuntu虚拟机的.vdi文件,记录下路径: 3. windows命令行转到virtualbo ...
- TP5.0学习笔记
TP5目录结构介绍 application目录是应用目录,我们整个应用所有的内容都写在这个目录中,在后续开发中,我们更多的时候都是在编写这个目录中的文件.在它里边有一个index文件夹,它叫做模块儿, ...
- 在Django中,多数据操作,你可以编写测试来查询另一个数据库服务器中的数据,并将结果导入当前Django项目的数据库表中
在Django中,你可以编写测试来查询另一个数据库服务器中的数据,并将结果导入当前Django项目的数据库表中.下面是一个简单的示例: 假设你有一个Django应用程序,名为myapp,并且你希望从另 ...
- System.NotSupportedException:“无法显式设置 SplitterPanel 的高度。改在 SplitContainer 上设置 SplitterDistance。”
System.NotSupportedException:"无法显式设置 SplitterPanel 的高度.改在 SplitContainer 上设置 SplitterDistance.& ...
- 关联的巧妙用法limit_choices_to
sa_no = models.ForeignKey(CU004HModel, verbose_name='销货单', on_delete=models.PROTECT, related_name='C ...
- ComfyUI进阶:Comfyroll插件 (三)
前言: 学习ComfyUI是一场持久战,而Comfyroll 是一款功能强大的自定义节点集合,专为 ComfyUI 用户打造,旨在提供更加丰富和专业的图像生成与编辑工具.借助这些节点,用户可以在静态图 ...
- [rCore学习笔记 03]配置rCore开发环境
写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 rCo ...
- 标准 C++ 中的 string 类的用法总结
相信使用过 MFC 编程的朋友对 CString 这个类的印象应该非常深刻吧?的确,MFC 中的 CString 类使用起来真的非常的方便好用.但是如果离开了 MFC 框架,还有没有这样使用起来非常方 ...