Skip to content

Instantly share code, notes, and snippets.

@mattbell87
Last active December 12, 2024 15:09
Show Gist options
  • Save mattbell87/f5bd7b78c8d0ad7f0dfc3addae4f4897 to your computer and use it in GitHub Desktop.
Save mattbell87/f5bd7b78c8d0ad7f0dfc3addae4f4897 to your computer and use it in GitHub Desktop.
VSCode Remote: Connect to WSL2 from another machine

VSCode Remote: Connect to WSL2 from another machine

Do you want to do remote development on your WSL2 container in Visual Studio Code? Read this.

Proxy jump method

  1. On the host set up OpenSSH for Windows
  2. Run wsl --update to make sure you are running the latest WSL
  3. Open WSL and install another SSH server inside WSL with sudo apt-get install openssh-server
  4. Now run sudo systemctl enable --now ssh to automatically start ssh when WSL starts.
  5. On the remote machine run ssh -J windows_user@windows_ip wsl_user@localhost to see if the proxy jump will work

If you see the bash prompt it works. You can add it to the ~/.ssh/config file on the remote machine.

Host remote-wsl
  HostName localhost
  User wsl_user
  ProxyJump windows_user@windows_ip
  StrictHostKeyChecking no

Now connect with ssh remote-wsl.

Credit

ajihyf's comment

Default shell method

Change your OpenSSH shell

SSH to your Windows host (SSH Server must be installed in Windows Features)

ssh user@windowshost

Start Powershell

powershell

Run this command to switch SSH from CMD to WSL

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\WINDOWS\System32\bash.exe" -PropertyType String -Force

Test

ssh user@windowshost

You should now see WSL2 instead of CMD

Connect from VSCode

At this point you can connect to your Win10 host with Remote SSH in VSCode with your Windows username and pw. But you'll actually start and connect to WSL2.

  1. Install the Remote - SSH extension
  2. Add a new SSH target and connect with your Windows host, username and password (you will automatically log in as the Linux user)

Credit

The workaround was inspired by: https://www.hanselman.com/blog/the-easy-way-how-to-ssh-into-bash-and-wsl2-on-windows-10-from-an-external-machine

@sungkim11
Copy link

I came to a realization that the only way to do this reliably is via the use of third party services like Tailscale.

@okamototomoyuki
Copy link

I am being repeatedly prompted to enter a password in VSCode.
Each time I input it, the following message appears.
What can I do to resolve this issue?

[18:02:36.830] Got password response
[18:02:36.830] "install" wrote data to terminal: "**********"
[18:02:36.883] > 
> 
[18:02:37.446] > c87f957e6d36: running
> Acquiring lock on /home/MYUSER/.vscode-server/bin/784b0177c56c607789f9638da7b
> 6bf3230d47a8c/vscode-remote-lock.MYUSER.784b0177c56c607789f9638da7b6bf3230d47
> a8c
> Installation already in progress...
> If you continue to see this message, you can try toggling the remote.SSH.useFloc
> k setting
> c87f957e6d36: start
> exitCode==24==
> listeningOn====
> osReleaseId==ubuntu==
> arch==x86_64==
> tmpDir==/tmp==
> platform==linux==
> unpackResult====
> didLocalDownload==0==
> downloadTime====
> installTime====
> extInstallTime====
> serverStartTime====
> c87f957e6d36: end
> 
[18:02:37.446] Received install output: 
exitCode==24==
listeningOn====
osReleaseId==ubuntu==
arch==x86_64==
tmpDir==/tmp==
platform==linux==
unpackResult====
didLocalDownload==0==
downloadTime====
installTime====
extInstallTime====
serverStartTime====

[18:02:37.446] Server installation process already in progress - waiting and retrying
[18:02:37.765] "install" terminal command done
[18:02:37.766] Install terminal quit with output: 
[18:02:38.453] Running script with connection command: ssh -T -D 54675 "IPADDRESS" bash
[18:02:38.461] Terminal shell path: C:\Windows\System32\cmd.exe
[18:02:38.905] > 
[18:02:38.905] Got some output, clearing connection timeout
[18:02:39.470] > MYUSER@IPADDRESS's password:
[18:02:39.470] Showing password prompt

@okamototomoyuki
Copy link

[18:02:37.446] Server installation process already in progress - waiting and retrying
[18:02:37.765] "install" terminal command done
[18:02:37.766] Install terminal quit with output: 
[18:02:38.453] Running script with connection command: ssh -T -D 54675 "IPADDRESS" bash
[18:02:38.461] Terminal shell path: C:\Windows\System32\cmd.exe
[18:02:38.905] > 
[18:02:38.905] Got some output, clearing connection timeout
[18:02:39.470] > MYUSER@IPADDRESS's password:
[18:02:39.470] Showing password prompt

I apologize, this error was resolved by deleting the '.vscode-server' folder.
However, it does not work after the following command.
Does anyone know what the problem is?

[09:07:37.119] > scp: /home/MYUSER/.vscode-server/bin/784b0177c56c607789f9638da7b6bf3230d47a8c
> : No such file or directory
> 
[09:07:37.455] "Copy server to host" terminal command done
[09:07:38.464] > 
[09:07:41.399] > 
[09:07:44.481] > 
[09:07:47.551] > 
[09:07:50.622] > 
[09:07:53.402] > 

@astanziola
Copy link

Hi everyone! I've got all the tricks in place and I can open the wsl form remote.

By the way, if someone still gets the "Access is denied" problem when trying to open the wsl from an ssh session, this worked for me: microsoft/WSL#4920 (comment)

However, when I try to connect the remote extension it doesn't manage to connect to the remote machine. It connects instead if the default terminal is cmd or powershell, rather than wsl / bash.

Has anyone encountered a similar problem?

Interestingly, before connecting, the remote extension doesn't ask if the system is a Windows or Linux machine, so perhaps it assumes is Windows and then somehow fails because it finds another terminal?

@elfmimi
Copy link

elfmimi commented Mar 21, 2023

I'm not yet fully convinced myself, but you only need to change remote.SSH.remotePlatform for your Windows host to Linux.
What I mean is that you don't have to change DefaultShell .
Then Remote-SSH will recognize the situation and automatically launches wsl before making handshake with vscode-server.
Then Remote-SSH will connect to Windows host with something like ssh -t {hostname} bash . This will effectively launch wsl by executing C:\Windows\System32\bash.exe .
At least that it how I understand it. You may also need WSL extension installed, not sure.
You need either of wget or curl installed in your wsl env.

@jorlow
Copy link

jorlow commented Jul 13, 2023

I got access denied. Instead I just ran openssh within wsl2 on port 2222 and did this from within powershell.

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=127.0.0.1 connectport=2222

I then just ssh to port 2222 and it's forwarded to the wsl2 version of openssh.

@ajihyf
Copy link

ajihyf commented Nov 16, 2023

Latest WSL2 has systemctl support and can automatically map sshd's connection to the Windows host. No need to redirect port.

  1. Make sure Windows OpenSSH works.
  2. In windows, run wsl --update to make sure use latest WSL.
  3. In WSL, run sudo apt-get install openssh-server to install ssh and sudo systemctl enable --now ssh to automatically start ssh when WSL starts.
  4. Run ssh -J windows_user@windows_ip wsl_user@localhost to login to ssh
  5. If step 4 works, add the following content to .ssh/config
Host wsl
  HostName localhost
  User wsl_user
  ProxyJump windows_user@windows_ip
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
  1. Connect to wsl remote in VSCode πŸŽ‰πŸŽ‰πŸŽ‰

@flackend
Copy link

flackend commented Feb 28, 2024

Latest WSL2 has systemctl support and can automatically map sshd's connection to the Windows host. No need to redirect port.

  1. Make sure Windows OpenSSH works.
  2. In windows, run wsl --update to make sure use latest WSL.
  3. In WSL, run sudo apt-get install openssh-server to install ssh and sudo systemctl enable --now ssh to automatically start ssh when WSL starts.
  4. Run ssh -J windows_user@windows_ip wsl_user@localhost to login to ssh
  5. If step 4 works, add the following content to .ssh/config
Host wsl
  HostName localhost
  User wsl_user
  ProxyJump windows_user@windows_ip
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
  1. Connect to wsl remote in VSCode πŸŽ‰πŸŽ‰πŸŽ‰

This ☝️ ☝️ ☝️ ☝️ Thank you @ajihyf so much!

So much simpler than the other solutions out there.

@astiwana
Copy link

astiwana commented Mar 6, 2024

Thanks a lot, works perfectly!

@rakete1
Copy link

rakete1 commented Mar 22, 2024

Latest WSL2 has systemctl support and can automatically map sshd's connection to the Windows host. No need to redirect port.

  1. Make sure Windows OpenSSH works.
  2. In windows, run wsl --update to make sure use latest WSL.
  3. In WSL, run sudo apt-get install openssh-server to install ssh and sudo systemctl enable --now ssh to automatically start ssh when WSL starts.
  4. Run ssh -J windows_user@windows_ip wsl_user@localhost to login to ssh
  5. If step 4 works, add the following content to .ssh/config
Host wsl
  HostName localhost
  User wsl_user
  ProxyJump windows_user@windows_ip
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
  1. Connect to wsl remote in VSCode πŸŽ‰πŸŽ‰πŸŽ‰

This ☝️ ☝️ ☝️ ☝️ Thank you @ajihyf so much!

So much simpler than the other solutions out there.

Can confirm. This is working like a charm for me as well.

@sqsvp
Copy link

sqsvp commented Mar 22, 2024

How I proceed with connection to WSL2 on remote host.

  1. I've set up OpenSSH server on Windows remote host.
  2. From vscode on local machine i connected to remote Windows host.
  3. While connecting to remote host using SSH select Windows operating system.
  4. After succesful connection to remote Windows host press Ctrl-Shift-P on keyboard, write WSL in opened bar and select WSL: Connect to WSL using Distro in New Window...
  5. Distros of remote Windows host will be listed in dropdown menu.
  6. Select your distro in dropdown menu
  7. Connection to remote WSL distro will start in new window.

Result of connection to remote WSL through ssh

I think it's worth mentioning that I do not have Debian WSL distro on my local machine. This is WSL distro of remote Windows host.

@LRKasri
Copy link

LRKasri commented Apr 4, 2024

Latest WSL2 has systemctl support and can automatically map sshd's connection to the Windows host. No need to redirect port.

1. Make sure Windows OpenSSH works.

2. In windows, run `wsl --update` to make sure use latest WSL.

3. In WSL, run `sudo apt-get install openssh-server` to install ssh and  `sudo systemctl enable --now ssh` to automatically start ssh when WSL starts.

4. Run `ssh -J windows_user@windows_ip wsl_user@localhost` to login to ssh

5. If step 4 works, add the following content to `.ssh/config`
Host wsl
  HostName localhost
  User wsl_user
  ProxyJump windows_user@windows_ip
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
6. Connect to `wsl` remote in VSCode πŸŽ‰πŸŽ‰πŸŽ‰

This works so well for me, thanks a lot!!

@jhanschoo
Copy link

You don't necessarily need these things anymore. It's possible to use Remote-Tunnels together with the WSL extension on the remote.

@vbrozik
Copy link

vbrozik commented May 14, 2024

@jhanschoo I guess you are referring to VS Code. The solutions here show the generic approach which do not require you to use VS Code.

@jhanschoo
Copy link

Thanks, I nevertheless think it's important to note easy solutions when they exist that involve VSCode considering that the topic of the Gist is wrt VSCode. I'm personally aware of the more generic situations but don't use them due to the effort.

@lioujheyu
Copy link

IT in my company block vscode remote tunnel (by blocking all the msft remote tunnel servers) saying it evades proxy setting. Guess it is the same for many others so the generic way is still very relevant even for vscode

@jhanschoo
Copy link

jhanschoo commented Jul 26, 2024

Ironically, I've ended up mainly using the ProxyJump method today as well, because I have been making extensive use of an extension that launches a server and the extension on the client VSCode instance listens to localhost on the client environment. This works alright when

  1. The Remote-SSH extension is in use, connected to within WSL and ports are forwarded from WSL through the SSH connection, managed by the extension.
  2. The WSL extension is in use, and the ports are forwarded by WSL to the Windows host (despite showing stuff in the Ports pane, the WSL extension actually does not do any forwarding on its own).

But an issue is encountered when WSL-extension-in-Remote-SSH-extension (or Remote-Tunnels) is used, in which case

  • The server residing in WSL is exposed to the host Windows WSL automatically.
  • Requests made either to localhost on the client environment, or (iirc) to localhost on the host environment seem to fail to reach the WSL environment intermittently. This was observed by amateurish wireshark monitoring on all three environments. There seems to be a pattern that may be reproducible, but I did not pursue this further.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment