Windows系统VS Code远程连接

基于https://zhuanlan.zhihu.com/p/122999157  结合里面的官方链接说明

1 环境配置
用ssh连接时,本地称为client,远程主机称为host。

在两台电脑里(host?)安装OpenSSH (先确认https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse?tabs=gui#prerequisites里的prerequisites check):

Option 1: 从 Windows Server 2019 或 Windows 10 1809 上的“设置”UI 安装 OpenSSH

OpenSSH 客户端和服务器是 Windows 10 1809 的可安装功能。

若要安装 OpenSSH,请启动“设置”,然后转到“应用”>“应用和功能”>“管理可选功能”。

扫描此列表,查看 OpenSSH 客户端是否已安装。 如果没有,则在页面顶部选择“添加功能”,然后:

若要安装 OpenSSH 客户端,请找到“OpenSSH 客户端”,然后单击“安装”。
若要安装 OpenSSH 服务器,请找到“OpenSSH 服务器”,然后单击“安装”。
安装完成后,请返回“应用”>“应用和功能”>“管理可选功能”,你应当会看到列出的 OpenSSH 组件。

Option 2: 使用 PowerShell 安装 OpenSSH

以管理员身份运行 PowerShell。

Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

如果两者均尚未安装,则此操作应返回以下输出:

Name : OpenSSH.Client~~~~0.0.1.0
State : NotPresent

Name : OpenSSH.Server~~~~0.0.1.0
State : NotPresent

然后,根据需要安装服务器或客户端组件:

# Install the OpenSSH Client
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

# Install the OpenSSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

这两者应该都会返回以下输出:

Path :
Online : True
RestartNeeded : False

# Start the sshd service
Start-Service sshd

执行下列命令行

# OPTIONAL but recommended:
Set-Service -Name sshd -StartupType 'Automatic'

# Confirm the Firewall rule is configured. It should be created automatically by setup. Run the following to verify
if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue | Select-Object Name, Enabled)) {
Write-Output "Firewall Rule 'OpenSSH-Server-In-TCP' does not exist, creating it..."
New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
} else {
Write-Output "Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists."
}

完成后,尝试连接到OpenSSH server:

在第一次登录之前,我们先来了解两个概念:username和servername/hostname。

在windows服务器中,username可以用你激活电脑时使用的用户名,即文件资源管理器中C:\Users\username的username。可以在PowerShell中输入whoami得到username.

而servername/hostname则是“设置”>“系统”>“关于”里的“设备名称”。可以在PowerShell中输入hostname得到。也可以用IP地址代替

在 Windows 上安装 OpenSSH Server后,可以从安装了 SSH Client的任何 Windows 设备上使用 PowerShell 来快速测试它。 在 PowerShell 中,键入以下命令(注意此处的username和servername都是用远程主机(Host)的):

Ssh username@hostname
到任何服务器的第一个连接都将生成类似以下内容的消息:

The authenticity of host 'servername (10.00.00.001)' can't be established.
ECDSA key fingerprint is SHA256:(<a large string>).
Are you sure you want to continue connecting (yes/no)?

回答 Yes 会将该服务器添加到本地系统的已知 ssh 主机列表中。

系统此时会提示你输入密码(也就是远程主机Host的开机密码,不是六位锁屏数字密码,是登录微软账户的密码)。 作为安全预防措施,密码在键入的过程中不会显示。

在连接后,你将看到类似于以下内容的命令 shell 提示符:

domain\username@SERVERNAME C:\Users\username>

2 在vscode中连接

在Client电脑操作。
To connect to a remote host for the first time, follow these steps:

Verify you can connect to the SSH host by running the following command from a terminal / PowerShell window replacing username@hostname as appropriate.

ssh username@hostname

若成功应该进入username开头的命令行

打开vscode,打开Command Palette (F1/ctrl+shift+P) ,输入"Remote-SSH: Connect to Host..." 并选中,选择"+ Add New SSH Host...",username@hostname

然后就可以通过密码远程连接,不过前提是两台电脑在同一个网络里。

3. 设置密钥管理

密钥对指的是由特定的身份验证协议使用的公钥和私钥文件。

SSH 公钥身份验证使用不对称加密算法来生成两个密钥文件 – 一个为“私钥”文件,一个为“公钥”文件。 私钥文件等效于密码,在所有情况下都应当保护它们。 如果有人获取了你的私钥,则他们可以像你一样登录到你有权登录的任何 SSH 服务器(远程主机Host)。 公钥放置在 SSH 服务器上(远程主机Host),并且可以共享,不会危害私钥的安全。

将密钥身份验证用于 SSH 服务器(远程主机Host)时,SSH 服务器(远程主机Host)和客户端(Client)会依据私钥来比较所提供的用户名的公钥。 如果无法依据客户端(Client)私钥验证公钥,则身份验证失败。

可以通过在生成密钥对时要求提供密码(passphrase)来通过密钥对实现多重身份验证(参见下文的密钥生成)。 在身份验证期间,会提示用户输入密码,将使用该密码以及 SSH 客户端(Client)上的私钥来对用户进行身份验证。

3.1 在Client电脑上生成用户密钥

在Client电脑上,通过 PowerShell 或 cmd,使用 ssh-keygen 生成一些密钥文件

cd ~\.ssh\
ssh-keygen

这应当会显示如下某些内容(其中,“username”将替代为你的用户名)

Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\username\.ssh\id_rsa):

你可以按 Enter 来接受默认值,或指定要在其中生成密钥的路径。 此时,系统会提示你使用密码(passphrase)来加密你的私钥文件。 密码可以与密钥文件一起工作来提供双重身份验证。 在此示例中,我们将密码留空。(以下只是个例子,你的密钥肯定和示例不同)

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\username\.ssh\id_rsa.
Your public key has been saved in C:\Users\username\.ssh\id_rsa.pub.
The key fingerprint is:
SHA256:OIzc1yE7joL2Bzy8!gS0j8eGK7bYaH1FmF3sDuMeSj8 username@server@LOCAL-HOSTNAME

The key's randomart image is:
+--[RSA 2048]--+
| . |
| o |
| . + + . |
| o B * = . |
| o= B S . |
| .=B O o |
| + =+% o |
| *oo.O.E |
|+.o+=o. . |
+----[SHA256]-----+

现在,你有了一个公钥/私钥 rsa 密钥对(.pub 文件是公钥,其余的是私钥):

3.2 在远程主机Host电脑上部署公钥

若要使用上面创建的用户密钥,需要将公钥放置在远程主机Host上的一个文本文件中,该文件需名为 authorized_keys,位于 users\username.ssh. 下

3.2.1 在host主目录下创建 .ssh 目录

打开 PowerShell,运行:

cd ~
mkdir .ssh

3.2.2  创建 authorized_keys 文件并加入公钥

在 PowerShell 中执行如下命令创建文本文件:

notepad .ssh\authorized_keys

然后把客户端(Client)的公钥复制到这个文件中并保存。公钥路径在3.1里的Your public key has been saved in C:\Users\username\.ssh\id_rsa.pub. 可以用vscode打开。

把文本文件的名称修改为 authorized_keys(就是去掉后缀,这一步也可以手动操作),命令如下:

notepad .ssh\authorized_keys
mv .\.ssh\authorized_keys.txt .\.ssh\authorized_keys

3.2.3 修改 ssh 服务的配置文件

以管理员权限打开 PowerShell,执行命令:

notepad C:\ProgramData\ssh\sshd_config

用“#”注释掉配置文件中的最后两行然后保存:

#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

最后在服务管理器器中重启 OpenSSH SSH Server 服务:

Services里找到Open SSH Server右键restart

4. 在客户端(Client)电脑通过公钥认证的方式登录到远程主机Host

首先测试是否能远程连接:在客户端(Client)电脑打开powershell,执行

ssh username@hostname -i id_rsa

无需输入密码,你将直接看到类似于以下内容的命令 shell 提示符:

domain\username@SERVERNAME C:\Users\username>

然后输入“exit”退出。

在vscode上通过公钥认证的方式登录到远程主机Host

在Command Palette (F1/ctrl+shift+P) 中,输入"ssh open configuration" 并打开客户端(本地)的config文件(若有多个选择比如C:\User\username\...和C:\Program Data\... 应该选User\username那个config文件,那个是对应现在登录的账户的),内容应该类似如下:

Host name
  HostName hostname
  User username

在下面添加:

   IdentityFile "C:\Users\username\.ssh\id_rsa"

注意添加的文本前面是有缩进的,替换掉username。

重启客户端(Client)电脑vs code,下一次登录远程主机Host时,点击vscode左下角的绿色标志,选择connect to,选择远程主机Host连接。

 

【Troubleshoot】

1. 是远程主机Host的开机密码,不是六位锁屏数字密码,是登录微软账户的密码。

2. ssh could not resolve hostname https name or service not known:通常是因为 ssh 无法解析主机名(hostname),可能是因为主机名错误、DNS 配置不正确或者网络连接不可靠等问题导致的。用IP地址代替hostname连接。查看IP地址:https://whatismyipaddress.com/

posted @ 2024-03-28 21:27  铸剑非攻  阅读(11)  评论(0编辑  收藏  举报