我能否在Visual Studio Code中的WSL上使用SSH?

30

我正在使用Windows 10上的WSL编程,最近发现可以通过SSH在VSCode中进行编辑。

但是,我通常通过WSL SSH到我的大学计算机,这样我就可以访问这些系统上的文件并使用它们的GPU。

有没有办法使用VSCode SSH进入WSL,然后SSH进入我的大学系统,并从VSCode中访问它们的资源和文件系统?


VSCode使用普通的ssh,因此如果您可以设置它从命令行工作,它应该可以在VSCode中工作。我不清楚您正在尝试做什么。您是想从主机Windows或另一台计算机ssh进入WSL吗?是否涉及第三台计算机?在哪台计算机上运行VSCode? - bitinerant
你不能直接从Windows SSH到你的大学系统,而不是通过WSL实例进行代理吗? - tHeSiD
9
我认为提问者已经使用WSL设置好了所有需要的SSH凭据,希望VSCode使用WSL内部的SSH而不是安装另一个SSH客户端。这也是我的首选 - 我通过SSH和SCP连接到大量客户端,需要在多个地方进行设置不是理想的选择。从WSL进行SSH是我的首选,因为它本质上是Linux,并为熟悉Linux的用户提供了许多改进的界面方面。 - SEoF
9个回答

21

您可以在Windows下创建ssh.bat文件,其内容如下:

C:\Windows\system32\wsl.exe ssh %*

然后设置VS Code的"remote.SSH.path"配置项指向那个批处理文件。
这样,你在VS Code中使用的ssh配置和凭据与WSL中相同。


如果在远程SSH输出中出现“/bin/sh: ssh: not found”错误,则问题可能是您的WSL安装没有配置默认发行版。可以通过在Windows终端中执行“wsl --setdefault ubuntu-20.04”来解决此问题。 - leopold.talirz
你可以在WSL终端中使用一行命令来完成这个操作:echo -e "C:\Windows\system32\wsl.exe bash -ic 'ssh %*'" >> /mnt/c/Users/$USER/.ssh/ssh.bat - undefined
使用这个包装脚本时,我偶尔会遇到这个错误:Failed to set up socket for dynamic port forward to remote port <port>: connect ECONNREFUSED 127.0.0.1:<port>. Is the remote port correct? 但奇怪的是,第一个<port>与第二个<port>不同。我能够登录,但当我尝试打开一个文件夹时它就卡住了。 - undefined

6

如果在ssh.bat文件中编写C:\Windows\system32\wsl.exe ssh %*大多数情况下可以正常工作,但出现~/.bashrc未被调用的问题,请将该命令替换为:

C:\Windows\system32\wsl.exe bash -ic 'ssh %*'

这个调整可以在交互式的bash shell中运行ssh命令,并且会使用你的~/.bashrc。使用上述方法可以解决我在VSCode远程终端中遇到的Ubuntu ssh-agent无法转发密钥的问题。

4

要从在VScode中运行的WSL连接到Linux机器,我执行了以下操作:

Host <your_host>
    HostName <your_host>
    User <your_username>
    IdentityFile C:\Users\<your_username>\.ssh\<your_private_key>

  • 将 <your_private_key> 从 WSL 复制到 Windows。在 WSL 终端中,默认路径为:
cp /home/<your_wsl_username>/.ssh/<your_private_key> /mnt/c/Users/<your_windows_username>/.ssh

在VScode中,按下F1并选择:Remote-SSH:connect to host,然后选择您的远程服务器。

1
这需要保留文件的2个副本:/ - Joseph Garvin

1

我发现这篇文章对我很有用,可以让我使用VSCode通过ssh连接到远程主机,在Windows 10中使用wsl ubuntu的ssh配置。

https://zitseng.com/archives/20325

作为我使用的是受口令保护的密钥,我还需要启用ssh代理并将其添加到密钥中才能使其正常工作。
更新:不幸的是,WSL的ssh服务不会自动启动,我必须添加另一个.bat文件,如此处所述https://superuser.com/a/1506722/239839
除此之外,我仍然需要先打开WSL控制台,使用ssh-add mykey,然后执行第一次ssh连接到主机。如果我不这样做,就会一直被要求输入ssh密钥的密码。
最好的祝愿

1
如果您可以从WSL SSH进入您的大学系统,我认为您可以直接从Windows系统进行SSH操作。在这种情况下,您可以设置VS Code Remote SSH,从Windows直接访问您的大学系统。因此,我使用了Git Bash终端,它支持从Windows OS中直接执行所有Linux命令。
第一步:设置您的SSH访问权限(无需密码或有密码)到您的大学系统。您可以参考在线文章,我假设您已经知道如何从WSL内部完成这个步骤。
第二步:安装本地机器上的VS Code扩展中的远程开发包。
第三步:转到VS Code设置,展开扩展下拉菜单并选择“Remote-SSH”。在设置页面上,将“Remote - SSH:Config File”设置为ssh配置文件,您将在其中存储远程系统详细信息。例如:~\vscode.ssh还选择'始终显示SSH终端'的复选框。
第四步:像以下示例一样向文件~\vscode.ssh添加远程系统详细信息:
Host <hostname>
    User <ID for SSH login> # e.g. your university ID
    HostName <full qualified address for your remote system> # e.g. system.subnet.university.edu
    IdentityFile <your SSH pvt key> #e.g. ~/.ssh/id_rsa

步骤5: 在左侧导航栏中选择“Remote Explorer”,然后从下拉菜单中选择“SSH Targets”。您的主机名应在此处显示。右键单击并连接到主机。

步骤6: 如果提取tar文件时有任何失败,请仔细观察来自VSCode终端日志的第一次连接尝试的日志。

默认情况下,VS Code会在远程系统的主目录中安装vscode-server,这可能会因为您的大学空间限制而导致空间不足。您需要将vscode-server目录移动到一个没有空间限制的工作区域,通常是项目区域。请使用以下步骤执行此操作,我为我的组织创建了这些步骤:

一旦您启动了VSCode远程,连接可能会成功或失败,具体取决于远程主目录中的可用空间,因为默认情况下,VSCode会在主目录中设置您的远程服务器,并且无法更改。

  1. If success, still move vscode-server to another large free space directory:

    a. Navigate to a desired project space directory from remote desktop terminal
    b. mv ~/.vscode-server /your/big/disk/project/space
    c. ln -s  /your/big/disk/project/space/.vscode-server ~/.vscode-server
    d. Use full absolute paths in previous command to avoid cyclic links. Confirm with below command, it shoud not return anything.
        $ find -L ./ -mindepth 15
    e. Reconnect from your VSCode again
    
  2. If failed, manually setup vscode-server on remote large free space directory:

    a. Get vscode-server commit ID on remote server using below command, which would be like 'e2d4cc38bb5da82wb67q86fd50f84h67bb340987'
        $ ls ~/.vscode-server/bin
    b. Download tarball replacing $COMMIT_ID with the the commit number from the previous step on local system: https://update.code.visualstudio.com/commit:$COMMIT_ID/server-linux-x64/stable
    c. Move tarball to remote server disk from local system:
        $ scp -P 22 vscode-server-linux-x64.tar.gz remoteID.remote.system.url.com:~/
    d. Move tarball to large free space directory as below:
        $ mkdir -p /your/big/disk/project/space/.vscode-server/bin/$COMMIT_ID/
        $ mv ~/vscode-server-linux-x64.tar.gz /your/big/disk/project/space/.vscode-server/bin/$COMMIT_ID/
    e. Extract tarball in this directory
        $ cd /your/big/disk/project/space/.vscode-server/bin/$COMMIT_ID
        $ tar -xvzf vscode-server-linux-x64.tar.gz --strip-components 1
    f. Create symlink of .vscode-server in your home directory
        $ ln -s  /your/big/disk/project/space/.vscode-server ~/.vscode-server
    g. Connect again
    

0
如果你想通过WSL设置SSH远程连接,目前可能还不可行。但是,你可以设置WSL远程连接(https://code.visualstudio.com/docs/remote/wsl-tutorial)和SSH远程连接(https://code.visualstudio.com/docs/remote/ssh-tutorial)。
这里的缺点是,你的WSL使用自己独立的SSH命令,与VSCode使用的SSH命令不同,并且两者默认使用不同的配置文件。虽然你可以指定VSCode使用WSL的SSH命令所用的SSH配置文件,但由于可能存在不同版本和冲突问题,以及在WSL存储中从WSL外部编辑文件的问题(我会尝试找到相关参考),因此这种做法是不建议的。

0
在您选择的 .bat 文件中,编写 C:\Windows\system32\wsl.exe ssh %* 在 VSCode 配置中,将 remote.ssh.path 更改为步骤 1 中创建的文件路径,例如 c:\Users\goyuninfo\ssh.bat 找到您的 WSL SSH 配置文件,假设为 ~/.ssh/config 获取该文件的 Windows 路径,假设为 \wsl$\Ubuntu-20.04\home<username>.ssh\config 将 remote.SSH.configFile 更改为步骤 4 中找到的路径。 输入链接说明

我尝试了你的解决方案,但不幸的是我不能将我的Remote.SSH.configFile留空,因为openSSH要求我选择一个配置文件。所以我尝试了你的第二种方法。但由于设置是在JSON中,我必须转义我的文件路径,这导致我的wsl.exe找不到路径。 - TijnvdEijnde

0

Hazzard17提供的答案对我不再起作用了。我认为问题出在VSCode和输入密码上。我使用sshpass解决了这个问题。

安装:

sudo apt-get install sshpass

SSH.远程.路径 文件内容

C:\Windows\system32\wsl.exe sshpass -p <password> ssh %*

注意:我找不到在VSCode中输入密码的方法,所以我将密码硬编码到文件中(这意味着您每次都必须更改密码)。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接