Skip to content

Windows 下安装配置 OpenSSH 并通过 VSCode SSH 连接 #84

@Dream4ever

Description

@Dream4ever

参考资料

下载及安装

软件下载

先去 Releases 页面下载最新版的 OpenSSH,注意要下载 64 位版本的。

下载之后将其复制到服务器上,并将压缩包里的文件解压至 C:\Program Files\OpenSSH 目录下。

软件安装

用管理员权限运行 PowerShell,定位至 OpenSSH 所在目录,执行下面的命令来安装 OpenSSH:

powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1

如果能够看到下图中的绿色提示文字,说明 OpenSSH 客户端及服务端安装成功。

image

然后执行下面的命令,在防火墙中为 sshd 开启 22 端口 TCP 请求的权限。当然也可以在这里把 22 换成别的不常见的端口,不过记得在后面 sshd 的配置中也对应修改。

New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

基本配置

软件运行

执行 net start sshd,启动 SSH 服务端的服务 sshd。初次运行的话,会在 %programdata%\ssh 目录下自动生成 host keys。

执行 Set-Service sshd -StartupType Automatic,可将 sshd 服务设置为开机自动启动。

设置默认 Shell

下面的命令,可以将 PowerShell 设置为 SSH 的默认 Shell:

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShellCommandOption -Value "/c" -PropertyType String -Force

如果要将 Git Bash 设置为默认 Shell,则执行下面的命令:

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Program Files\Git\bin\bash.exe" -PropertyType String -Force

这里要注意,虽然 Git Bash 在 Windows 下的快捷方式指向的是 c:\Program Files (x86)\Git\git-bash.exe,但它调用的其实是 c:\Program Files (x86)\Git\bin\bash.exe。如果在上面的命令中,把 Bash 的可执行程序路径设置为前者,则 SSH 连接到服务器之后会无法操作;只有设置为后者,才能正常操作。

还要注意,如果配置 Git Bash 为默认 Shell 后连接失败,需要查看注册表 "HKLM:\SOFTWARE\OpenSSH" 路径下是否有一项 "DefaultShellCommandOption" 并且值为 "/c",如果存在的话需要将这一项删掉,因为这一项是只在 PowerShell 为默认 Shell 下才需要的,如果默认 Shell 为 Git Bash 的话,这一项的存在会导致 VSCode SSH 插件连接远程服务器失败。

云服务器安全组开放对应端口

在阿里云服务器的安全组中,给 SSH 的端口的 TCP 请求开放对应权限。在办公室的时候,用不同的网站查 IP,会分属不同的运营商,如果用一个网站查的 IP 会 SSH 失败,那就再试试另一个网站查到的 IP,多试几个总有一个能用的。

测试连接

在本地用 ssh -v username@hostip -p customport 这样的命令连接服务器,该命令中各参数含义如下:

  • -v:该参数用于详细列出连接过程,以便调试
  • username:通过用户名 + 密码的方式来 SSH 连接时,在这里输入用户名
  • hostip:在这里输入服务器 IP 地址
  • -p customport:如果修改了默认端口,在 -p 参数后面输入对应的端口号,比如 32109

首次连接,会提示一个什么 fingerprint,输入 yes 然后回车,接着会再提示要求输入密码,再输入然后回车,成功的话,就连接到服务器上了。

安全加固

修改端口

为了安全起见,还是应当把默认的 SSH 端口改成别的端口号,需要修改的有三处地方:

  • sshd 配置文件,默认在 c:\ProgramData\ssh\sshd_config
  • Windows 防火墙,在 控制面板\所有控制面板项\Windows 防火墙\允许的应用 中,双击 OpenSSH Server (sshd),然后输入对应的端口号并保存
  • 阿里云服务器的安全组规则设置

使用密钥对连接

在客户端的 %systemdrive%\Users\<user>\.ssh 目录下,执行命令 ssh-keygen -t rsa-sha2-256 -b 2048,来生成密钥对,其中 id_rsa 为私钥,id_rsa.pub 为公钥。

这里用 -t rsa-sha-256 而不是默认的 -t rsa,是因为用默认参数生成的私钥安全性不够(见 SSH without password does not work after upgrading from 18.04 to 22.04SSH server gives "userauth_pubkey: key type ssh-rsa not in PubkeyAcceptedAlgorithms [preauth]" when connecting with Putty),这样的私钥导入 XShell 后,SSH 连接服务器会失败。

在服务器的 c:\ProgramData\ssh 目录下,创建 authorized_keys 这个文件,将前面生成的公钥的内容复制到该文件中。同时确保该文件只有 System 和 Administrators 用户(组)有完整权限,Authenticated users 有读取和执行权限。

接着重启服务器上的 sshd 服务。

然后在客户端使用命令 ssh -v -i id_rsa username@hostip -p customport 来连接服务器,正常情况下应当是可以连接成功的。

为了能够方便连接,可以在客户端编辑 ~\.ssh\config 文件,将 SSH 连接设置为如下配置:

Host ECS1
  HostName 1.2.3.4
  User abc
  Port 65535
  IdentityFile ~/.ssh/id_rsa

这样 VSCode 会自动识别该配置文件,连接远程服务器的时候就会很方便了。

Metadata

Metadata

Assignees

No one assigned

    Labels

    ServerThe invisible heroSoftwareAbout installation ande usage

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions