VS Code 使用需要认证的 SOCKS5 代理通过 Remote - SSH 连接远程服务器进行开发

本来是很简单的一件事情,追求新版本又把自己坑了一次……
留个记录稍微描述详细一点,希望能帮到你。


参考的文章:「VS Code」如何通过跳板机连接服务器进行远程开发:Remote-SSH 篇

1、VS Code 中 Remote - SSH 的安装和使用都很简单,就一步带过了。
在插件库中搜索安装:
选择安装
新建连接:
配置
选择 SSH 配置存放和读取路径:
选择 SSH 配置存放路径
接下来就是输入密码登录服务器,自行操作即可,但是如果你需要密钥登录,请跟着步骤 2 进行配置。

2、进行 SSH 密钥登录的配置和代理的配置。
进入刚刚所选 SSH 配置存放的目录,一般是 C:\Users\你的用户名\.ssh 这个路径。

选择编辑 config 文件,密钥和代理的配置参照我设置即可:

# Host 为服务器别名,可以和 HostName 一样
Host $server_host
  # 你的服务器域名或 IP
  HostName $server_host
  # 用户
  User $user
  # SSH 私钥地址,例如:C:\Users\你的用户名\.ssh\example
  IdentityFile $ssh_primary_key$path
  # 代理配置
  ProxyCommand C:\bin\nmap\ncat.exe --proxy-type socks5 --proxy $proxy_host:$proxy_port %h %p --proxy-auth $proxy_auth_username:$proxy_auth_passwod

代理的配置详细说一下,也是我踩坑的地方。
下载压缩包后解压到任意目录,然后替换上面 C:\bin\nmap\ncat.exe 的路径即可。
虽然官方文档中明确记载了代理认证信息的配置方法,但是经过实测在当前最新版本:nmap-7.91-win32.zip 下是不支持的,VS Code 具体错误日志:

[01:09:46.557] Running script with connection command: ssh -T -D 13100 "example.com" bash
[01:09:46.559] Terminal shell path: C:\Windows\System32\cmd.exe
[01:09:46.742] > ]0;C:\Windows\System32\cmd.exe
[01:09:46.742] Got some output, clearing connection timeout
[01:09:47.447] > kex_exchange_identification: Connection closed by remote host
[01:09:47.454] > 过程试图写入的管道不存在。
[01:09:48.732] "install" terminal command done
[01:09:48.732] Install terminal quit with output: 过程试图写入的管道不存在。
[01:09:48.732] Received install output: 过程试图写入的管道不存在。
[01:09:48.733] Failed to parse remote port from server output
[01:09:48.733] Resolver error: Error: 
	at Function.Create (c:\Users\my_user\.vscode\extensions\ms-vscode-remote.remote-ssh-0.65.7\out\extension.js:1:64659)
	at Object.t.handleInstallOutput (c:\Users\my_user\.vscode\extensions\ms-vscode-remote.remote-ssh-0.65.7\out\extension.js:1:63302)
	at Object.t.tryInstall (c:\Users\my_user\.vscode\extensions\ms-vscode-remote.remote-ssh-0.65.7\out\extension.js:1:415135)
	at processTicksAndRejections (internal/process/task_queues.js:93:5)
	at async c:\Users\my_user\.vscode\extensions\ms-vscode-remote.remote-ssh-0.65.7\out\extension.js:1:294918
	at async Object.t.withShowDetailsEvent (c:\Users\my_user\.vscode\extensions\ms-vscode-remote.remote-ssh-0.65.7\out\extension.js:1:406463)
	at async Object.t.resolve (c:\Users\my_user\.vscode\extensions\ms-vscode-remote.remote-ssh-0.65.7\out\extension.js:1:295994)
	at async c:\Users\my_user\.vscode\extensions\ms-vscode-remote.remote-ssh-0.65.7\out\extension.js:127:110656
[01:09:48.736] ------

这种情况似乎只会在 VS Code 中出现,我在命令行中尝试连接时没有问题:

C:\Users\my_user>ssh [email protected] ProxyCommand="C:\bin\nmap-7.91\ncat.exe --proxy-type socks5 --proxy example.proxy:1080 %h %p --proxy-auth 111:222"
[email protected]: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

而解决方法则只有一个,回退版本,和参考的教程中使用同样的版本:nmap-7.70-win32.zip
这个问题的解决单纯就是试出来的,暂时也没有功夫去探究错误的原因,可能也只是个例,Stack Overflow 的个别讨论也都是纠结配置方法的问题,事实上格式官方已经给了,参考意义都不是很大。
如果回退依然没有解决你的问题的话,在确保 SSH 不适用代理能访问的前提下,使用以下代码去排查下:

lastb -n 100

在服务器运行,查看最近受阻的 100 次 SSH 登录,看客户端到服务器是否打开过连接,再做下一步的判断。
结束。