How to use Remote-SSH in Windows

对于不太会使用 Vim 的我来说,在服务器上用 Vim 去修改 nginx.conf 实在有点麻烦,比如没有高亮和格式化。正好想起前不久微软发布了远程开发工具包,其中一个就是今天要介绍的 Remote-SSH。下面是官方对该扩展的定义:

The Remote - SSH extension lets you use any remote machine with a SSH server as your development environment. This can greatly simplify development and troubleshooting in a wide variety of situations.

因此用来修改 nginx.conf 也是符合其目标的。

执行环境

  • Windows 10
  • Powershell Core 6.2.0
  • Visual Studio Code Insiders:因为 Remote-SSH 还在 Preview 阶段,只能开发版的 VSCode 中使用。
  • 远程 Linux 主机

使用方法

在 Remote-SSH 扩展的介绍页面下其实是有一个快速开始文档的,简单来说就是在成功安装该扩展之后,需要配置服务端和本地客户端的环境。

在服务器上安装 SSH 服务

同样有文档

  • Debian / Ubuntu

    Run sudo apt-get install openssh-server
    
  • RHEL / Fedora / CentOS

    Run sudo yum install openssh-server && sudo systemctl start sshd.service && sudo systemctl enable sshd.service
    

本地连接远程主机

  1. 配置基于 SSH 密钥的身份验证

    1. 自定义 SSH 密钥文件名称,使用你自己定义的名称替代 id_rsa-remote-ssh

      ssh-keygen -t rsa -b 4096 -f "HOME\.ssh\id_rsa-remote-ssh"
      
    2. 编辑 SSH config 文件,添加以下代码。

      Host name-of-ssh-host-here
      HostName your-fqdn-or-ip-goes-here
      User your-user-name-on-host
      IdentityFile ~/.ssh/id_rsa_remote-ssh
      

      Host 仅仅是远程服务器主机的名称,我取的是 CentOS;HostName 是你的远程服务器 IP 地址;User 是登录用户名称,比如 root;IdentityFile 则是私有密钥的相对路径,也可以是绝对路径。

    3. 将本地的 id_rsa-remote-ssh.pub 的内容追加到远程服务器的 authorized_keys 文件里。

      # 将`name-of-ssh-host-here`替换成你第二步里面的Host后面的值即可,这里可以用单引号或者双引号
      $REMOTEHOST='name-of-ssh-host-here'
      
      # 这里一定要使用双引号
      $PATHOFIDENTITYFILE="$HOME\.ssh\id_rsa-remote-ssh.pub"
      
      # scp 是 linux 系统下基于 SSH 登陆进行安全的远程文件拷贝命令。这里把本地的公开密钥复制到服务器端的`~/tmp.pub`中。该命令运行之后需要输入服务器登录密码。
      scp $PATHOFIDENTITYFILE "$REMOTEHOST`:~/tmp.pub"
      
      # 通过 SSH 向服务器执行以下一组命令,执行成功后本地的密钥就被追加到服务器的`~/.ssh/authorized_keys`文件里。
      ssh $REMOTEHOST "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat ~/tmp.pub >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && rm -f ~/tmp.pub"
      

      以上是初次添加公钥时需要对~/.ssh设置了权限。以后再添加其他机器的公钥就不需要执行chmod操作了,直接将公钥追加到authorized_keys文件即可。

      ssh $REMOTEHOST "cat ~/tmp.pub >> ~/.ssh/authorized_keys && rm -f ~/tmp.pub"
      
  2. VSCode 下按下 F1 调起所有命令面板,运行 Remote-SSH: Connect to Host... 选择你上一步配置好的主机,回车连接即可。

遇到的问题

  1. 在使用方法章节的 1.3 中执行 scpssh 命令时可能会遇到 Permission denied 的问题。把 Powershell 以管理员身份运行也报同样的错误。请执行以下命令,看看是否存在多个相同命名的可执行文件。

    where.exe scp
    
    # 我的输出:
    # C:\Windows\System32\OpenSSH\scp.exe
    # D:\Scoop\shims\scp.exe
    
    where.exe ssh
    # 我的输出:
    # C:\Windows\System32\OpenSSH\ssh.exe
    # D:\Scoop\shims\ssh.exe
    

    如果存在,那么优先或默认会使用前一个可执行文件(System32/OpenSSH下的scp),结果我们已经知道,会报“权限不足”的错误。当我使用后一个可执行文件(Scoop/shims下的scp)时,竟然成功了。

    解决办法有两种:

    • 使用scp时,把路径打全。ssh同理。

      D:\scoop\shims\scp.exe $PATHOFIDENTITYFILE "$REMOTEHOST`:~/tmp.pub"
      
    • 把系统环境变量PATH里的C:\Windows\System32\OpenSSH删除。

posted @ 2019-05-28 22:18  capdiem  阅读(1175)  评论(0编辑  收藏  举报